babel7按需加載polyfill示例詳解
babel7
babel7發(fā)布了。
在升級(jí)到 Babel 7 時(shí)需要注意幾個(gè)重大變化:
- 移除對(duì) Node.js 6 之前版本的支持;
- 使用帶有作用域的 @babel 命名空間,以防止與官方 Babel 包混淆;
- 移除年度預(yù)設(shè),替換為 @babel/preset-env;
- 使用選擇性 TC39 個(gè)別提案替換階段提案;
- TC39 提議插件現(xiàn)在是 -proposal,而不是 -transform;
- 為某些面向用戶的包(例如 babel-loader、@babel/cli 等)在 @babel/core 中引入peerDependency。
官方提供了一個(gè)工具babel-upgrade,對(duì)于老項(xiàng)目,只需要執(zhí)行:npx babel-upgrade --write --install
具體看 https://github.com/babel/babel-upgrade
useBuiltIns:usage
babel的polyfill總是比較大,會(huì)影響一些性能,而且也會(huì)有一些沒用的polyfill,怎么減少polyfill的大小呢?
babel7提供了useBuiltIns的按需加載:usage。
配置中設(shè)置useBuiltIns:usage,babel就會(huì)自動(dòng)把所需的polyfill加載進(jìn)來(lái),不需要手動(dòng)import polyfill文件。
配置如:
{
"presets": [
"@babel/preset-react",
["@babel/env", {
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
},
"useBuiltIns": "usage",
"debug": true
}]
],
"plugins": ["@babel/transform-runtime"]
}
babel提供的@babel/env全面替換es2015,stage插件。(如果用到stage的某些插件需要自行引入。個(gè)人感覺stage用起來(lái)太不方便了)。
之前的babel-preset-env/babel-preset-react全都改名為@babel/xxx,如果在babel7你還按之前的寫法,會(huì)報(bào)錯(cuò):
Error: Plugin/Preset files are not allowed to export objects, only functions.
效果
看下useBuiltIns:usage的效果。"debug"選項(xiàng)開到true,可以看到打包的文件。
我用es6摘抄了一些語(yǔ)法,用來(lái)測(cè)試編譯:
const a = Object.assign({}, { a: 1 });
console.log(a);
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
let s = Symbol();
typeof s;
class ColorPoint {
constructor(x, y, color) {
this.color = color;
}
toString() {
return this.color + ' ' + super.toString(); // 調(diào)用父類的toString()
}
}
asyncPrint('hello world', 50);
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
console.log(hw.next());

babel編譯之后,可以看到加載的polyfill只加載了 es6.object.assign,es6.promise, es6.symbol,es7.symbol.async-iterator , regenerator-runtime。
babel是怎么知道我們需要哪些polyfill的?
根據(jù)我們填的"targets",babel會(huì)去查用到的api,當(dāng)前的target環(huán)境支持什么不支持什么,不支持的才加polyfill。
可以看到我們編譯后的文件已經(jīng)加了polyfill。

文件大小和性能都有很多提高。
useBuiltIns:entry
useBuiltIns:entry就沒有那么智能了,他會(huì)根據(jù)target環(huán)境加載polyfill,他需要手動(dòng)import polyfill,不能多次引入。
@babel/preset-env會(huì)將把@babel/polyfill根據(jù)實(shí)際需求打散,只留下必須的。做的只是打散。僅引入有瀏覽器不支持的polyfill。這樣也會(huì)提高一些性能,減少編譯后的polyfill文件大小。
main.js需要引入polyfill。import '@babel/polyfill';。
可以看到效果。我只截了部分polyfill依賴。

編譯后的文件引入了一堆polyfill。

最佳實(shí)踐
只用polyfill不是最完美的方案。
polyfill會(huì)額外引入一些函數(shù),比如:

因?yàn)閜olyfill沒有babel-runtime的helper函數(shù),在編譯async函數(shù)的時(shí)候,會(huì)引入以上的代碼asyncGeneratorStep,_asyncToGenerator。
如果你每個(gè)文件都用到了async,那么冗余的代碼將會(huì)很大。
babel-runtime
最佳方案就是在用polyfill的同時(shí),再用babel-runtime。
babel-runtime會(huì)把asyncGeneratorStep,_asyncToGenerator等函數(shù)require進(jìn)來(lái)。從而減小冗余。
這得益于babel-runtime的helper函數(shù)。
所以最佳的配置是polyfill+babel-runtime。
如果用了react可以加@babel/preset-react。
{
"presets": [
"@babel/preset-react",
["@babel/env", {
"targets": {
"browsers": ["last 2 versions", "ie 11"]
},
"useBuiltIns": "usage"
}]
],
"plugins": ["@babel/transform-runtime"]
}
可以看到,_asyncToGenerator2已被require。

以上就是babel7按需加載polyfill示例詳解的詳細(xì)內(nèi)容,更多關(guān)于babel7按需加載polyfill的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript 判斷一個(gè)對(duì)象為數(shù)組的方法
這篇文章主要介紹了javascript 判斷一個(gè)對(duì)象為數(shù)組的方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
Echarts柱狀圖實(shí)現(xiàn)同時(shí)顯示百分比+原始值+匯總值效果實(shí)例
echarts是一款功能強(qiáng)大、靈活易用的數(shù)據(jù)可視化庫(kù),它提供了豐富的圖表類型和樣式,包括柱狀圖,這篇文章主要給大家介紹了關(guān)于Echarts柱狀圖實(shí)現(xiàn)同時(shí)顯示百分比+原始值+匯總值效果的相關(guān)資料,需要的朋友可以參考下2024-08-08
jquery實(shí)現(xiàn)左右滑動(dòng)式輪播圖
這篇文章主要為大家詳細(xì)介紹了jquery實(shí)現(xiàn)左右滑動(dòng)式輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
javascript異常處理實(shí)現(xiàn)原理詳解
這篇文章主要介紹了javascript異常處理實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
js實(shí)現(xiàn)簡(jiǎn)單隨機(jī)抽獎(jiǎng)的方法
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單隨機(jī)抽獎(jiǎng)的方法,涉及字符串的操作、setInterval定時(shí)調(diào)用等技巧,需要的朋友可以參考下2015-01-01
JavaScript中標(biāo)識(shí)符提升問(wèn)題
標(biāo)識(shí)符指的是javascript中定義的符號(hào),標(biāo)識(shí)符可以由任意順序的大小寫字母、數(shù)字、下劃線和美元符號(hào)組成,但標(biāo)識(shí)符不能以數(shù)字開頭,也不能是javascript中的保留關(guān)鍵字。并且要注意,javascript是嚴(yán)格區(qū)分大小寫的。2015-06-06
Javascript 獲取字符串字節(jié)數(shù)的多種方法
Javascript 字符串字節(jié)數(shù)獲取功能多種方法2009-06-06
基于JavaScript開發(fā)一個(gè)有趣的分組抽簽小程序
在團(tuán)隊(duì)合作開發(fā)中,經(jīng)常需要將團(tuán)隊(duì)成員分組,來(lái)完成各自的任務(wù),而抽簽的方式自然是最公平、最簡(jiǎn)單的方法之一,所以本文就來(lái)開發(fā)一個(gè)有趣的分組抽簽小程序吧2023-05-05

