那麼咱們何時用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中前面引入,也能夠按需引入
複製代碼