内容简介:以 async/await 为例,说明 babel 插件怎么搭
你一定碰到过这些库
babel-polyfill
项目地址: https://github.com/babel/babe...
通过两个依赖实现功能
-
core-js/shim
提供 ES5/6/7 标准方法的实现 -
regenerate-runtime
提供 async 语法编译后的的运行时环境(下文会专门说明)
babel-plugin-transform-runtime
项目地址: https://github.com/babel/babe...
开发 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/babe...
代码很少,只依赖于 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/babe...
别忘了 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/sabakugaar...
本文整理自: https://github.com/sabakugaar...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 日程日历系统,顶级插件FullCalendar使用说明
- 页面滚动无限加载jQuery插件jquery.infinitescroll.js使用说明
- SDWebImage中文说明
- Kafka配置说明
- ekphrasis使用说明
- Haskell长度图说明?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
张琨、张宏、朱保平 / 人民邮电出版社 / 2016-2-1 / 45
本书共分10章,主要包括第1章绪论,第2章线性表,第3章栈和队列,第4章串,第5章数组和广义表,第6章 树和二叉树,第7章图,第8章查找,第9章内部排序,第10章算法分析。其内容模块涵盖了课堂教学、习题课教学、实验教学、自学辅导、综合训练等。立体化教材的使用在提高教学效率、增强教学效果、加大教学信息量、培养学生的应用与实践能力。 作者简介一起来看看 《数据结构与算法分析》 这本书的介绍吧!