Q: Babel 的 Plugin 和 Preset 有什么区别?它们的执行顺序是怎样的?
Preset (预设) 本质上就是一组 Plugin (插件) 的集合。
这是 Babel 最容易搞混的点。记住:Plugin 早于 Preset,Plugin 顺序执行,Preset 逆序执行。
实际执行顺序:A -> B -> D -> C。
这主要是为了兼容 es2015 以前的规范 (Stage 0 -> Stage 1 -> ...)。
如果你配置了 es2015 和 react 两个 Preset,通常希望 react (JSX -> JS) 先执行,然后再由 es2015 (ES6 -> ES5) 把 JSX 产物里的箭头函数转译掉。
如果在配置里先写了 es2015 再写 react:按照逆序规则,react 会先执行,这是合理的。
@babel/preset-env: 智能转换 ES6+ 语法。@babel/preset-react: 转换 JSX。@babel/preset-typescript: 移除类型注解。如果是为了转换某个特定的新语法 (如 Decorator 装饰器),且该语法还处于 Stage 阶段,或者 preset-env 还没覆盖到,就必须单独引入对应的 Plugin。
如果是为了让代码在所有主流浏览器都能跑,直接用 Preset (preset-env) 最省心。