Vue CLI 5执行vue build时Terser Plugin未运行
问题现象
生产环境构建时配置的Terser Plugin未正常运行,输出代码未经过压缩、混淆,将devtool改为hidden-source-map后问题仍存在。
当前环境依赖版本:
- terser-webpack-plugin@^5.3.3
- @vue/cli@5.0.7
配置中isProd变量可正确判定生产环境(值为true),原有配置如下:
const TerserPlugin = require('terser-webpack-plugin'); const isProd = process.env.NODE_ENV === 'production'; module.exports = { publicPath: '/', devServer: { host: 'staging-beta.myDomain.com', port: 9000, allowedHosts: 'all', }, transpileDependencies: ['vuetify'], chainWebpack: (config) => { // reducted code }, configureWebpack: { devtool: 'source-map', optimization: { minimize: isProd, minimizer: isProd ? [ new TerserPlugin({ minify: TerserPlugin.uglifyJsMinify, terserOptions: { compress: { drop_console: true, }, output: { comments: false, }, }, }), ] : [], }, }, };
故障原因
- 配置中指定
minify: TerserPlugin.uglifyJsMinify时,terser-webpack-plugin 5.x版本不会自动安装uglify-js依赖,缺失依赖时压缩流程会静默跳过,无明确报错。且uglify-js本身不支持ES6+语法,项目中引入的vuetify等依赖输出的ES6+代码会直接导致压缩失败。 - 直接以对象形式在
configureWebpack中覆写optimization.minimizer数组,会和Vue CLI 5内置的webpack优化配置产生合并冲突,自定义的插件实例无法被正常加入构建执行流程。 - 新版terser的输出配置字段为
format,原有配置写为output属于无效配置,即使插件运行也无法达到移除注释的预期效果。
修复方案
- 优先使用terser作为压缩工具(terser-webpack-plugin默认内置,无需额外安装,原生支持ES6+语法,适配Vue项目绝大多数场景),不需要手动引入
uglify-js。 - 不要重新实例化TerserPlugin覆盖minimizer数组,通过
chainWebpack直接修改Vue CLI内置的TerserPlugin配置,避免配置合并冲突,修正后的配置参考:
const isProd = process.env.NODE_ENV === 'production'; module.exports = { publicPath: '/', devServer: { host: 'staging-beta.myDomain.com', port: 9000, allowedHosts: 'all', }, transpileDependencies: ['vuetify'], chainWebpack: (config) => { // 原有其他chainWebpack逻辑保留 if (isProd) { config.optimization.minimizer('terser').tap((args) => { args[0].terserOptions = { compress: { drop_console: true, }, format: { comments: false, } }; return args; }); } }, configureWebpack: (config) => { config.devtool = isProd ? 'source-map' : 'eval-cheap-module-source-map'; config.optimization.minimize = isProd; }, };
- 若因特殊需求必须使用uglify-js压缩,需先执行
npm install uglify-js --save-dev安装依赖,同时将所有包含ES6+语法的依赖(包括vuetify)加入transpileDependencies做ES5转译,再在上述chainWebpack的terser配置中增加args[0].minify = TerserPlugin.uglifyJsMinify;即可。
注意:uglify-js对ES6+语法无兼容支持,除非项目所有代码均为ES5,否则不推荐使用
内容的提问来源于stack exchange,提问作者Constantinos N
相关产品推荐
相关产品推荐

