博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Babel中的stage-0、stage-1、stage-2、stage-3
阅读量:4538 次
发布时间:2019-06-08

本文共 4579 字,大约阅读时间需要 15 分钟。

大家知道,将ES6代码编译为ES5时,我们常用到Babel这个编译工具。大家参考一些网上的文章或者官方文档,里面常会建议大家在.babelrc中输入如下代码:

{    "presets": [      "es2015",      "react",      "stage-0"    ],    "plugins": []  }

babel 总共分为三个阶段:解析,转换,生成。

我们需要知道现在 babel 本身是不具备这种转化功能,提供这些转化功能的是一个个 plugin。所以我们没有配置任何 plugin 的时候,经过 Babel 输出的代码是没有改变的
下面我们来了解一下Babel中的stage-0、stage-1、stage-2、stage-3ji及它们支持的一些插件

1. 法力无边的stage-0

为什么说“stage-0” 法力无边呢,因为它包含stage-1, stage-2以及stage-3的所有功能,同时还另外支持如下两个功能插件:

transform-do-expressionstransform-function-bind

用过React的同学可能知道,jsx对条件表达式支持的不是太好,你不能很方便的使用if/else表达式,要么你使用三元表达,要么用函数。例如你不能写如下的代码:

var App = React.createClass({    render(){        let { color } = this.props;        return (            
{ if(color == 'blue') {
; }else if(color == 'red') {
; }else {
; } } }
) }})

在React中你只能写成这样:

var App = React.createClass({    render(){        let { color } = this.props;        const getColoredComponent = color => {            if(color === 'blue') { return 
; } if(color === 'red') { return
; } if(color === 'green') { return
; } } return (
{ getColoredComponent(color) }
) }})

transform-do-expressions 这个插件就是为了方便在 jsx写if/else表达式而提出的,我们可以重写下代码。

var App = React.createClass({    render(){        let { color } = this.props;        return (            
{do { if(color == 'blue') {
; }else if(color == 'red') {
; }else {
; } } }}
) }})

再说说 transform-function-bind, 这个插件其实就是提供过 :: 这个操作符来方便快速切换上下文, 如下面的代码:

obj::func// is equivalent to:func.bind(obj)obj::func(val)// is equivalent to:func.call(obj, val)::obj.func(val)// is equivalent to:func.call(obj, val)// 再来一个复杂点的样例const box = {  weight: 2,  getWeight() { return this.weight; },};const { getWeight } = box;console.log(box.getWeight()); // prints '2'const bigBox = { weight: 10 };console.log(bigBox::getWeight()); // prints '10'// Can be chained:function add(val) { return this + val; }console.log(bigBox::getWeight()::add(5)); // prints '15'
2. 包罗万象的stage-1

stage-1除了包含stage-2和stage-3,还包含了下面4个插件:

transform-class-constructor-call (Deprecated)transform-class-propertiestransform-decorators – disabled pending proposal updatetransform-export-extensions
3. 深藏不露的stage-2

为什么说 stage-2深藏不露呢,因为它很低调,低调到你可以忽略它,但事实上,它很有内涵的。它除了覆盖stage-3的所有功能,还支持如下两个插件:

syntax-trailing-function-commastransform-object-reset-spread

syntax-trailing-function-commas这个插件它不是对ES6功能的增加,而是为了增强代码的可读性和可修改性而提出的

// 假设有如下的一个函数,它有两个参数function clownPuppiesEverywhere(  param1,  param2) { /* ... */ }clownPuppiesEverywhere(  'foo',  'bar');// 有一天,它需要变成3个参数,你需要这样修改function clownPuppiesEverywhere(  param1,- param2+ param2, // 这一行得加一个逗号+ param3  // 增加参数param3) { /* ... */ }clownPuppiesEverywhere(  'foo',- 'bar'+ 'bar', // 这里的修改为逗号+ 'baz'  // 增加新的参数);

// 我们来重新定义一下函数

function clownPuppiesEverywhere(  param1,  param2, // 注意这里,我们加了一个逗号哟) { /* ... */ }clownPuppiesEverywhere(  'foo',  'bar', // 这里我们也加了一个逗号);// 现在函数需要三个参数,我们来修改下function clownPuppiesEverywhere(  param1,  param2,+ param3, // 增加params3参数) { /* ... */ }

stage-2中的syntax-trailing-function-commas就是有"尾逗号函数”功能

transform-object-rest-spread

再来说transform-object-rest-spread, 其实它是对 ES6中解构赋值的一个扩展,因为ES6只支持对数组的解构赋值,对对象是不支持的。如下面的代码所示:

// 获取剩下的属性

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };console.log(x); // 1console.log(y); // 2console.log(z); // { a: 3, b: 4 }// 属性展开let n = { x, y, ...z };console.log(n); // { x: 1, y: 2, a: 3, b: 4 }
4. 深藏不露的stage-3

为啥说stage3大放异彩呢?因为它支持大名鼎鼎的async和await, 这两个哥们可是解决(Ajax)回调函数的终极解决方法呀!管你什么异步,我都可以用同步的思维来写,ES7里面非常强悍的存在。总的来说,它包含如下两个插件:

transform-async-to-generatortransform-exponentiation-operator

transform-async-to-generator主要用来支持ES7中的async和await

提示: 由于asycn和await是ES7里面的内容,现阶段不建议使用。为了顺利运行上面的代码,建议用webpack进行编译。
transform-exponentiation-operator
transform-exponentiation-operator这个插件算是一个语法糖,可以通过**这个符号来进行幂操作,想当于Math.pow(a,b)。如下面的样例

// x ** ylet squared = 2 ** 2;// 相当于: 2 * 2let cubed = 2 ** 3;// 相当于: 2 * 2 * 2// x **= ylet a = 2;a **= 2;// 相当于: a = a * a;let b = 3;b **= 3;// 相当于: b = b * b * b;

结语:在进行实际开发时,可以更具需要来设置对应的stage。如果省事懒得折腾,一般设置为stage-0即可。如果为了防止开发人员使用某些太新的功能,我们可以限制到某个特定的stage即可

转载于:https://www.cnblogs.com/IT123/p/11327551.html

你可能感兴趣的文章
Java之路——Java初接触
查看>>
2018.12.27学习JavaScript
查看>>
Cocoa编程开发者手册
查看>>
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
查看>>
理工之 A+B Problem III
查看>>
SalesForce自定义按钮(javascript执行),点击按钮更新Filed
查看>>
软件工程第一次作业
查看>>
【Android 界面效果24】Intent和PendingIntent的区别
查看>>
node学习之搭建服务器并加装静态资源
查看>>
android 按menu键解锁功能的开关
查看>>
wpf 自定义窗口,最大化时覆盖任务栏解决方案
查看>>
Linux 下的dd命令使用详解
查看>>
POJ-1273 Drainage Ditches 最大流Dinic
查看>>
ASP.NET学习记录点滴
查看>>
uva 12097(二分)
查看>>
[Noip2016] 愤怒的小鸟
查看>>
Linux系统基础管理
查看>>
JAVA wait()和notifyAll()实现线程间通讯
查看>>
python全栈脱产第11天------装饰器
查看>>
koa2 从入门到进阶之路 (一)
查看>>