babel plugin-transform-runtime 配置和编译结果差异
准备源代码
1 | // module.js |
配置 1 : 仅使用 @babel/env
1 | { |
编译结果 1
1 | // module.js |
从结果来看,module.js 和 index.js 都从 core-js 引入了自身需要的 polyfill (全局变量),针对 async/await 分别生成了同样的 asyncGeneratorStep 和 _asyncToGenerator
配置 2 : 使用 @babel/env 和 @babel/plugin-transform-runtime (默认配置)
1 | { |
编译结果 2
1 | // module.js |
添加 @babel/plugin-transform-runtime 后,对于 async/await 不再重复生成 asyncGeneratorStep 和 _asyncToGenerator,改为从 @babel/runtime 中引入, 其余 polyfill 依然从 core-js 引入
配置 3 使用 @babel/env 和 @babel/plugin-transform-runtime (配置 corejs, 需要安装 @babel/runtime-corejs3 依赖)
1 | { |
编译结果 3
1 | // module.js |
@babel/plugin-transform-runtime 添加配置 corejs: 3 后,所有的 polyfill 都改为从 @babel/runtime-corejs3 导入,同时由全局覆盖变为了局部变量,不会污染全局
结论:
@babel/presets 的 『”useBuiltIns”: “usage”』会引入模块中需要的 polyfill 并且是全局覆盖的,但是每个模块都会重复生成辅助函数
添加插件 『@babel/plugin-transform-runtime』 后,辅助函数不会在每个模块中重复生成,而是从 『@babel/runtime』引入
@babel/plugin-transform-runtime 进一步配置 『 “corejs”: 3 』后,所有的 polyfill 都从 『@babel/runtime-corejs3』引入,并且是局部变量,不会污染全局
babel plugin-transform-runtime 配置和编译结果差异
https://downhill6.pages.dev/2021/08/04/plugin-transform-runtime 配置和编译结果差异/