减小 core-js 打包体积的关键是配置 useBuiltIns: "usage" 并指定 corejs: 3 和精准 browserslist;需避免手动引入 core-js,且注意第三方库兼容性;可配合 modules: false 和 @babel/plugin-transform-runtime 进一步优化。

要减小 core-js 的打包体积,关键在于让 Babel 只引入当前代码真正需要的 polyfill,而不是全量加载。核心就是正确配置 useBuiltIns 属性,并配合 corejs 版本和浏览器目标(targets)。
useBuiltIns: "usage" —— 按需注入最精简的 polyfill
这是优化体积最有效的方式。Babel 会扫描你的源码,识别出用了哪些新 API(如 Array.prototype.includes、Promise.allSettled),再根据你声明的浏览器支持范围(browserslist),只引入缺失环境所需的 core-js 模块。
- 必须指定
corejs: 3(推荐),因为 core-js@3 支持实例方法(如[].includes)、静态方法(如Promise.any)和全局对象的完整 polyfill;core-js@2 不处理多数实例方法 - 确保项目中没有手动
import 'core-js'或import 'core-js/stable',否则会干扰usage模式,导致冗余引入 - 注意:它默认不处理
node_modules中的代码,所以如果第三方库用了新 API 且未做兼容,可能仍需额外处理(比如用useBuiltIns: "entry"+ 入口统一引入,或配合@babel/plugin-transform-runtime)
useBuiltIns: "entry" —— 适合统一控制、兼顾依赖兼容
如果你在入口文件(如 index.js)显式写了 import 'core-js/stable'; import 'regenerator-runtime/runtime';,启用 "entry" 后,Babel 会把这两行替换成仅针对目标浏览器缺失功能的模块导入。
- 比
"usage"更“保守”,能覆盖部分未被静态分析识别的动态用法(比如通过字符串调用的方法) - 需要你主动维护入口的 polyfill 引入,但对依赖包中使用的现代 API 更友好
- 同样依赖
corejs: 3和准确的browserslist配置,否则可能多打或少打
浏览器目标必须明确且合理
useBuiltIns 的效果直接受 browserslist 控制。Babel 依据它判断哪些 API 需要垫平。不要依赖默认值(>0.5%, last 2 versions, Firefox ESR, not dead),应显式声明:
立即学习“Java免费学习笔记(深入)”;
- 在
package.json中加:"browserslist": [">0.2%, not IE 11, not OperaMini all"] - 或建
.browserslistrc文件,内容同上 - 避免写过宽的范围(如
IE 11),否则会强制引入大量旧版 polyfill,显著增大体积
配套建议:关闭模块转换,启用 runtime 提升复用性
为了进一步减少重复代码和体积,建议组合使用:
-
modules: false(保持 ES module 格式),让 webpack 能正常做 tree-shaking 和 code-splitting - 添加
@babel/plugin-transform-runtime,把语法辅助函数(如_classCallCheck)从内联抽成统一引用@babel/runtime,避免每个文件都打一份 - 注意:
transform-runtime和useBuiltIns解决不同问题——前者管语法转换辅助,后者管全局/实例 API 垫平,二者可共存


















