上节我们讲解了@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。
作者这篇(三)和上一篇(二)是一样的
感谢,已修正
"useESModules": true并未使得打包使用es6模块化
打包是Webpack等打包工具的行为,useESModules是让Babel进行模块化处理
写的太棒了,读完以后收获颇丰,赞赞赞!良心之作!
官网的文档读起来有些费劲,看了作者的教程后,感觉从原理到实践,讲得非常易懂且受用。真心不错!十分感谢分享!
赞!!!!!!
看了那么多文章,终于看到把@babel/polyfill、@babel/runtime、@babel/runtime-corejs3、@babel/plugin-transform-runtime说的如此详细的。醍醐灌顶,之前的困惑都在这套教程里面解开了,感谢。
懵懵懂懂看了第一遍,有些收获,也有很多迷惑!我还要再看两遍,多谢作者!!!
"在前端业务项目里,我们一般对corejs取false,即不对Promise这一类的API进行转换"
这里是指开发环境吧,生产环境还是需要corejs的polyfill
不是的
应该指的是,对于业务项目,不需要@babel/plugin-transform-runtime对API转换,API污染全局环境也没啥大的关系,所以参数corejs取值false。API的转换用预设@babel/preset-env搭配参数useBuiltIns: 'usage'就好了。
请教一个问题,对已经增加 polyfill 的 第三方包,因为之前不知道这个包已经加过 polyfill,打包时在用 @babel/plugin- transform-runtime 进行一次 api 转换,会有什么问题吗
一般不会对node_modules内部的包进行二次打包的
太厉害了,写的真好
厉害了,正好想知道这几个npm包的作用,大佬给讲明白了!
谢谢大佬的总结。清楚这些包是干什么的了。
请教个问题以下我的参数"@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中的,请教各位怎么处理
大佬写的太好了,非常感谢,希望大佬继续把Typescript也更下去,网址已收藏,坐等更新
请教一下大佬,如果是使用了@babel/preset-env + @babel/plugin-transform-runtime + @babel/runtime-corejs3 的方案(大多在开发npm包使用的场景),他如何来做到根据指定的浏览器环境兼容呢(之前的polyfill的方案是可以指定浏览器.browselistrc)
良心好文章!!!