@babel/polyfill
babel7.4.0之后是弃用掉的,然后现在由core-js替换:
//import "@babel/polyfill"; //之前的写法
import "core-js/stable";
import "regenerator-runtime/runtime";
这样会有全局变量被污染的问题(通过向全局对象和内置对象的prototype上添加方法来实现的)
core-js&core-js-pure
core-js其实就是为了能让你代码中的一些api能够在低版本浏览器上运行,相当于是在你的代码跟浏览器中加入了一个垫片,所以在babel7.4.0之后所有的polyfill操作都依赖core-js,core-js-pure是core-js的另外一个版本,可以不污染全局变量,比如我们的@babel/plugin-transform-runtime插件就是依赖的core-js-pure
@babel/runtime
@babel/runtime、@babel/runtime-corejs2、@babel/runtime-corejs3这几个都叫“@babel/runtime”,只是每一个对应的实现不一样,都是提供给@babel/plugin-transform-runtime插件做依赖,@babel/plugin-transform-runtime插件会根据corejs的配置做不通的runtime依赖
@babel/plugin-transform-runtime 和 @babel/preset-env
@babel/preset-env包含了一些基本es语法转换的插件(箭头函数、类转换等等),同时还支持polyfill,有usage跟entry模式,但是preset-env添加polyfill会像之前使用@babel/polyfill一样,会污染全局变量。
@babel/plugin-transform-runtime主要是利用@babel/runtime提取了一些公共的babel帮助函数,同时也支持polyfill的添加,添加的polyfill都是以一个局部变量的形式引入,不会污染全局变量。
如果你做的是一个三方库,然后需要被别人依赖,那么建议使用@babel/plugin-transform-runtime来引入polyfill,因为你要尽可能的专注于做自己的事,而不是说去影响别人,语法转换可以使用preset-env预设,比如以下配置(dependencies引入@babel/runtime-corejs3即可):
即 @babel/preset-env + @babel/plugin-transform-runtime + @babel/runtime-corejs3
{
"presets": ["@babel/preset-env"],
"plugins": [
[
"@babel/plugin-transform-runtime", // @babel/plugin-transform-runtime目前不支持设置targets
{
"corejs": { "version": 3 }
}
]
]
}
如果你做的是一个普通的业务项目的话,可以用preset-env来转换语法和polyfill,然后再利用@babel/plugin-transform-runtime来引入helpers(节省代码大小)跟generator(按需加载regenerator-runtime 插件)做到代码重复利用,比如以下配置( dependencies里需引入 @babel/runtime",
"core-js",):
即:@babel/preset-env + core-js@3 + regenerator-runtime
因为在rollup.config.js里配置的babelHelpers是runtime,所以通过插件的方式引入regenerator-runtime,如果设置的是bundled则不需要`
{
"presets": [
[
"@babel/preset-env",
{
"corejs": { "version": 3 } ,
"useBuiltIns": "usage",
// @babel/preset-env可以配置targets 需要支持全球使用率超过 0.25% 的浏览器
"targets": [
"> 0.25%"
]
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
//不使用 `core-js` 来提供 polyfill
"corejs": false
}
]
],
}
如果是bundled则是这样的:
{
"presets": [
[
"@babel/preset-env",
{
"corejs": { "version": 3 } ,
"useBuiltIns": "usage",
"targets": [
"> 0.25%"
]
}
]
],
}
也不一定都是这几种方式写死,还是要根据自己项目需要灵活配置,找到自己项目最合适的就可以了