SWC配置了minify但打包后的JS文件没有被压缩,怎么办?
在Vue项目里用SWC替换了Babel后,按文档配置了minify: true,但打包后的JS文件看起来完全没压缩,连注释都没删。之前用terser的时候没问题,现在换成SWC就失效了…
我的配置是这样的:
module.exports = {
chainWebpack: config => {
config.module
.rule('js')
.use('swc-loader')
.loader('swc-loader')
.tap(options => {
return {
...options,
minify: true,
jsc: {
minify: {
compress: true,
removeConsole: true
}
}
}
})
}
}
执行vue-cli-service build后,发现生成的app.js里还保留着函数参数的类型注解和console.log语句。是不是配置位置不对?或者需要额外的插件支持?
minify开关本身,而是 Vue CLI 的 SWC 配置方式跟原生 SWC 不一样,你这样写根本没生效。关键点在于:Vue CLI 底层是通过
@vue/cli-plugin-typescript和@swc/core封装的,它不会直接吃你chainWebpack里塞进来的minify结构——特别是你把minify写在jsc里,这其实是原生 SWC 配置格式,但 Vue CLI 并没按这个结构透传。正确做法是:在根目录加一个
.swcrc文件,或者在vue.config.js里用pluginOptions的特定字段。我给你两个能跑通的方案:
第一个,也是最稳妥的——直接建个
.swcrc文件在项目根目录:注意
dropConsole是 SWC 的字段名,不是removeConsole;compress里默认会删掉类型注解,所以你看到的类型注解还在,说明压根没进 minify 流程。第二个,如果你坚持要在
vue.config.js里配(比如 CI 环境不想多加配置文件),得这么写:这里要注意几个坑:
-
compress下要用drop_console而不是dropConsole(SWC 用 snake_case)-
minify必须是pluginOptions.swc下的顶层字段,不是塞在 loader 里- Vue CLI 4 和 5 行为还不太一样,如果是 Vue 3 + CLI 5,建议优先用
.swcrc另外确认下你有没有装
@swc/core(不是@swc/cli),npm ls @swc/core看一眼,有时候换源装错包也会导致 fallback 回 Babel 但没报错,看起来像“配置没生效”。配完记得删掉
node_modules/.cache再build,Vue 的缓存有时候贼顽固。另外确保生产环境才启用,removeConsole这些功能得自己写插件或者用babel插件配合。