Babel 6 中的 plugins 和 presets 具体解析

阅读时长 6 分钟读完

在现代前端开发中,我们通常使用 Babel 来将 ES6 或 ES7 代码转为 ES5,以便在目前的浏览器中运行。Babel 的转换过程基于 plugins 和 presets,本文将针对 Babel 6 中的 plugins 和 presets 进行详细的解析,并提供相应示例代码。

Plugins

Babel 中的 plugin 单独完成一项任务,例如箭头函数的转换或类属性的转换。Babel 社区提供了大量 plugins,可以满足我们的需求,同时我们也可以编写自己的 plugins。

编写一个简单的 plugin

假设我们要将 ES7 中的 a?.b 语法糖转换为 a == null ? void 0 : a.b,我们可以编写一个简单的 plugin:

-- -------------------- ---- -------
-------------- - ---------- ------ - -- -
  ------ -
    -------- -
      -------------------------------- -
        -----------------
          --------------------
            -----
            -------------------
              ------
              ------------------------------
              ---------------
            --
            -------------------
              ------------------------------
              --------------------------------
              -----
            -
          -
        --
      -
    -
  --
-

module.exports 导出了一个函数,它接受一个对象参数 t。在此示例中,我们使用了此参数中的 types 属性,它包含 Babel 内部的类型信息,我们使用它来构造 AST。

此外,我们还定义了 visitor,它是一个对象,key 是 AST 节点类型,value 是一个函数,该函数接受一个 path 参数。

这个 plugin 中,我们定义了一个 OptionalMemberExpression 类型的 visitor,如果匹配到了一条类似 a?.b 的语句,我们将其转换为 a == null ? void 0 : a.b

使用一个现有的 plugin

使用一个现有的 plugin 很简单,只需在编译前通过 npm 安装它,并在 .babelrc 或 Babel Loader 配置中指定即可。例如,我们要使用 Babel 官方提供的类属性插件:

在 .babelrc 中添加:

经过以上配置,我们就可以在代码中使用 ES7 的 class 属性语法,例如:

常用的 plugins

除了类属性插件外,Babel 社区还提供了很多常用且实用的 plugins,例如:

  • @babel/plugin-transform-arrow-functions:将箭头函数转换为普通函数
  • @babel/plugin-transform-spread:将数组和对象扩展转换为函数调用
  • @babel/plugin-proposal-object-rest-spread:转换为对象的 rest/spread 属性

Presets

preset 是一组为特定目的打包的 plugin 集合,在 Babel 配置中,多个 plugins 可以被打包成一个 preset,这使得配置变得更加简单直观。

使用一个现有的 preset

使用现有的 preset 非常简单,只需在编译前通过 npm 安装它,并在 .babelrc 或 Babel Loader 配置中指定即可。例如,我们要使用 Babel 官方提供的 ES6 解析器:

在 .babelrc 中添加:

在这个 preset 中,Babel 将编译我们使用的 JavaScript,以便它可以在大多数浏览器中运行,这样就不需要在代码中使用 polyfill。

编写和使用自己的 preset

我们也可以根据自己的需求编写自己的 preset,例如:

-- -------------------- ---- -------
----- ----------------- - -- -- -
  ------ -
    -------- -
      -
        --------------------
        -
          -------- -- --- --- ------
          -------- -----
        -
      -
    --
    -------- -
      --------------------------------------
      ------------------------------------------
      -------------------------------------------
    -
  --
--

-------------- - ------------------

这个自定义的 preset 将 babel/preset-env 和一些其他插件组成了一个自定义的 preset。

在这个 preset 中,我们将编译目标设置为不支持 ES5 的浏览器,并关闭了模块转换功能,添加了对动态导入,类属性和对象展开属性的支持。

默认情况下,Babel 会在项目根目录查找 .babelrc 文件或 package.json 文件中的 babel 属性,但它也可以通过 .babelrc,.babelrc.js,babel.config.js 和 package.json 设置。

结论

使用 plugins 和 presets 使得 Babel 配置变得更加简单直观,同时也为我们提供了许多实用的功能。在开发过程中,我们可以快速实现对新语法的支持,提高代码的兼容性。

尽管这些 plugins 和 presets 能够提高开发效率,但是要合理使用它们,因为过多的插件会极大地增加打包后的代码大小,并可能导致运行时性能下降。因此,我们应该仅使用我们确实需要的 plugins 和 presets。

最后,我希望通过本文的介绍,读者们可以更深入了解 Babel 的 plugins 和 presets,以便更好地开展自己的前端开发工作。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66efdc1d6fbf960197312038

纠错
反馈