那么咱们何时用babel-polyfill,何时用babel-runtime?
babel-polyfill会污染全局空间,并可能致使不一样版本间的冲突,而babel-runtime不会
从这点看应该用babel-runtime。
但记住,babel-runtime有个缺点,它不模拟实例方法,即内置对象原型上的方法,因此
相似Array.prototype.find,你经过babel-runtime是没法使用的。
最后,请不要一次引入所有的polyfills(如require('babel-polyfill')),
这会致使代码量很大。请按需引用最好。
@babel/plugin-transform-runtime 不能单独使用,它须要指定 preset 为 es2015,env,
typescript 仍是 其余,才知道要转换的特性有哪些
babel 在每一个须要的文件的顶部都会插入一些 helpers
代码,这可能会致使多个文件都会有重复的 helpers 代码。
@babel/plugin-transform-runtime + @babel/runtime 能够避免编译构建时重复的 helper
代码
此转换器的另外一个目的是为您的代码建立沙盒环境。若是您使用@ babel /
polyfill及其提供的内置函数(例如Promise,Set和Map),那些将污染全局范围。虽然
这可能适用于应用程序或命令行工具,但若是您的代码是您打算发布供其余人使用的库,
或者若是您没法准确控制代码运行的环境,则会出现问题。
适用于不须要修改 全局变量的工具/库,同时,适用这种方法也不会转换实例的方法(如
:Array.prototype.includes)
es2015里不只只有新的语法,还有实例的扩展,好比String,其实这里只是调用了String
实例的一个方法,咱们不管怎么语法转换也没有什么用吧,若是咱们在不支持
Polyfill提供的就是一个这样功能的补充,实现了Array、Object等上的新方法,实现了
Promise、Symbol这样的新Class等。
因此polyfill是线上使用的,由于新的方法编译完成以后还得使用,可是新的语法就能够
考编译完成,因此babel-core是不用发布到线上,他只做用再编译的时候
怎么使用呢:
{
test:/\.js$/, // normal 普通的loader
use:{
loader:'babel-loader',
options:{ // 用babel-loader 须要把es6-es5
presets:[
'@babel/preset-env'
],
plugins:[
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose": true }],
"@babel/plugin-transform-runtime"
]
}
},
polyfill:能够再全局引入,再enter中前面引入,也能够按需引入
复制代码