Q: @babel/preset-env 是什么?如何配置 targets 和 modules?useBuiltIns: 'usage' 有什么作用?
@babel/preset-env 是 Babel 最常用的 预设 (Preset)。它根据你指定的 目标环境 (Target),自动决定需要启用哪些 插件 (Plugin),从而避免手动配置一大堆插件。
Babel 通过 browserslist (package.json 或 .browserslistrc) 配置目标:
"browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
Babel 内部有一个数据库 (compat-table),记录了每个 ES6 特性在不同浏览器版本上的支持情况。
原理:如果目标浏览器已经支持了箭头函数,preset-env 就不会引入 arrow-function 插件,从而减少代码体积。
默认是 'auto'。
如果你的构建工具 (Webpack/Rollup) 支持 ESM (Tree Shaking),你应该显式设置为 false。
presets: [['@babel/preset-env', { modules: false }]]
这样 Babel 就不会把 import/export 转换成 CommonJS require/module.exports,Webpack 才能基于静态分析做 Tree Shaking。
这决定了 Babel 如何处理 API (Polyfill),如 Promise, Array.from。
import 'core-js',Babel 会把这行代码转换成目标浏览器所需的 所有 polyfill (比如几十个)。体积巨大,不推荐。const p = new Promise();import "core-js/modules/es.promise"; const p = new Promise();必须配合 useBuiltIns: 'usage' 指定 core-js 版本。v2 已停止维护,通常用 v3。
Preset (预设) 是一组 Plugin 的集合。Babel 官方提供了几个 Preset (如 preset-env, preset-react, preset-typescript)。但有时候你需要用到一些 尚未进入标准 (Stage 0-3) 的新语法 (如 pipeline operator |>),这时候就需要单独安装并配置对应的 Plugin。
false for Tree Shaking.useBuiltIns: 'usage', corejs: 3.