一、什么是ES6?ES6和ES2015的关系?ECMAScript和JavaScript的关系?
JavaScript的创造者是Netscape公司,后将JavaScript提交给标准化组织ECMA,希望这种语言能够成为国际标准,ECMA规定的浏览器脚本语言标准就称之为ECMAScript,,该标准一开始就是针对JavaScript 语言制定的,之所以不叫JavaScript,有两个原因。一是商标,根据授权协议,只有Netscape公司可以使用JavaSciipt 这个名字,且JavaScript本身也已经被Netscape公司注册为商标了。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
ES6(ECMAScrpit 6.0)是一个泛指,是指ECMAScript 5.1版以后的JavaScript的下一代标准,包括ECMA2015(ECMA标准化组织2015年6月发布的版本)、ECMA2016(ECMA标准化组织2016年6月发布的版本)、ECMA2017(ECMA标准化组织2017年6月发布的版本)等等。
二、Babel转码器
Babel是一个广泛使用的ES6转码器,可以将 ES6 代码转为 ES5 代码,从而在现有环境执行。
三、配置文件.babelrc
Babel 的配置文件是 .babelrc ,存放在项目的根目录下。使用 Babel 的第一步,就是配置这个文件。
该文件用来设置转码规则和插件,基本格式如下。
{
"preset": [],
"plugins": []
}
presets 字段设定转码规则,官方提供以下的规则集,可根据需要再安装。
# 最新转码规则
$ npm install --save-dev babel-preset-latest
# react 转码规则
$ npm install --save-dev babel-preset-react
# 不同阶段语法提案的转码规则(共有4个阶段),选装一个
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3
{
"presets": [
"latest",
"react",
"stage-2"
],
"plugins": []
}
需要注意的是,以下所有 Babel 工具和模块的使用,都必须先写好 .babelrc 。
3.1 命令行转码 babel-cli
其安装命令如下:
$ npm install --global babel-cli
# 转码结果输出到标准输出
$ babel example.js
# 转码结果写入一个文件
# --out-file 或 -o 参数指定输出文件
$ babel example.js --out-file compiled.js
# 或者
$ babel example.js -o compiled.js
# 整个目录转码
# --out-dir 或 -d 参数指定输出目录
$ babel src --out-dir lib
# 或者
$ babel src -d lib
# -s 参数生成source map文件
$ babel src -d lib -s
不过可以将 babel-cli 安装在项目之中
# 安装
$ npm install --save-dev babel-cli
{
// ...
"devDependencies": {
"babel-cli": "^6.0.0"
},
"scripts": {
"build": "babel src -d lib"
},
}
$ npm run build
babel-cli 工具自带一个 babel-node 命令,提供一个支持 ES6 的 REPL(交互执行,交互式解释器) 环境。 它支持 Node 的 REPL 环境的所有功能,而且可以直接运行 ES6 代码。它不用安装,而是随着 babel-cli 一起安装。然后执行 babel-node 就进入 REPL 环境
$ babel-node
> (x => x * 2)(1)
2
babel-node 命令可以直接运行 ES6 脚本,将上面的代码放入脚本文件 es6.js ,然后这届运行
$ babel-node es6.js
2
$ npm install --save-dev babel-cli
{
"scripts": {
"script-name": "babel-node script.js"
}
}
babel-register 模块改写 require 命令,为它加上一个钩子。此后每当使用require加载.js、.jsx、.es和.es6后缀名的文件,就会先用 Babel 进行转码
$ npm install --save-dev babel-register
require("babel-register");
require("./index.js");
需要注意的是,babel-register只会对require命令加载的文件转码,而不会对当前文件转码。另外由于它是实时转码,所以只适合在开发环境下使用
3.4 babel-core
如果某些代码需要使用 Babel 的 API 进行转码,就要使用 babel-core 模块。
安装命令如下:
$ npm install babel-core --save
再在项目中就可以调用 babel-core
var babel = require('babel-core');
// 字符串转码
babel.transform('code();', options);
// => { code, map, ast }
// 文件转码(异步)
babel.transformFile('filename.js', options, function(err, result) {
result; // => { code, map, ast }
});
// 文件转码(同步)
babel.transformFileSync('filename.js', options);
// => { code, map, ast }
// Babel AST转码
babel.transformFromAst(ast, code, options);
// => { code, map, ast }
配置对象options
,可以参看官方文档http://babeljs.io/docs/usage/options/。
下面是一个例子。
var es6Code = 'let x = n => n + 1';
var es5Code = require('babel-core')
.transform(es6Code, {
presets: ['latest']
})
.code;
// '"use strict";\n\nvar x = function x(n) {\n return n + 1;\n};'
上面代码中,transform方法的第一个参数是一个字符串,表示需要被转换的ES6代码,第二个参数是转换的配置对象
3.5 babel-polyfill
Babel 默认只转换新的 JavaScript句法(syntax),而不转换新的API,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如object.assign)都不会转码。
举例说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想要让这个方法运行,就必须使用babel-polyfill,为当前环境提供一个垫片而。
安装命令如下:
$ npm install --save babel-polyfill
import 'babel-polyfill';
// 或者
require('babel-polyfill');
babel-plugin-transform-runtime
模块的definitions.js文件。Babel 提供一个REPL 在线编辑器 ,可以在线将 ES6 代码转换为 ES5 代码。转换后的代码可以直接作为 ES5 代码插入网页运行。
四、Traceur
Google 公司的Traceur转码器,也可以将 ES6 转码为 ES5代码。
4.1 直接插入网页
Traceur 允许将ES6 代码直接插入网页。首先需在网页头部加载 TRaceur 库文件
注意:第四个script标签的type属性的值是module,而不是text/javascript 。这是Traceur 编辑器识别 ES6代码的标志,编辑器会自动将所有type=module的代码编译为 ES5,r然后再交给浏览器执行。
除了引用外部的 ES6 脚本,也可以直接在网页中放置 ES6 代码。
在线转换
Traceur 也提供一个在线编译器,可以在线将 ES6 代码转为 ES5 代码。转换后的代码,可以直接作为 ES5 代码插入网页运行。
命令行转换
作为命令行工具使用时,Traceur是一个Node 的模块
$ npm install -g traceur
Traceur 直接运行 ES6 脚本文件,会在标准输出显示运行结果,以前面的calc.js为例
$ traceur calc.js
Calc constructor
9
如果要将 ES6 脚本转为 ES5保存,要采用下面的写法。
$ traceur --script calc.es6.js --out calc.es5.js
上面的代码的--script选项表示指定输入文件,--out选项表示指定输出文件。
为防止有些特性编译不成功,最好加上--experimental选项。
$ traceur --script calc.es6.js --out calc.es5.js --experimental
Node 环境的用法
Traceur 的 Node 用法如下(假定已安装traceur
模块)。
var traceur = require('traceur');
var fs = require('fs');
// 将 ES6 脚本转为字符串
var contents = fs.readFileSync('es6-file.js').toString();
var result = traceur.compile(contents, {
filename: 'es6-file.js',
sourceMap: true,
// 其他设置
modules: 'commonjs'
});
if (result.error)
throw result.error;
// result 对象的 js 属性就是转换后的 ES5 代码
fs.writeFileSync('out.js', result.js);
// sourceMap 属性对应 map 文件
fs.writeFileSync('out.js.map', result.sourceMap);