Babel 之 预设(presets)与插件(plugins)

366 阅读2分钟

preset 预设的选择

什么是预设

预设是一组Babel插件的集合,用大白话说就是插件包。

预设的发展历史

Babel6 的时代,常见的 presetbabel-preset-es2015、babel-preset-es2016、babel-preset-es2017、babel-preset-latest、babel-preset-stage-0、babel-preset-stage-1、babel-preset-stage-2 等。

babel-preset-es2015、babel-preset-es2016、babel-preset-es2017 分别是 TC39 每年发布的进入标准的 ES 语法的转换器预设,我们在这里称之为年代 preset。目前,Babel 官方不再推出 babel-preset-es2017 以后的年代 preset 了。

babel-preset-stage-0、babel-preset-stage-1、babel-preset-stage-2、babel-preset-stage-3TC39 每年草案阶段的 ES 语法转换器预设。

从 Babel 7 版本开始,上述的预设都已经不推荐使用了,babel-preset-stage-X 因为对开发造成了一些困扰,也不再更新。

babel-preset-latest,在 Babel6 的时候是你在使用它的时候所有年代 preset 的集合,在 Babel6 最后一个版本,它是 babel-preset-es2015、babel-preset-es2016、babel-preset-es2017 这三个的集合。因为 Babel 官方不再推出 babel-preset-es2017 以后的年代 preset 了,所以 babel-preset-latest 定义变成了 TC39 每年发布的进入标准的 ES 语法的转换器预设集合。

@babel/preset-env 包含了 babel-preset-latest 的功能,并对其进行增强,现在 @babel/preset-env 完全可以替代 babel-preset-latest。经过一番梳理,可以总结为以前用到的那么多 preset 预设,现在只需一个@babel/preset-env 就可以了。

在实际开发过程中,除了使用 @babel/preset-env 对标准的 ES6 语法转换,我们可能还需要类型检查和 react 等预设对特定语法转换。这里有三个官方预设可以使用:

  • @babel/preset-flow
  • @babel/preset-react
  • @babel/preset-typescript

总结起来,Babel 官方的 preset,我们实际可能会用到的其实就只有 4 个:

  • @babel/preset-env
  • @babel/preset-flow
  • @babel/preset-react
  • @babel/preset-typescript

一个普通的 vue 工程,Babel 官方的 preset 只需要配一个 @babel/preset-env 就可以了。

插件的选择

虽然 Babel7 官方有 90 多个插件,不过大半已经整合在 @babel/preset-env@babel/preset-react 等预设里了,我们在开发的时候直接使用预设就可以了。

目前比较常用的插件只有 @babel/plugin-transform-runtime

预设与插件的执行顺序

plugins 插件数组和 presets 预设数组的执行顺序是有特定规则的。如果两个插件或预设都要处理同一个代码片段,执行规则如下:

  • 插件比预设先执行
  • 插件执行顺序是插件数组从前向后执行
  • 预设执行顺序是预设数组从后向前执行