各大浏览器的最新版本,对ES6的支持可以查看kangax.github.io/es5-compat-table/es6/。随着时间的推移,支持度已经越来越高了,ES6的大部分特性都实现了。

Node.js是JavaScript语言的服务器运行环境,对ES6的支持度比浏览器更高。通过Node,可以体验更多ES6的特性。建议使用版本管理工具nvm,来安装Node,因为可以自由切换版本。不过,nvm不支持Windows系统,如果你使用Windows系统,下面的操作可以改用nvmw或nvm-windows代替。

安装nvm需要打开命令行窗口,运行下面的命令。

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/<version number>/install.sh | bash

上面命令的version number处,需要用版本号替换。本节写作时的版本号是v0.29.0。该命令运行后,nvm会默认安装在用户主目录的.nvm子目录。

然后,激活nvm。

$ source ~/.nvm/nvm.sh

激活以后,安装Node的最新版。

$ nvm install node

安装完成后,切换到该版本。

$ nvm use node

使用下面的命令,可以查看Node所有已经实现的ES6特性。

$ node --v8-options | grep harmony--harmony_typeof--harmony_scoping--harmony_modules--harmony_symbols--harmony_proxies--harmony_collections--harmony_observation--harmony_generators--harmony_iteration--harmony_numeric_literals--harmony_strings--harmony_arrays--harmony_maths--harmony

上面命令的输出结果,会因为版本的不同而有所不同。

我写了一个ES-Checker模块,用来检查各种运行环境对ES6的支持情况。访问ruanyf.github.io/es-checker,可以看到您的浏览器支持ES6的程度。运行下面的命令,可以查看你正在使用的Node环境对ES6的支持程度。

$ npm install -g es-checker
$ es-checker=========================================
Passes 24 feature Dectations
Your runtime supports 57% of ECMAScript 6
=========================================

Babel转码器

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。这意味着,你可以用ES6的方式编写程序,又不用担心现有环境是否支持。下面是一个例子。

// 转码前
input.map(item => item + 1);// 转码后
input.map(function (item) {return item + 1;
});

上面的原始代码用了箭头函数,这个特性还没有得到广泛支持,Babel将其转为普通函数,就能在现有的JavaScript环境执行了。

配置文件.babelrc

Babel的配置文件是.babelrc,存放在项目的根目录下。使用Babel的第一步,就是配置这个文件。

该文件用来设置转码规则和插件,基本格式如下。

{"presets": [],"plugins": []
}

presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。

# ES2015转码规则
$ npm install --save-dev babel-preset-es2015# react转码规则
$ npm install --save-dev babel-preset-react# ES7不同阶段语法提案的转码规则(共有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

然后,将这些规则加入.babelrc

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

注意,以下所有Babel工具和模块的使用,都必须先写好.babelrc。

命令行转码babel-cli
Babel提供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转码。这意味着,如果项目要运行,全局环境必须有Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支持不同项目使用不同版本的Babel。

一个解决办法是将babel-cli安装在项目之中。

# 安装
$ npm install --save-dev babel-cli

然后,改写package.json。

{// ..."devDependencies": {"babel-cli": "^6.0.0"},"scripts": {"build": "babel src -d lib"},
}

转码的时候,就执行下面的命令。

$ npm run build

babel-node

babel-cli工具自带一个babel-node命令,提供一个支持ES6REPL环境。它支持NodeREPL1环境的所有功能,而且可以直接运行ES6代码。

它不用单独安装,而是随babel-cli一起安装。然后,执行babel-node就进入REPL环境。

$ babel-node
> (x => x * 2)(1)
2

babel-node命令可以直接运行ES6脚本。将上面的代码放入脚本文件es6.js,然后直接运行。

$ babel-node es6.js
2

babel-node也可以安装在项目中。

$ npm install --save-dev babel-cli

然后,改写package.json

{"scripts": {"script-name": "babel-node script.js"}
}

