<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
babel7釋出了。
在升級到 Babel 7 時需要注意幾個重大變化:
官方提供了一個工具babel-upgrade,對於老專案,只需要執行:npx babel-upgrade --write --install
具體看 https://github.com/babel/babel-upgrade
babel的polyfill總是比較大,會影響一些效能,而且也會有一些沒用的polyfill,怎麼減少polyfill的大小呢?
babel7提供了useBuiltIns的按需載入:usage。
設定中設定useBuiltIns:usage,babel就會自動把所需的polyfill載入進來,不需要手動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的某些外掛需要自行引入。個人感覺stage用起來太不方便了)。
之前的babel-preset-env/babel-preset-react全都改名為@babel/xxx,如果在babel7你還按之前的寫法,會報錯:
Error: Plugin/Preset files are not allowed to export objects, only functions.
看下useBuiltIns:usage的效果。"debug"選項開到true,可以看到打包的檔案。
我用es6摘抄了一些語法,用來測試編譯:
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(); // 呼叫父類別的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。
根據我們填的"targets",babel會去查用到的api,當前的target環境支援什麼不支援什麼,不支援的才加polyfill。
可以看到我們編譯後的檔案已經加了polyfill。
檔案大小和效能都有很多提高。
useBuiltIns:entry就沒有那麼智慧了,他會根據target環境載入polyfill,他需要手動import polyfill,不能多次引入。
@babel/preset-env會將把@babel/polyfill根據實際需求打散,只留下必須的。做的只是打散。僅引入有瀏覽器不支援的polyfill。這樣也會提高一些效能,減少編譯後的polyfill檔案大小。
main.js需要引入polyfill。import '@babel/polyfill';
。
可以看到效果。我只截了部分polyfill依賴。
編譯後的檔案引入了一堆polyfill。
只用polyfill不是最完美的方案。
polyfill會額外引入一些函數,比如:
因為polyfill沒有babel-runtime的helper函數,在編譯async
函數的時候,會引入以上的程式碼asyncGeneratorStep
,_asyncToGenerator
。
如果你每個檔案都用到了async,那麼冗餘的程式碼將會很大。
最佳方案就是在用polyfill的同時,再用babel-runtime。
babel-runtime會把asyncGeneratorStep
,_asyncToGenerator
等函數require進來。從而減小冗餘。
這得益於babel-runtime的helper函數。
所以最佳的設定是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範例詳解的詳細內容,更多關於babel7按需載入polyfill的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45