Babel插件transform-runtime入门实践

阅读时长 9 分钟读完

什么是Babel插件transform-runtime

Babel是一个JavaScript编译器,能够将ES6及更高版本的JavaScript代码转换为向下兼容的代码,使得我们能够在支持ES6语法的浏览器上运行我们的代码。而Babel插件transform-runtime则是一个专门用来优化babel编译结果的插件。

在babel转换代码的过程中,为了支持一些ES6的新语法和特性,babel会在代码中插入一些帮助函数或模块,这些代码会随着我们的业务代码一起打包到最终的JavaScript文件中,可能会导致我们的代码包变得比较大。而babel-plugin-transform-runtime则是将babel编译过程中插入的辅助代码和模块提取出来,以一种按需加载的方式引入到项目中。

如何使用Babel插件transform-runtime

在开始使用Babel插件transform-runtime之前,我们需要先安装它。打开终端命令行,并进入我们的工程目录,输入以下命令:

接下来,我们需要在.babelrc文件中应用该插件,我们需要在plugins数组中添加一条语句:

-- -------------------- ---- -------
 -
   ---------- -
     --------------------- -
       --------- ------
       ---------- -----
       -------------- -----
       --------------- -----
     --
   -
 -
  • corejs: 是否引入core-js来兼容一些ES6新特性,为 false 则不引入
  • helpers: 是否使用babel-runtime进行转化,并在项目中引入babel-runtime
  • regenerator: 是否使用regenerator进行Generator函数和async/await的转换
  • useESModules: 是否使用ES模块进行模块化打包

实践演示

示例1:对于Class的转换

在ES6引入之后,我们可以使用class关键字来进行类的定义,之前我们是通过原型链来定义一个类。当我们运行类相关的代码时,babel会将class语法糖转换为ES5中原型链的继承,以便兼容ES5浏览器。

我们先看一下使用class方式定义矩形的实例代码:

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

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

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

这段代码会被变为ES5中原型链的继承:

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

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

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

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

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

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

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

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

我们发现,原本只有8行的代码变成了44行,而这34行的代码只是用来模拟class的语法细节,在运行时却不是我们真正需要的代码,同时也增加了整个项目的体积。但是如果我们使用Babel插件transform-runtime来进行编译,运行的结果会是:

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

这段代码的运行结果与之前的代码一致,并且整个包大小大大减小。

示例2:对于Iterator&Generator的优化

我们可以通过使用iterator和generator在JavaScript中以更好的方式处理数据集合。Javascript 迭代器很容易学习,因为我们已经熟悉使用数组下标进行循环迭代。通过使用迭代器,我们也可以遍历集合中的每个元素,从而进行选择,访问操作等等。而使用Babel插件transform-runtime后,这段JavaScript代码将会被转化为:

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

在以上代码中,我们可以看到,代码中使用了 babel-runtime/regenerator 相关的文件,以 yield 语句来描述异步函数和异步流程控制的异步函数,同时 invoke 就是 Promise 的值回调函数。

示例3:Promise 模块

我们可以使用 Promise 来异步处理 JavaScript 代码,但是,这样做可能会使得我们的代码变得重复,并不是最优的做法。在这种情况下,我们可以使用 Babel插件transform-runtime 来对代码进行优化。

对于Promise 来说,它主要有三种状态,分别是通过 resolve 成功的,通过 reject 失败的以及等待中。我们还可以通过 then 或者 catch 来处理 Promise 对象。

下面是目前 Node.js 支持的 Promise 代码:

因为一些特殊(暂时不讲述)的原因,这段JavaScript代码将会被转化为:

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

可以看到,代码中使用了 babel-runtime/core-js/promise 相关的文件。在引入了这个 Babel 插件后,代码的最终生成结果将会变得更为简明,同时整个包的大小可控。

总结

使用 Babel 工具在编写前端代码的过程中,可以显著地提高代码的可读性和可维护性,有助于通过不同平台和环境的 JavaScript 运行。同事,使用这个工具可以使 JavaScript 代码更加整洁,减小包的大小,让项目更稳定。而使用 Babel 插件 transform-runtime 代表着对代码体积的极度优化程度。

我们在编码的过程中,可以通过 Babel 插件 transform-runtime来减少无用的代码,同时实现对项目整体体积的控制。

以上是Babel 插件 transform-runtime的具体使用方法以及效果示例,希望对你有所帮助。

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

纠错
反馈