上面代码中,使用babel-node替代node,这样script.js本身就不用做任何转码处理。

babel-register

babel-register模块改写require命令,为它加上一个钩子。此后,每当使用require加载.js.jsx.es和.es6后缀名的文件,就会先用Babel进行转码。

$ npm install --save-dev babel-register

使用时,必须首先加载babel-register

require("babel-register");
require("./index.js");

然后,就不需要手动对index.js转码了。

需要注意的是,babel-register只会对require命令加载的文件转码,而不会对当前文件转码。另外,由于它是实时转码,所以只适合在开发环境使用。

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: ['es2015']}).code;
// '"use strict";\n\nvar x = function x(n) {\n  return n + 1;\n};'

上面代码中,transform方法的第一个参数是一个字符串,表示需要被转换的ES6代码,第二个参数是转换的配置对象。

babel-polyfill

Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如IteratorGeneratorSetMapsProxyReflectSymbolPromise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。

举例来说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。

安装命令如下。

$ npm install --save babel-polyfill

然后,在脚本头部,加入如下一行代码。

import 'babel-polyfill';
// 或者
require('babel-polyfill');

Babel默认不转码的API非常多,详细清单可以查看babel-plugin-transform-runtime模块的definitions.js文件。

浏览器环境

Babel也可以用于浏览器环境。但是,从Babel 6.0开始,不再直接提供浏览器版本,而是要用构建工具构建出来。如果你没有或不想使用构建工具,可以通过安装5.x版本的babel-core模块获取。

$ npm install babel-core@5

运行上面的命令以后,就可以在当前目录的node_modules/babel-core/子目录里面,找到babel的浏览器版本browser.js(未精简)和browser.min.js(已精简)。

然后,将下面的代码插入网页。

<script src="node_modules/babel-core/browser.js"></script>
<script type="text/babel">
// Your ES6 code
</script>

上面代码中,browser.js是Babel提供的转换器脚本,可以在浏览器运行。用户的ES6脚本放在script标签之中,但是要注明type="text/babel"

另一种方法是使用babel-standalone模块提供的浏览器版本,将其插入网页。

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.4.4/babel.min.js"></script>
<script type="text/babel">
// Your ES6 code
</script>

注意,网页中实时将ES6代码转为ES5,对性能会有影响。生产环境需要加载已经转码完成的脚本。

下面是如何将代码打包成浏览器可以使用的脚本,以Babel配合Browserify为例。首先,安装babelify模块。

$ npm install --save-dev babelify babel-preset-es2015

然后,再用命令行转换ES6脚本。

$  browserify script.js -o bundle.js \-t [ babelify --presets [ es2015 ] ]

上面代码将ES6脚本script.js,转为bundle.js,浏览器直接加载后者就可以了。

在package.json设置下面的代码,就不用每次命令行都输入参数了。

{"browserify": {"transform": [["babelify", { "presets": ["es2015"] }]]}
}

在线转换

Babel提供一个REPL在线编译器,可以在线将ES6代码转为ES5代码。转换后的代码,可以直接作为ES5代码插入网页运行。

与其他工具的配合

许多工具需要Babel进行前置转码,这里举两个例子:ESLintMocha

ESLint用于静态检查代码的语法和风格,安装命令如下。

$ npm install --save-dev eslint babel-eslint

然后,在项目根目录下,新建一个配置文件.eslintrc,在其中加入parser字段。

{"parser": "babel-eslint","rules": {...}
}

再在package.json之中,加入相应的scripts脚本。

  {"name": "my-module","scripts": {"lint": "eslint my-files.js"},"devDependencies": {"babel-eslint": "...","eslint": "..."}}

Mocha则是一个测试框架,如果需要执行使用ES6语法的测试脚本,可以修改package.jsonscripts.test

"scripts": {"test": "mocha --ui qunit --compilers js:babel-core/register"
}

