[转] 以 async/await 为例,说明 babel 插件怎么搭
你一定碰到过这些库
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 插件怎么搭的更多相关文章
- 以Python为例的Async / Await的编程基础
来源:Redislabs 作者:Loris Cro 翻译:Kevin (公众号:中间件小哥) 近年来,许多编程语言都在努力改进它们的并发原语.Go 语言有 goroutines,Ruby 有 fibe ...
- 【转】以Python为例的Async / Await的编程基础
转, 原文:https://www.cnblogs.com/middleware/p/11996731.html 以Python为例的Async / Await的编程基础 -------------- ...
- 图与例解读Async/Await
JavaScript ES7的async/await语法让异步promise操作起来更方便.如果你需要从多个数据库或者接口按顺序异步获取数据,你可能最终写出一坨纠缠不清的promise与回调.然而使用 ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...
- ES6入门十一:Generator生成器、async+await、Promisify
生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...
- 附件2:async/await
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
- ASP.NET 中的 Async/Await 简介
本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...
- 关于异步执行(Async/await)的理解(转发)
原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...
随机推荐
- 哈尔滨工程大学第十四届程序设计竞赛(同步赛)F 小帆帆走迷宫(dp)
题目描述 小帆帆被困在一个 NxN 的方格矩阵迷宫,每个格子中都有一个整数 A[i][j].小帆帆从迷宫起点(左上角)格子 A[1][1]开始走,每一步可以向右或向下移动,目标是移动到迷宫的出口右下角 ...
- 戏说java与web
slmgr.vbs /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43教育版换回企业版 搜百度网盘 http://www.pansoso.com/ https://m.zhangl ...
- linux网络性能测试工具ipref安装与使用
一.iperf工具安装 源码包下载地址:https://iperf.fr/iperf-download.php#archlinux 选择对应系统的版本就是解压安装了 完成 测试发现有问题 问题原因:L ...
- python2 配置环境变量
复习 '''重点:1.进制转换:二进制 与 十六进制2.内存分布:栈区 与 堆区 # 124810101001110111 => 2a77abf1 => 1010101111110001 ...
- python中__init__和__new__的区别
参考:https://my.oschina.net/liuyuantao/blog/747164 python中__metaclass的详解 参考:https://www.cnblogs.com/ia ...
- DML、DDL、DCL的分别是什么
DML.DDL.DCL的分别是什么 一直以来,分不清这三者的简称代表什么,甚至在面试中遇到可能会张冠李戴.今天特意记录一下. 一.DML(data manipulation language) 数据操 ...
- Gcc 命令大全
gcc这条命令用来将源代码生成可执行程序,下面来看一下gcc的常用选项. 1.无选项编译链接 例:命令:gcc test.c //会默认生成a.out可执行程序 2.-E: 进行预处理和编译,生成汇编 ...
- IPv4 forwarding is disabled. Networking will not work_问题解决
构建Docker镜像时遇见的问题,特做以下记录: 1.编辑 vi /etc/sysctl.conf 2.添加 net.ipv4.ip_forward=1 3.重启network服务 systemctl ...
- 并发编程之volatile
用代码描述这么一个场景,在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程结束,t1线程继续执行,直到循环结束 ...
- 对半导体制造(FAB)工种的全方位解析
本文转载自微信公众号 - 感集网, 链接 https://mp.weixin.qq.com/s/MRoWRbKZFBrJcQAZPqDa7w