使用@babel/plugin-transform-runtime可避免辅助函数重复注入,其原理是将各文件中内联的_helper(如_classCallCheck)替换为统一从@babel/runtime导入的调用,从而减小包体积并利于tree-shaking。

用 @babel/plugin-transform-runtime 防止辅助函数重复注入,核心是把每个文件里内联的 helper(比如 _classCallCheck、_defineProperties)替换成统一从 @babel/runtime 中 import 的调用。这样既减小包体积,又利于 tree-shaking。
为什么辅助函数会重复?
Babel 在转换 class、async、解构等语法时,需要插入一些运行时辅助函数。默认情况下,这些函数会直接写进每个编译后的 JS 文件顶部——哪怕 100 个文件都用了 class,就会有 100 份一模一样的 _classCallCheck 声明。
怎么配置 plugin-transform-runtime?
先装依赖:
npm install --save-dev @babel/plugin-transform-runtime-
npm install --save @babel/runtime(注意:是 生产依赖,不是 dev)
然后在 .babelrc 或 babel.config.json 中启用插件:
立即学习“Java免费学习笔记(深入)”;
{
"presets": ["@babel/env"],
"plugins": [
["@babel/plugin-transform-runtime", {
"helpers": true,
"corejs": false,
"regenerator": true
}]
]
}
关键点: "helpers": true 是默认值,但显式写出更清晰;它控制是否把内联 helper 替换为 @babel/runtime/helpers 的 import。
效果对比示例
原始代码:
class Person { say() { return 'hi'; } }
const p = new Person();
不启用插件时,输出里含重复声明:
function _classCallCheck(instance, Constructor) { ... }
function _defineProperties(...) { ... }
var Person = function () { ... }();
启用后,输出变成:
import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _defineProperties from "@babel/runtime/helpers/defineProperties"; // 后续代码直接调用 _classCallCheck(...),不再重复定义
顺便解决全局污染问题(可选)
如果还希望避免 Promise、Array.from 等 API 的全局补丁污染(比如覆盖原生 Promise),可以开启 corejs:
- 安装:
npm install --save @babel/runtime-corejs3 - 配置:
"corejs": 3(注意:此时@babel/runtime不再需要,改用@babel/runtime-corejs3) - 效果:生成
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise",而非修改全局Promise
这个选项和 helper 抽离是正交的,可以单独开或关。


















