overview
首先是因?yàn)樵陂_發(fā)過程中使用async彤断,但是報(bào)如下錯(cuò)誤
然后就去找解決方案,過程中找到了babel-polyfill曙咽,babel-plugin-transform-runtime去枷,babel-runtime久免,然后去了解每個(gè)package的作用
usage of babel
羅列了babel全家桶每個(gè)部分的意義和使用
npm i babel-plugin-*
babel-plugin-*
代表了一系列的轉(zhuǎn)碼插件底瓣,如babel-plugin-transform-es2015-arrow-functions
用于轉(zhuǎn)碼 es6 中的箭頭函數(shù),babel-plugin-transform-async-to-generator
用于將 es7 中的 async 轉(zhuǎn)成 generator蕉陋。
npm i babel-preset-*
使用babel-plugin-捐凭,我們可以實(shí)現(xiàn)按需加載,但是在實(shí)際開發(fā)中凳鬓,我們不可能一個(gè)插件一個(gè)插件去安裝茁肠,而babel-prese-就幫我們預(yù)設(shè)好了開發(fā)環(huán)境需要用到的插件,例如babel-preset-es2015表示轉(zhuǎn)換ES6語法需要的插件缩举,babel-preset-stage-2表示stage2草案的語法的插件垦梆,類似餐廳里的套餐匹颤,plugin就是單點(diǎn)
npm i babel-runtime / babel-polyfill
plugins和preset只能用來轉(zhuǎn)換新語法,但是不能轉(zhuǎn)換api托猩,什么意思呢印蓖,例如arrow function,const京腥,let赦肃,async是新語法,但是async轉(zhuǎn)換成generator時(shí)如果瀏覽器不支持公浪,還是需要使用polyfill
babel-runtime和babel-polyfill的功能相同他宛,但是實(shí)現(xiàn)的方式不一樣,babel-polyfill直接在污染全局欠气,例如要讓node0.1.0支持Promise厅各,babel-polyfill的做法是直接在全局掛上Promise對象,而babel-runtime的實(shí)現(xiàn)方式是引入一個(gè)helper函數(shù)const Promise = require('babel-runtime/core-js/promise')
预柒,但是babel-runtime其實(shí)會(huì)有重復(fù)引用的問題队塘,因?yàn)槊總€(gè)使用的地方都引入了Promise這個(gè)helper函數(shù),babel為了解決這個(gè)問題卫旱,開發(fā)了babel-plugin-transform-runtime
人灼,用來把helper函數(shù)放在公共部分引入,而不是在每個(gè)js文件中內(nèi)連helper函數(shù)
還有值得注意的一點(diǎn)是顾翼,babel-runtime不轉(zhuǎn)碼實(shí)例方法投放,必須使用babel-polyfill,因?yàn)閎abel-polyfill是直接在原型鏈上增加方法
'!!!'.repeat(3);
'hello'.includes('h');