polyfill 与 browserslist
Babel 只转“语法”,不转“API”:旧浏览器没有 Array.prototype.includes、Promise 这些运行时方法,需要 polyfill(补丁库,如 core-js)先定义它们,代码才能跑。
“兼容到什么浏览器”由 browserslist 配置统一驱动:Babel、Autoprefixer、ESLint 兼容规则都读同一份配置,通常写在 .browserslistrc 或 package.json 的 browserslist 字段里。
- 语法转换(Babel)与 API 补丁(core-js polyfill)是两件事,缺一不可
- useBuiltIns: usage 按代码实际用到的方法注入 polyfill,体积最小
- browserslist 是全工具的兼容目标:> 1%、last 2 versions、not dead 等查询语法
// .browserslistrc —— 一份配置,全家共享(用 # 注释) # 全球占有率超 0.5% 的浏览器 > 0.5% # 每个浏览器的最新 2 个版本 last 2 versions # 仍在维护(有官方更新)的浏览器 not dead # 兼容到 iPhone 12 的 Safari iPhone >= 12 // 源码用到了新 API arr.includes(42); // 需要 Array.prototype.includes Promise.allSettled(ps); // 需要 Promise.allSettled // 配合 useBuiltIns: usage,打包后自动在最前面注入: // import 'core-js/modules/es.array.includes.js'; // import 'core-js/modules/es.promise.all-settled.js'; // (只补你用到的,不多不少)




