你一定碰到过这些库

babel-polyfill

项目地址:https://github.com/babel/babel/blob/master/packages/babel-polyfill

通过两个依赖实现功能

  • core-js/shim 提供 ES5/6/7 标准方法的实现
  • regenerate-runtime 提供 async 语法编译后的的运行时环境(下文会专门说明)

babel-plugin-transform-runtime

项目地址:https://github.com/babel/babel/blob/master/packages/babel-plugin-transform-runtime

开发 ES6/7 新特性的库推荐使用该插件,需要注意的是,安装时,必须同时安装 babel-runtime 作为依赖:

npm install --save-dev babel-plugin-transform-runtime
npm install --save babel-runtime // `babel-plugin-transform-runtime` 插件本身其实是依赖于 `babel-runtime` 的,但为了适应 `npm install --production` 强烈建议添加该依赖。

插件会将 es6/7 的语法转化为 es5 兼容的格式,并提供运行时依赖。什么是运行时依赖?比如你要用 Array.from 方法,该方法的具体实现必须在代码的执行环境中提供,这就是运行时依赖。

该插件在转化语法时,不会污染全局环境。而 babel-polyfill 则会污染全局环境。

babel-plugin-external-helpers

项目地址:https://github.com/babel/babel/blob/master/packages/babel-plugin-external-helpers/

代码很少,只依赖于 babel-runtime。相比较 babel-plugin-transform-runtime 会在每个模块注入运行时代码,该插件会将运行时代码打包,类似封装到一个对象下,这样避免注入重复的代码。

让 async/await 跑起来

通过最简单的一个函数:

async function foo() {
return await 1
} foo().then(function(val) {
console.log(val) // should output 1
})

说明这些 babel 插件怎么搭配,三种方案:

方案一:regenerator

.babelrc 如下配置:

{
"plugins": ["transform-runtime", "babel-plugin-transform-regenerator", "babel-plugin-transform-es2015-modules-commonjs"]
}
  • babel-plugin-transform-regenerator 将 async/await 语法转化成 regenerator 库支持的语法
  • transform-runtime 将运行时注入,类似:import regenerator from 'babel-runtime/regenerator'
  • babel-plugin-transform-es2015-modules-commonjs 只是为了将 import 转化为 require,便于在 node.js 模块下执行(如果你的执行环境支持 es6 的模块机制,则不需要该插件)。

方案二:generator

这种方式,最适合 node.js 环境,node.js 最早从 0.11 开始,便支持 generator。.babelrc 如下配置:

{
"plugins": ["babel-plugin-transform-async-to-generator"]
}

生成的代码,在 node.js 环境下可以直接执行,此时便不再需要 babel 提供任何有关 generator 相关的运行时环境了,直接 node.js 自带~

方案三:babel-polyfill

.babelrc 如下配置:

{
"plugins": ["babel-plugin-transform-regenerator"]
}

其实和前面 regenerate 一样,去掉了 runtime 配置。编译结束后,需要手动在结果文件的第一行加入:

require('babel-polyfill')

通过 babel-polyfill 向全局注入运行时依赖。那什么时候该用 babel-polyfill 什么时候用 babel-runtime?官网给出了解释:

This will emulate a full ES2015+ environment and is intended to be used in an application rather than a library/tool.

  • 如果是应用级别的开发,可以考虑使用 babel-polyfill:大而全,支持所有的 es2015+ 特性。可以在项目入口处统一添加,也可以通过打包工具配置入口。
  • 如果是开发一个库,使用 babel-runtime,不会污染全局,而且是根据情况注入需要的运行时环境。

关于 babel-runtime 更多细节,强烈建议阅读官方文档:https://github.com/babel/babel/blob/master/packages/babel-plugin-transform-runtime/README.md

别忘了 externel-helpers

刚刚只是一个简单的 foo 函数,一个文件。多个文件时,存在每个文件都注入类似 asyncToGenerator 等辅助方法,导致重复。举例说明:

foo.js

'use strict'

const bar = require('./bar')

async function foo () {
const val = await bar()
console.log(val)
} foo()

bar.js

