结论
- 写类库时,使用
@babel/plugin-transform-runtime。 - 写应用时,使用
@babel/polyfill。
1- 建议类库使用
@babel/plugin-transform-runtime 的作用是将 helper 和 polyfill 都改为从一个统一的地方引入,并且引入的对象和全局变量是完全隔离的,这样解决了上面的两个问题。
缺点
因为@babel/plugin-transform-runtime没有污染全局内置对象,对于实例方法如"foobar".includes("foo")就无法进行转换或兼容了。
npm i babel-loader @babel/core @babel/preset-env -D
npm install @babel/plugin-transform-runtime -D
npm install @babel/runtime-corejs3 --save
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8", "Android >= 4.4"]
}
}
],
[
"@babel/preset-typescript",
{
"isTSX": true, // 必须设置,否者编译tsx时会报错
"allowNamespaces": true,
"allExtensions": true // 必须设置,否者编译.vue 文件中ts 代码会报错
}
]
],
"plugins": [
["@babel/plugin-transform-runtime", {
"corejs": 3
}]
]
}
2- @babel/polyfill, 写应用时
- 如果在
.babelrc中设置useBuiltIns: 'usage',则不要在webpack.config.jsentry 数组或 source 中包含babel-polyfill。注意,仍然需要安装babel-polyfill。 - 如果在
.babelrc中设置useBuiltIns: 'entry',那么在上面讨论的require或import的应用程序入口的顶部引入babel-polyfill。 - 如果在
.babelrc中设置useBuiltIns: 'false',将babel-polyfill添加到webpack.config.js的入口数组中。
npm i babel-loader @babel/core @babel/preset-env @babel/polyfill -D
npm install @babel/plugin-transform-runtime -D
npm i core-js@3 -D
{
"presets": [["@babel/preset-env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8", "Android >= 4.4"]
},
"corejs": 3,
"useBuiltIns": "usage"
}]],
"plugins": ["@babel/plugin-transform-runtime", "@babel/plugin-transform-modules-commonjs"]
}