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

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

我们现在来说明下这个配置文件是什么意思。首先,这个配置文件是针对babel 6的。Babel 6做了一系列模块化,不像Babel 5一样把所有的内容都加载。比如需要编译ES6,我们需要设置presets为"es2015",也就是预先加载es6编译的相关模块,如果需要编译jsx,需要预先加载"react"这个模块。那问题来了,这个"stage-0"又代表什么呢? 有了"react-0",是否又有诸如"stage-1", "stage-2"等等呢?

事实上, ”stage-0"是对ES7一些提案的支持,Babel通过插件的方式引入,让Babel可以编译ES7代码。当然由于ES7没有定下来,所以这些功能随时肯能被废弃掉的。现在我们来一一分析里面都有什么。

1. 法力无边的stage-0

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

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

var App = React.createClass({

    render(){
let { color } = this.props; return (
<div className="parents">
{
if(color == 'blue') {
<BlueComponent/>;
}else if(color == 'red') {
<RedComponent/>;
}else {
<GreenComponent/>; }
}
}
</div>
)
}
})

在React中你只能写成这样:

var App = React.createClass({

    render(){
let { color } = this.props; const getColoredComponent = color => {
if(color === 'blue') { return <BlueComponent/>; }
if(color === 'red') { return <RedComponent/>; }
if(color === 'green') { return <GreenComponent/>; }
} return (
<div className="parents">
{ getColoredComponent(color) }
</div>
)
}
})

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

var App = React.createClass({

    render(){
let { color } = this.props; return (
<div className="parents">
{do {
if(color == 'blue') {
<BlueComponent/>;
}else if(color == 'red') {
<RedComponent/>;
}else {
<GreenComponent/>; }
}
}}
</div>
)
}
})

再说说 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'

如果想更屌点,还可以写出更牛逼的代码:

const { map, filter } = Array.prototype;

let sslUrls = document.querySelectorAll('a')
::map(node => node.href)
::filter(href => href.substring(0, 5) === 'https'); console.log(sslUrls);

2. 包罗万象的stage-1

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

今天就到这里了,改天我们接着分析下"stage-2"和"stage-3", 它们又有什么新的特性呢,让我们拭目以待吧。

如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(一)的更多相关文章

  1. 如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(二)

    上一篇文章我们介绍了法力无边的stage-0 和 包罗万象的stage-1, 现在我们来介绍下 stage-2 和 stage-3 深藏不露的stage-2 为什么说 stage-2深藏不露呢,因为它 ...

  2. spark1.1.0源码阅读-dagscheduler and stage

    1. rdd action ->sparkContext.runJob->dagscheduler.runJob def runJob[T, U: ClassTag]( rdd: RDD[ ...

  3. WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, worker1): java.lang.ClassNotFoundException: com.spark.firstApp.HelloSpark$$anonfun$2

    进行如下设置,解决报错信息. val conf = new SparkConf().setAppName("helloSpark").setMaster("spark:/ ...

  4. JavaScript Array 对象方法 以及 如何区分javascript中的toString()、toLocaleString()、valueOf()方法

    1.concat() 2.join() 3.pop() 4.push() 5.reverse() 6.shift() 7.unshift() 8.slice() 9.sort() 10.splice( ...

  5. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  6. win7中VS2010中安装CSS3.0问题解决方法

    win7中VS2010中安装CSS3.0问题解决方法   在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...

  7. 【原】webapp开发中兼容Android4.0以下版本的css hack

    话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...

  8. jquery中$("#afui").get(0)为什么要加get(0)呢?

    jquery中$("#afui").get(0)为什么要加get(0)呢? 2015-04-13 17:46SYYZZ3 | 浏览 509 次  Jquery $("#a ...

  9. C/C++ 中长度为0的数组

    参考文献:http://blog.csdn.net/zhaqiwen/article/details/7904515 近日在看项目中的框架代码时,发现了了一个奇特的语法:长度为0的数组例如 uint8 ...

随机推荐

  1. 写简单游戏,学编程语言-python篇:大鱼吃小鱼

    很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码.这边主要还是以学习编程语言和学习编程思路为重点记录一下吧.最近时间有点吃紧,只能匆忙记录一下.用pygame做的大鱼吃小鱼的游戏截图如下: ...

  2. .net 下判断中英文字符串长度

    System.Text.Encoding.Default.GetBytes(str).Length

  3. 题目: 求1+2+...+n,要求不使用乘除发、for、while、if、else、switch、case、等关键字以及条件判断语句(A?B:C)

    #include <iostream> using namespace std; int add_(int a,int b){ return 0; } int Add(int i,bool ...

  4. Ruby的基本语法-数组

    Ruby中数组的实例 1.color=["Red", "Green" ,"Blue"] #数组赋值

  5. Meta http-equiv的属性详解 来自wanglehui

    Meta http-equiv 语法标签格式:<meta http-equiv="参数" content="参数值"> 1."过期时间&q ...

  6. 重磅来袭,水木PC客户端全面改版,欢迎使用!

    2016-11-04   下载 最新更新            1.优化帖子中回文内容的显示,采用相比正文较小的字体,以及置灰处理,突出正文.           2.可配置是否隐藏帖子中的IP和修改 ...

  7. 关于一个通俗易懂的FFT的C语言实现教程

    找到一个通俗易懂并且神奇并且有趣的FFT算法C语言实现教程:http://www.katjaas.nl/FFTimplement/FFTimplement.html 只要对矩阵比较熟悉就能在教程的辅助 ...

  8. 2015.10.15class

    #include<stdio.h> main() { int a; printf("你的智商是多少?\n"); scanf("%d",&a) ...

  9. ThinkPHP BASE

      对于thinkphp 开源框架来说  是一个基于  模型/控制器/视图 的结构 V(View):视图接收来自用户操作的信息返回到 对应的控制器或方法 C (controller):控制器则调用 相 ...

  10. C++ CreateThread 实例

    //ThreadBase.h#pragma once #include<windows.h> class CThreadBase { public: CThreadBase(void); ...