有人问我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的版本,才疏学浅,目前还不清楚为什?以后会持续更新~