上面命令中,--compilers参数指定脚本的转码器,规定后缀名为js的文件,都需要使用babel-core/register先转码。

Traceur转码器

Google公司的Traceur转码器,也可以将ES6代码转为ES5代码。

直接插入网页

Traceur允许将ES6代码直接插入网页。首先,必须在网页头部加载Traceur库文件。

<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/bin/BrowserSystem.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script type="module">import './Greeter.js';
</script>

上面代码中,一共有4个script标签。第一个是加载Traceur的库文件,第二个和第三个是将这个库文件用于浏览器环境,第四个则是加载用户脚本,这个脚本里面可以使用ES6代码。

注意,第四个script标签的type属性的值是module,而不是text/javascript。这是Traceur编译器识别ES6代码的标志,编译器会自动将所有type=module的代码编译为ES5,然后再交给浏览器执行。

除了引用外部ES6脚本,也可以直接在网页中放置ES6代码。

<script type="module">class Calc {constructor(){console.log('Calc constructor');}add(a, b){return a + b;}}var c = new Calc();console.log(c.add(4,5));
</script>

正常情况下,上面代码会在控制台打印出9。

如果想对Traceur的行为有精确控制,可以采用下面参数配置的写法。

<script>// Create the System objectwindow.System = new traceur.runtime.BrowserTraceurLoader();// Set some experimental optionsvar metadata = {traceurOptions: {experimental: true,properTailCalls: true,symbols: true,arrayComprehension: true,asyncFunctions: true,asyncGenerators: exponentiation,forOn: true,generatorComprehension: true}};// Load your moduleSystem.import('./myModule.js', {metadata: metadata}).catch(function(ex) {console.error('Import failed', ex.stack || ex);});
</script>

上面代码中,首先生成Traceur的全局对象window.System,然后System.import方法可以用来加载ES6模块。加载的时候,需要传入一个配置对象metadata,该对象的traceurOptions属性可以配置支持ES6功能。如果设为experimental: true,就表示除了ES6以外,还支持一些实验性的新功能。

在线转换

Traceur也提供一个在线编译器,可以在线将ES6代码转为ES5代码。转换后的代码,可以直接作为ES5代码插入网页运行。

上面的例子转为ES5代码运行,就是下面这个样子。

<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/bin/BrowserSystem.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script>
$traceurRuntime.ModuleStore.getAnonymousModule(function() {"use strict";var Calc = function Calc() {console.log('Calc constructor');};($traceurRuntime.createClass)(Calc, {add: function(a, b) {return a + b;}}, {});var c = new Calc();console.log(c.add(4, 5));return {};
});
</script>

命令行转换

作为命令行工具使用时,Traceur是一个Node的模块,首先需要用Npm安装。

$ npm install -g traceur

安装成功后,就可以在命令行下使用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.js环境的用法

TraceurNode.js用法如下(假定已安装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);

参考资料:
https://blog.csdn.net/bigbear00007/article/details/106657925

