overview
首先是因?yàn)樵陂_(kāi)發(fā)過(guò)程中使用async,但是報(bào)如下錯(cuò)誤

然后就去找解決方案,過(guò)程中找到了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í)際開(kāi)發(fā)中,我們不可能一個(gè)插件一個(gè)插件去安裝,而babel-prese-就幫我們預(yù)設(shè)好了開(kāi)發(fā)環(huán)境需要用到的插件,例如babel-preset-es2015表示轉(zhuǎn)換ES6語(yǔ)法需要的插件,babel-preset-stage-2表示stage2草案的語(yǔ)法的插件,類似餐廳里的套餐,plugin就是單點(diǎn)
npm i babel-runtime / babel-polyfill
plugins和preset只能用來(lái)轉(zhuǎn)換新語(yǔ)法,但是不能轉(zhuǎn)換api,什么意思呢,例如arrow function,const,let,async是新語(yǔ)法,但是async轉(zhuǎn)換成generator時(shí)如果瀏覽器不支持,還是需要使用polyfill
babel-runtime和babel-polyfill的功能相同,但是實(shí)現(xiàn)的方式不一樣,babel-polyfill直接在污染全局,例如要讓node0.1.0支持Promise,babel-polyfill的做法是直接在全局掛上Promise對(duì)象,而babel-runtime的實(shí)現(xiàn)方式是引入一個(gè)helper函數(shù)const Promise = require('babel-runtime/core-js/promise'),但是babel-runtime其實(shí)會(huì)有重復(fù)引用的問(wèn)題,因?yàn)槊總€(gè)使用的地方都引入了Promise這個(gè)helper函數(shù),babel為了解決這個(gè)問(wèn)題,開(kāi)發(fā)了babel-plugin-transform-runtime,用來(lái)把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');