babel 优化可减少10%~30%无效字节:明确 targets 避免冗余转译;用 @babel/plugin-transform-runtime 替代 inline 辅助函数,减冗余40%+;按 node_env 区分插件;排除 node_modules 中已编译依赖。

Babel 本身不压缩代码,但它的配置方式会直接影响输出体积——尤其是辅助函数重复注入、未用语法保留、冗余 polyfill 注入这三类问题。微调几处关键配置,就能让最终 bundle 少掉 10%~30% 的无效字节。
关闭不必要的语法转译,按需启用 preset-env
@babel/preset-env 默认行为是“安全优先”,可能把本不需要转译的语法也展开(比如 Chrome 90+ 已原生支持 ?. 和 ??,但没配 targets 就会强行转成 if-else)。
正确做法是明确声明目标环境,让 Babel 跳过已支持特性:
- 在
.browserslistrc中写清楚:chrome >= 87 safari >= 14 edge >= 90
- 或在
babel.config.js的targets字段里内联声明:presets: [ ['@babel/preset-env', { targets: { chrome: '87' } }] ]
这样 class、async/await、optional chaining 等现代语法在满足条件时直接保留,不生成额外辅助代码。
用 @babel/plugin-transform-runtime 替代 inline 辅助函数
默认情况下,Babel 每个含 class 或 extends 的文件都会在顶部插入一模一样的 _classCallCheck、_inherits 等函数,大量重复。
启用该插件后:
- 所有辅助函数统一从
@babel/runtime导入,只打包一份 - 不污染全局作用域(区别于
@babel/polyfill) - 需要安装两个包:
npm install --save-dev @babel/plugin-transform-runtime npm install @babel/runtime
- 配置插件(无需额外选项,默认即可):
"plugins": ["@babel/plugin-transform-runtime"]
效果:一个中型项目开启后,辅助函数相关冗余代码通常减少 40% 以上。
禁用开发专用插件,区分环境配置
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
有些插件只为调试服务,比如 @babel/plugin-transform-react-jsx-development 或 @babel/plugin-proposal-class-properties 的 loose 模式调试版,在生产构建中必须关掉。
推荐方式是按 NODE_ENV 分环境配置:
// babel.config.js
module.exports = (api) => {
api.cache(true);
const isProd = api.env('production');
return {
presets: [['@babel/preset-env', { modules: isProd ? false : 'auto' }]],
plugins: isProd
? ['@babel/plugin-transform-runtime']
: ['@babel/plugin-transform-react-jsx', { development: true }]
};
};
特别注意 modules: false:Webpack 生产模式下启用 Tree Shaking,必须保留 ES Module 语法,否则 import/export 被转成 commonjs 后无法摇掉死代码。
排除 node_modules 中已编译的依赖
第三方库(如 lodash-es、date-fns)多数已发布 ES 模块格式,Babel 再跑一遍纯属浪费,还可能引入冗余 helper。
确保 babel-loader 严格限制范围:
{
test: /\.(js|jsx)$/,
exclude: /node_modules/, // 必须显式写出
include: path.resolve(__dirname, 'src'),
use: { loader: 'babel-loader' }
}
若某些模块确实需要转译(如内部 monorepo 的未编译包),用 include 单独加白名单,而非 exclude 放宽。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