ECMAScript 6细说转码的常见的几种方案相关推荐

  1. 一文详解AES最常见的3种方案_AES-128、AES-192和AES-256

    AES简介 1.AES是一种区块加密标准算法,它的提出是为了升级替换原有的DES加密算法.因此它的安全强度高于DES算法.但不应片面理解,系统和数据的安全不仅与应用的加密算法有关,更与加密应用方案有关 ...

  2. php源码编译常见错误解决方案大全

    php源码编译常见错误解决方案大全 http://www.cnlvzi.com/index.php/Index/article/id/143 在CentOS编译PHP5的时候有时会遇到以下的一些错误信 ...

  3. HTTP常见的14种状态码

    HTTP状态码表示客户端HTTP请求的返回结果.标记服务器端的处理是否正常或者是出现的错误,能够根据返回的状态码判断请求是否得到正确的处理很重要. 状态码由3位数字和原因短语组成,例如下图所示: 数字 ...

  4. HTTP常见的三种状态码(400 / 404 / 500)

    HTTP常见的三种状态码(400 / 404 / 500) 1.400-服务器不理解请求的语法 400 是 HTTP 的状态码,主要有两种形式: 1)bad request 意思是 "错误的 ...

  5. 常见的几种扫码支付方式

    目前,以支付宝和微信为代表的扫码支付正在各个线下消费场景中攻城略地,也给我们的生活带来了不小的方便.今天就来聊聊生活中常见的几种扫码支付方式. 1. 扫码转账 支付流程:用户点击支付宝扫一扫,扫码商家 ...

  6. 95码号、106码号申请时常见的几种错误

    每天,我们都能收到不少短信,来自银行的通知.物流的提醒.商家店铺的促销.发送的号码,一开始是常见的手机号码,慢慢的越来越多地变成106开头或95开头的号码.这类码号具有较高的含金量和良好的识别率,也是 ...

  7. 计算机网络常见面试问题 —— HTTP状态码以及常见的请求字段

    HTTP状态码以及常见的请求字段 HTTP状态码以及常见的请求字段 1.HTTP 概述和特征 1.HTTP状态码 2.HTTP常见的请求字段 参考 HTTP状态码以及常见的请求字段 1.HTTP 概述 ...

  8. java runtime shell_java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现...

    Runtime.getRuntime().exec()执行JVM之外的程序:常见的几种陷阱 前言 日常java开发中,有时需要通过java运行其它应用功程序,比如shell命令等.jdk的Runtim ...

  9. layout布局_安卓最常见的几种布局

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件 帧布局(FrameLayout):组件从屏幕左上方布局组件 表格布局(TableL ...

  10. 盘一盘常见的6种索引失效情况

    摘要:今天就来跟大家盘一盘,常见的 6 种会发生索引失效的场景. 本文分享自华为云社区<面试官:聊聊索引失效?失效的原因是什么?>,作者:小林coding . 在工作中,如果我们想提高一条 ...

最新文章

  1. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...
  2. python官网怎么改中文-pycharm如何设置成中文
  3. 如何在linux服务器上使用hanlp
  4. 零基础转行学Web前端,需要掌握哪些技术?
  5. java 判断一个字符串是否由数字组成的_Java中怎样判断一个字符串是否是数字
  6. cmw500综合测试仪使用_山西优质三相直流电阻测试仪图片-南电合创
  7. [渝粤教育] 三江学院 软件测试 参考 资料
  8. 嘉兴python培训_嘉服集团
  9. Git如何生成多个ssh key添加到ssh-agent管理项目
  10. windows 7 64bit python3.3安装pyqt
  11. 专业制造计算机电缆,茶陵DJYP2VP2-22计算机电缆专业制造
  12. 计算机辅助设计rhino试题,计算机辅助设计基础期末复习试题(完整版).doc
  13. java对excel插入水印_Java通过POI和JXL给Excel动态添加水印
  14. 二层交换机和三层交换机的工作原理
  15. zblog php 调用缩略图,zblog调用文章缩略图的方法
  16. 在 cmd 中启动 Android 模拟器
  17. Harris角点检测,及其Matlab和OpenCV实现
  18. 自制一个简单的音乐播放器
  19. 100个python算法超详细讲解:递归解决分鱼问题
  20. 辗转相除法的原理,一看就懂,一学就会

热门文章

  1. python list的+=操作
  2. Python与MongoDB的交互
  3. 从输入url到页面展现发生了什么?
  4. centos7搭建smb服务
  5. cocos2dx 制作单机麻将(四)
  6. UnicodeEncodeError: #39;ascii#39; codec can#39;t encode character u#39;\u5929#39; in position 2...
  7. 博客6:磁盘以及创建文件系统的相关知识点
  8. 小黑小波比.coding的使用
  9. 61. 创建快速响应的Web应用
  10. 53. Using a Custom Admin URL