SWC配置了minify但打包后的JS文件没有被压缩,怎么办?

Mc.艳兵 阅读 79

在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语句。是不是配置位置不对?或者需要额外的插件支持?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
❤倚凡
❤倚凡 Lv1
当时我也卡在这,折腾了一下午才发现问题根本不在 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 文件在项目根目录:

{
"jsc": {
"minify": {
"compress": true,
"dropConsole": true,
"mangle": {
"props": {
"regex": "^_"
}
}
}
},
"minify": true
}


注意 dropConsole 是 SWC 的字段名,不是 removeConsolecompress 里默认会删掉类型注解,所以你看到的类型注解还在,说明压根没进 minify 流程。

第二个,如果你坚持要在 vue.config.js 里配(比如 CI 环境不想多加配置文件),得这么写:

module.exports = {
configureWebpack: {
optimization: {
minimize: true
}
},
pluginOptions: {
swc: {
minify: true,
jsc: {
minify: {
compress: {
drop_console: true
},
mangle: {
props: {
regex: '^_'
}
}
}
}
}
}
}


这里要注意几个坑:
- 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/.cachebuild,Vue 的缓存有时候贼顽固。
点赞 3
2026-02-25 09:03
司马爱红
你这个问题出在配置层级搞错了。swc的minify要放在jsc.minify下面,而且得用@swc/core而不是swc-loader处理压缩。改成这样:

module.exports = {
chainWebpack: config => {
config.module
.rule('js')
.use('swc-loader')
.loader('swc-loader')
.tap(options => {
return {
jsc: {
minify: {
compress: true,
mangle: true,
},
externalHelpers: true,
},
minify: true
}
})
}
}


另外确保生产环境才启用,removeConsole这些功能得自己写插件或者用babel插件配合。
点赞 10
2026-02-11 23:03