有人問我babel的功能以及執行的過程和配置,在網上查閱了大量的資料~收集到這些~有錯請指出,及時修改。html
--------------------------------------------------------------------------------------------------node
衆所周知,解決Nodejs異步問題的終極方案就是使用async/await
方案,可是每次在項目中配置都會或多或少有些問題,每次都會被幾個組件git
搞的有點混淆不清,甚至不知所措,咱們的項目環境利用expressjs搭建,不一樣程度的使用了es6甚至es7的語法特性和新的API,因此babel轉碼es6
咱們先看下具體的CASEgithub
去掉 app.js
裏邊的 // import 'babel-polyfill'
和 // import 'babel-core/register'
, .babelrc
裏邊須要有pluginsexpress
{ "presets": [ "es2015", "stage-0" ], "plugins": [ ["transform-runtime", { "regenerator": true }] ] }
帶有async的代碼正常能run起來。瀏覽器
去掉 app.js
裏邊加上 import 'babel-polyfill'
,babel裏邊正常babel
{ "presets": [ "es2015", "stage-0" ], "plugins": [ ] }
帶有async的代碼能正常runapp
import 'babel-polyfill
換成import "babel-core/register"
代碼沒法run起來,報錯異步

app.js 中引入import 'babel-polyfill'
而 .babelrc 以下
{ "presets": [ "es2015", "stage-0" ] }
代碼能正常run起來。
去掉
import 'babel-polyfill'
或者替換爲import "babel-core/register"
代碼均不能正常run
app.js 中去掉 import 'babel-polyfill'
,而 .babelrc 代碼加入
{ "presets": [ "es2015", "stage-0" ], "plugins": [ ["transform-runtime", { "regenerator": true }] ] }
代碼能夠正常run。
若是須要使用async和await,有兩種方式,
import babel-polyfill
.["transform-runtime", { "regenerator": true }]
首先咱們要搞清楚async和await屬於es2016(es6其實是2015年發佈的,es6常被稱爲es2015,而es2016其實就是es7)的特性,Nodejs在實現標準版本的進程上相對瀏覽器側要快,截止到nodejs6.x的版本上,想要使用async和await還須要babel的轉碼才能實現。
例如以下代碼
const fs = require('fs') async function readFiles (fileName) { return new Promise(function(resolve, reject) { fs.readFile(fileName, function(error, data) { if (error) reject(error) resolve(data) }) }) } const start = async function() { const result = await readFiles('/Users/liujb/Desktop/aa.txt') console.log(result.toString()) } start()
親測在v7.4.0
下報語法錯誤,在v7.7.4
下能run。



from
以上內容仍是很清晰的,經過babel轉碼會默認讀取babelrc設定的規則,同時會運用相應的插件。
仔細閱讀阮老師的博客
babel-register是一個鉤子,會對require的js、es、jsx、es6後綴的文件進行轉碼,且不會對當前文件進行轉碼,並且是實時轉碼因此只適合開發階段。
babel-polyfill對es6的API進行轉碼,bable只會對syntax進行轉碼。
babel-plugin-* 表明了一系列的轉碼插件,如babel-plugin-transform-es2015-arrow-functions 用於轉碼 es6 中的箭頭函數,babel-plugin-transform-async-to-generator 用於將 es7 中的 async 轉成 generator。
咱們如今有了 babel-plugin 系列,能夠按需配置本身想要的特性。但如果想搭個 es6 環境,一個個地配置各個插件,我猜你會瘋掉。babel-preset 系列就能夠知足咱們的需求,babel-preset 系列打包了一組插件,相似於餐廳的套餐。如 babel-preset-es2015 打包了 es6 的特性,babel-preset-stage-0 打包處於 strawman 階段的語法
以上內容來源於https://github.com/brunoyang/blog/issues/20
--------------------------------------------------------------------------------------------------
這一塊的東西感受仍是不清晰,很神奇的就是目前接觸到的項目裏面,並無在.babelrc.js文件的presets中配置es的版本,才疏學淺,目前還不清楚爲什?以後會持續更新~