![](/img/trans.png)
[英]vue.config.js in Vue CLI, what else is there to change other than configureWebpack?
[英]Why does changing configureWebpack in vue.config.js to use an arrow function instead of an object break the configuration?
我有以下vue.config.js
文件:
const fs = require('fs');
const util = require('util');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
const path = require('path');
const vtkChainWebpack = require('vtk.js/Utilities/config/chainWebpack');
const packageJson = require('./package.json');
const stat = util.promisify(fs.stat);
module.exports = {
devServer: {
port: 8081,
public: process.env.PUBLIC_ADDRESS,
},
lintOnSave: false,
publicPath: process.env.VUE_APP_STATIC_PATH,
configureWebpack: {
devtool: 'eval-source-map',
plugins: [
new CopyPlugin({
patterns: [
{
from: path.join(__dirname, 'node_modules', 'itk'),
to: 'itk',
filter: async (resourcePath) => {
const resourceStats = await stat(resourcePath);
const resourceSize = resourceStats.size;
return resourceSize <= (25 * 1024 * 1024);
},
},
],
}),
new webpack.DefinePlugin({
'process.env': {
VERSION: JSON.stringify(packageJson.version),
},
}),
],
performance: {
maxEntrypointSize: 4000000,
maxAssetSize: 40000000,
},
},
chainWebpack: (config) => {
vtkChainWebpack(config);
},
};
它为configureWebpack
提供了一个 object 。 我尝试将其更改为使用箭头 function ,如下所示:
configureWebpack: config => {
config.devtool = 'eval-source-map';
config.plugins = [
new CopyPlugin({
patterns: [
{
from: path.join(__dirname, 'node_modules', 'itk'),
to: 'itk',
filter: async (resourcePath) => {
const resourceStats = await stat(resourcePath);
const resourceSize = resourceStats.size;
return resourceSize <= (25 * 1024 * 1024);
},
},
],
}),
new webpack.DefinePlugin({
'process.env': {
VERSION: JSON.stringify(packageJson.version),
},
}),
];
config.performance = {
maxEntrypointSize: 4000000,
maxAssetSize: 40000000,
};
},
chainWebpack: (config) => {
vtkChainWebpack(config);
},
};
当我运行npm run serve
(与vue-cli-service serve
相同)时,它启动 webpack 但似乎无限期挂起,而没有显示任何有关捆绑的常见消息。
如果我最终尝试访问该站点,则会引发一个错误,即无法解析 favicon.ico 的参数。 我错过了什么? 谢谢!
为了回答您的问题,我使用了您的代码并尝试查看有什么问题,首先不要忘记vue.config.js
是一个 object ,它将使用webpack-merge
合并到最终的webpack
配置中。
因此,当您执行config.plugins = []
时,您尝试使用他的默认配置覆盖webpack
的plugins
数组,例如
VueLoaderPlugin
CaseSensitivePathsPlugin
FriendlyErrorsWebpackPlugin
等...
因此,当您这样做时,它们不再存在,因此检测路径的loader
会理解vue
文件,并且所有这些都消失了,这就是您收到错误的原因。
记住您选择使用configureWebpack
作为 function 您现在需要将插件键视为一个array
并将您的新插件推入其中或通过搜索所需的插件直接覆盖所需的插件如果它不适合您想
使用您的配置的示例:
configureWebpack: config => {
console.log("configureWebpack", config.plugins)
config.plugins.push(
new webpack.DefinePlugin({
'process.env': {
VERSION: JSON.stringify(packageJson.version),
},
}),
)
}
或者
configureWebpack: config => {
console.log("configureWebpack", config.plugins)
config.plugins = [
...config.plugins,
new webpack.DefinePlugin({
'process.env': {
VERSION: JSON.stringify(packageJson.version),
},
}),
]
}
问题的第二部分,也许我错了
在您的new CopyPlugin
中,您似乎正在复制一个名为itk
的插件,我猜它等于vtk
吗? 也许是拼写错误或拼写错误,所以当我尝试将其更改为:
new CopyPlugin({
patterns: [
{
from: path.join(__dirname, 'node_modules', 'vtk.js'),
to: 'vtk',
filter: async (resourcePath) => {
const resourceStats = await stat(resourcePath);
const resourceSize = resourceStats.size;
return resourceSize <= (25 * 1024 * 1024);
},
},
],
}),
它工作得很好!
箭头函数与匿名 function 不同。 箭头 function 绑定到它们所在的 scope。对于大多数用例,更改匿名 function 很好,并且会按预期工作,但并非总是如此。 我的猜测是CopyPlugin
或DefinePlugin
期望 scope 中的某些东西不在箭头 function 所绑定的 scope 中。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.