语法错误到不了运行时,API 缺失却能现场补:polyfill 是「补环境」的碎片——core-js 提供一份 Promise、Array.includes、Object.assign 等新 API 的实现,在全局/原型上挂上,代码就能像现代浏览器一样跑。与 Babel 转换的分工:Babel 转语法(箭头函数、可选链),polyfill 补 API(includes、assign)。
最佳实践是按需引入:useBuiltIns: 'usage' 配合 browserslist,按目标浏览器和代码实际用到的 API 自动引入最小集合,而不是全量 core-js(100KB+)。按业务确定 browserslist(比如覆盖 95% 流量),在兼容范围与产物体积间取平衡。
// 没有垫片的老浏览器: [1, 2].includes(1); // ✗ TypeError: includes is not a function new Promise(() => {}); // ✗ Promise is not defined // 全量引入 core-js(简单但产物大) // import 'core-js'; // ~100KB // 按需引入:只在用到的地方补 import 'core-js/features/array/includes'; // 只补 includes import 'core-js/features/promise'; // 只补 Promise // 现代方案:preset-env usage 模式自动完成上面两行 { "presets": [["@babel/preset-env", { "useBuiltIns": "usage", // 按代码使用情况自动按需引入 "corejs": 3 }]] } // browserslist(package.json) // "browserslist": ["> 1%", "last 2 versions", "not dead"]