ES6 class继承经Babel编译为ES5时生成重复辅助函数,增大体积;启用@babel/plugin-transform-runtime可复用@babel/runtime中的_inherits等函数,配合精准targets配置(如Chrome 80+)可跳过不必要的继承转译。

ES6 的 class 继承(如 extends)被 Babel 编译为 ES5 时,会生成一套组合寄生式继承逻辑,包含 _inherits、_createSuper、_getPrototypeOf 等辅助函数。这些函数在每个用到继承的类中反复内联,导致代码体积明显上升——尤其在中大型项目中,可能多出数 KB 甚至十几 KB 的冗余代码。
启用 @babel/plugin-transform-runtime 替代内联辅助函数
默认情况下,Babel 把所有辅助函数(如继承相关逻辑)直接插入每个使用处,造成重复。改用 @babel/plugin-transform-runtime 可让它们统一从 @babel/runtime 模块导入,实现复用:
- 安装运行时依赖:
npm install --save @babel/runtime - 安装插件(开发依赖):
npm install --save-dev @babel/plugin-transform-runtime - 在
babel.config.js或.babelrc中配置插件,并关闭自动注入(避免与 preset-env 冲突):
{"plugins": [["@babel/plugin-transform-runtime", {"corejs": false}]]}
注意:若项目需兼容 Promise、Array.from 等全局 API,应额外引入 core-js 并设 corejs: 3,但继承逻辑本身不依赖它。
确保使用 @babel/preset-env 的 targets 精准控制转译粒度
盲目转译所有 ES6+ 特性会触发更多辅助函数生成。通过 targets 明确目标环境,可减少不必要的继承降级:
- 例如只支持 Chrome 80+、Safari 14+、Edge 88+ 等现代浏览器时,
class和extends基本可原生运行,Babel 将跳过继承转译 - 配置示例:
{"presets": [["@babel/preset-env", {"targets": {"chrome": "80", "safari": "14", "edge": "88"}}]]} - 配合
useBuiltIns: 'usage'和corejs: 3,还能按需注入 polyfill,避免全量加载
避免混用 babel-polyfill 或 @babel/polyfill
babel-polyfill(已废弃)或旧版 @babel/polyfill 会全局污染环境并强制引入大量垫片,间接促使 Babel 更激进地展开语法转换(包括继承结构)。应彻底移除:
- 删除
import 'babel-polyfill'或require('@babel/polyfill') - 卸载包:
npm uninstall babel-polyfill @babel/polyfill - 改用
@babel/runtime+@babel/plugin-transform-runtime的按需方案,更轻量可控
检查是否误启了 legacy decorators 或 proposal-class-properties
某些装饰器提案(如 @babel/plugin-proposal-decorators 配合 legacy: true)或旧版类属性插件,会干扰 class 编译流程,导致继承逻辑被重写为更复杂的寄生模式。确认仅启用必要插件:
- 若无需装饰器,直接不配相关插件
- 若需,使用最新标准模式:
{"plugins": ["@babel/plugin-proposal-decorators", {"version": "2023-05"}]} - 类字段(
class A { x = 1 })推荐用@babel/plugin-proposal-class-properties(非 legacy 模式)


















