服务端阅读 05月29日 23:47
如何优化 Babel 编译性能?哪些配置最有效?
优化 Babel 编译性能,优先做三件事:少编译、用缓存、少插件。少编译就是用 include 精准限定源码目录,不要把整个 node_modules 丢给 Babel;用缓存就是开启 babel-loader 的 cacheDirectory 和配置层的 api.cache(true);少插件就是只保留必要转换,能交给 esbuild/SWC 的纯语法转换就别强行走 Babel。再往下才是 targets、polyfill 和并行。@babel/preset-env 的 targets 越准确,Babel 做的无用转换越少;useBuiltIns: 'usage' 可以减少 polyfill 体积;大型 Webpack 项目可配合 thread-loader,但小项目并行成本可能比收益还高。追问为什么 include 往往比 exclude 更稳?exclude 容易漏掉特殊目录,include 是白名单,只编译明确需要处理的源码和少数第三方包,性能和可控性都更好。cacheDirectory 能解决什么问题?它会缓存 babel-loader 的转换结果,二次构建只处理变更文件。开发环境收益最大,常能把重复编译时间降很多。targets 配错会怎样?目标浏览器写得太旧,Babel 会做大量降级和 polyfill;写得太新,旧环境可能跑不起来。性能优化不能牺牲兼容性。什么时候用 SWC 或 esbuild 替代 Babel?如果只是 JSX、TS 或 ES 语法转换,SWC/esbuild 更快。如果依赖 Babel 插件生态,比如自定义 AST 插件,仍然要用 Babel。写段代码module.exports = api => { api.cache(true); return { presets: [['@babel/preset-env', { targets: '>0.5%, not dead', modules: false }]] };};