'use strict'

module.exports = async function bar () {
return await 'bar'
}

采用前文提到的 generator 方式,去编译,会发现结果文件中,都有 _asyncToGenerator 定义。修改 .babelrc 如下:

{
"plugins": ["babel-plugin-transform-async-to-generator", "babel-plugin-external-helpers"]
}

再编译,_asyncToGenerator 都变成了 babelHelpers.asyncToGenerator。这样,多个模块之间没有重复的代码注入,更加干净清爽。不过此时 babelHelpers 是未定义,仍然需要引入运行时环境: transform-runtime,最终可以运行的配置如下:

{
"plugins": [
"babel-plugin-transform-async-to-generator",
"babel-plugin-external-helpers",
"transform-runtime",
"babel-plugin-transform-es2015-modules-commonjs"
]
}

示例代码见:https://github.com/sabakugaara/babel-example

本文整理自:https://github.com/sabakugaara/sabakugaara.github.io/issues/8

[转] 以 async/await 为例,说明 babel 插件怎么搭的更多相关文章

  1. 以Python为例的Async / Await的编程基础

    来源:Redislabs 作者:Loris Cro 翻译:Kevin (公众号:中间件小哥) 近年来,许多编程语言都在努力改进它们的并发原语.Go 语言有 goroutines,Ruby 有 fibe ...

  2. 【转】以Python为例的Async / Await的编程基础

    转, 原文:https://www.cnblogs.com/middleware/p/11996731.html 以Python为例的Async / Await的编程基础 -------------- ...

  3. 图与例解读Async/Await

    JavaScript ES7的async/await语法让异步promise操作起来更方便.如果你需要从多个数据库或者接口按顺序异步获取数据,你可能最终写出一坨纠缠不清的promise与回调.然而使用 ...

  4. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  5. ES6入门十一:Generator生成器、async+await、Promisify

    生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...

  6. 附件2:async/await

    在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...

  7. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  8. ASP.NET 中的 Async/Await 简介

    本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...

  9. 关于异步执行(Async/await)的理解(转发)

    原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...

随机推荐

  1. Docke--基础篇

    什么是Docker? Docker 最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并与2013年3月 ...

  2. python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)

    python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...

  3. 记一次安装python umysql模块的报错

    今天,在写一个python脚本的时候要用到数据库相关的umysql模块,但在引用的时候报没有此模块,第一反应就是去安装此模块,但是报没有找到pip命令. #pip install umysql -ba ...

  4. 带@的css语法,你知道多少?

    前言 css的顶层样式表由两种规则组成的规则列表构成,一种称为at—rule规则,也就是at规则,另一种是qualified rule,也就是普通规则.今天就学习一下at规则 正文 @charset ...

  5. 用CSS实现加载的动画效果

    用纯CSS实现加载的一些动态效果,可以把加载效果中的元素分成很多个小部分,每个部分都有动画,每个部分的动画再设置相应的延迟效果,这样,看起来就是连贯的加载动画效果.代码如下: 1.效果1 <di ...

  6. GraphQL Java Demo代码

    mvn 引用GraphQL <dependency> <groupId>com.graphql-java</groupId> <artifactId>g ...

  7. STL--hashtable

    hashtable使用开链的方式,解决元素个数大于array容量的问题. 当两个不同元素hash得到相同的hash值时,此时我们使用bucket list来链接连个元素. hashtable迭代器必须 ...

  8. ZYNQ基础知识一

    参考:UG1181 Zynq-7000 Programable Soc Architrcture Porting Quick Start Guide                           ...

  9. CentOS配代理服务器

    背景: 某云上有台Windows主机,为了省钱(...),购买的1M带宽... 然后日常只有我用,特别卡,嫌弃得不行. 最近接触到代理,琢磨代理连接到局域网内带宽大的主机,是否上网速度会蹭蹭得涨?实践 ...

  10. Pycharm问题:module 'pip' has no attribute 'main'

    更新pip之后(pip 10 版本之后),Pycharm安装package出现报错:module 'pip' has no attribute 'main' 解决办法如下: 找到Pycharm安装目录 ...