@babel/plugin-transform-runtime(三)

上节我们讲解了@babel/plugin-transform-runtime的三大作用,本节我们来讲一下@babel/plugin-transform-runtime的配置项,可能会有点小枯燥,不过对你理解其使用很有帮助。

@babel/plugin-transform-runtime是否要开启某功能,都是在配置项里设置的,某些配置项的设置是需要安装npm包的。

@babel/plugin-transform-runtime在没有设置配置项的时候,其配置项参数取默认值。下面的两个配置作用是等效的。

  {
    "plugins": [
      "@babel/plugin-transform-runtime"
    ]
  }
  // 是上方的默认值
  { 
    "plugins": [
      [
        "@babel/plugin-transform-runtime",
        {
          "helpers": true,
          "corejs": false,
          "regenerator": true,
          "useESModules": false,
          "absoluteRuntime": false,
          "version": "7.0.0-beta.0"
        }
      ]
    ]
  }

配置项讲解

1.我们先看第一个配置项helpers

该项是用来设置是否要自动引入辅助函数包,这个我们当然要引入了,这是@babel/plugin-transform-runtime的核心用途。该项取值是布尔值,我们设置为true,其默认值也是true,所以也可以省略不填。

2.接着来看corejs和regenerator

这两项是用来设置是否做API转换以避免污染全局环境,regenerator取值是布尔值,corejs取值是false、2和3。这个上一节已经讲过了,在前端业务项目里,我们一般对corejs取false,即不对Promise这一类的API进行转换。而在开发JS库的时候设置为2或3。regenerator取默认的true就可以

3.useESModules

该项用来设置是否使用ES6的模块化用法,取值是布尔值。默认是fasle,在用webpack一类的打包工具的时候,我们可以设置为true,以便做静态分析。

4.absoluteRuntime

该项用来自定义@babel/plugin-transform-runtime引入@babel/runtime/模块的路径规则,取值是布尔值或字符串。没有特殊需求,我们不需要修改,保持默认false即可。

5.最后一项version

该项主要是和@babel/runtime及其进化版@babel/runtime-corejs2、@babel/runtime-corejs3的版本号有关系,这三个包我们只需要根据需要安装一个。我们把安装的npm包的版本号设置给version即可。例如,在上节的babel14例子里,安装的@babel/runtime-corejs3版本是^7.10.4,那么配置项version也取'^7.10.4'。
其实该项不填取默认值就行,目前填写版本号主要是可以减少打包体积。

另外,在Babel6版本,该插件还有两个配置选项polyfill和useBuiltIns,在v7版本已经移除了,大家不需要再使用。

小结:

1.要使用@babel/plugin-transform-runtime插件,其实只有一个npm包是必须要装的,那就是它自己@babel/plugin-transform-runtime。
对于@babel/runtime及其进化版@babel/runtime-corejs2、@babel/runtime-corejs3,我们只需要根据自己的需要安装一个。

如果你不需要对core-js做API转换,那就安装@babel/runtime并把corejs配置项设置为false即可。

如果你需要用core-js2做API转换,那就安装@babel/runtime-corejs2并把corejs配置项设置为2即可。

如果你需要用core-js3做API转换,那就安装@babel/runtime-corejs3并把corejs配置项设置为3即可。

注:

1.那regenerator为何默认值是true?我的理解是,实现Generator与async转换API代码较少,而且也需要一些语法转换,所以默认值取了true。我们也可以设为false,不过没必要。
2.在安装@babel/preset-env的时候,其实已经自动安装了@babel/runtime,不过在项目开发的时候,我们一般都会再单独npm install一遍@babel/runtime。

笔记与思考

  1. 官网的文档读起来有些费劲,看了作者的教程后,感觉从原理到实践,讲得非常易懂且受用。真心不错!十分感谢分享!

  2. 赞!!!!!!
    看了那么多文章,终于看到把@babel/polyfill、@babel/runtime、@babel/runtime-corejs3、@babel/plugin-transform-runtime说的如此详细的。醍醐灌顶,之前的困惑都在这套教程里面解开了,感谢。

  3. 懵懵懂懂看了第一遍,有些收获,也有很多迷惑!我还要再看两遍,多谢作者!!!

  4. "在前端业务项目里,我们一般对corejs取false,即不对Promise这一类的API进行转换"
    这里是指开发环境吧,生产环境还是需要corejs的polyfill

    1. 应该指的是,对于业务项目,不需要@babel/plugin-transform-runtime对API转换,API污染全局环境也没啥大的关系,所以参数corejs取值false。API的转换用预设@babel/preset-env搭配参数useBuiltIns: 'usage'就好了。

  5. 请教一个问题,对已经增加 polyfill 的 第三方包,因为之前不知道这个包已经加过 polyfill,打包时在用 @babel/plugin- transform-runtime 进行一次 api 转换,会有什么问题吗

  6. 请教个问题以下我的参数"@babel/core": "^7.20.12","@babel/preset-env": "^7.20.2", "@babel/runtime": "^7.20.7", "@babel/runtime-corejs3": "^7.20.7", "webpack": "^5.64.1",在配置转ES5时IE11一直报错误:“function BrowserRouter(_ref) {
    let {
    basename,
    children,
    window
    } = _ref;”。。。转换不了,这个代码是react-router中的,请教各位怎么处理

  7. 大佬写的太好了,非常感谢,希望大佬继续把Typescript也更下去,网址已收藏,坐等更新

  8. 请教一下大佬,如果是使用了@babel/preset-env + @babel/plugin-transform-runtime + @babel/runtime-corejs3 的方案(大多在开发npm包使用的场景),他如何来做到根据指定的浏览器环境兼容呢(之前的polyfill的方案是可以指定浏览器.browselistrc)

发表评论

邮箱地址不会被公开。 必填项已用*标注