文档章节

Nodejs原生支持的ES6特性

黑魔法
 黑魔法
发布于 2016/07/05 14:43
字数 1367
阅读 18
收藏 0

随着React的风靡,配合Webpack以及Babel等技术,越来越多的前端同学将ECMAScript 2015(ES6)的特性运用在项目中,import、export、class、箭头函数、块级作用域等特性屡试不爽。而对于Node.js实现的后台代码来说,我们也同样希望使用这些ES6特性,下面将以v4.4.4(LTS version)长期支持版本为例展开话题,从兼容性以及性能两方面着手分析Node.js对ES6的支持情况。

兼容性

随着io.js的引入,新版的Node.js开始原生支持部分ES6的特性,既然ES6在浏览器端使用需要通过babel等编译,在Node.js总可以放心使用了吧,然而事实并非如此。

所有的ES6特性被划分为三个级别:

  1. shipping:已经分发并默认开启的特性;
  2. staged:已经分发,但需要使用 –harmony 参数开启的特性;
  3. in progress:开发中,还不稳定或者未实现的特性,不推荐使用;

Nodejs各个版本对ES6特性的兼容列表见: http://node.green/

【shipping】

ES6特性 Nodejs兼容性
let,const,块 strict模式支持
class类 strict模式支持
Map,Set 和 WeakMap,WeakSet 支持
generators 支持
进制转换 支持
对象字面量扩展 支持
promise 支持
String对象新API 支持
symbols 支持
字符串模板 支持

这些都是Node.js原生支持的特性,除了前两个特性需要在代码前面添加’use strict’。

【staged】

  • Symbol.toStringTag
  • Array.prototype.includes
  • Rest Parameters
  • ……

可通过node –v8-options | findstr harmony进行查看。在执行带有这些特性的js代码时,需要加上–harmony参数,例如:node –harmony app.js。

【in progress】

  • harmony_modules (enable "harmony modules")
  • harmony array includes (enable "harmony Array.prototype.includes")
  • harmony_regexps (enable "harmony regular expression extensions")
  • harmony new target (enable "harmony new.target")
  • ……

可通过node –v8-options | findstr "in progress"进行查看。这些特性是那些将要支持(但具体时间未知)的特性,不建议使用。

Node.js 6.x 已经支持 93% 的ES6特性

从上面分析可以看到,Node.js 4.x版本对ES6特性的原生支持并不好,但是好消息是,Node.js 6.x LTS version将要发布了,带来了性能的大幅提升、更好的测试、更完善的文档、更好的安全性,并广泛支持了ES6。

在 Node.js 5.0 发布了6个月以后,6.0的时代马上就来了,目标是替换 4.x,计划在2016年10月成为下一个LTS version(长期支持的版本),5.0 只是一个过渡版本。考虑到产品的稳定性,建议大家目前还是继续使用 Node.js 4.x,直到10月份。

Node.js 6.x 的一项重要改进是使用了V8 5.0引擎,支持了93%以上的ES6,包括 destructuring、rest 参数、class和super关键字,ES6还没有被覆盖到的只剩下一小部分,包括 direct、mutual recursion、iterator closing 等。

让我们一起期待吧!

性能

ES6是大势所趋,尽管目前Node下使用ES6仍然存在很多问题,这里还是有必要对ES6的原生性能做一下对比测试,好让大家有个量化的概念。

环境描述:

CPU:Intel(R) Core(TM)i7-4790 CPU @ 3.60GHz

RAM:16.0GB

操作系统:64bit

node版本:v4.4.4

1.块级作用域

测试代码如下:

ES5:

var i = 0;
var start = +new Date(),
    duration;
 
while(i++ < 1000000){
    var a = 1;
    var b = '1';
    var c = true;
    var d = {};
    var e = [];
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为45ms。

ES6:

'use strict'
let i = 0;
letstart = +new Date(),
    duration;
 
while(i++ < 1000000){
    const a = 1;
    const b = '1';
    const c = true;
    const d = {};
    const e = [];
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为29ms。

可见,使用let,const声明变量的速度比var快了约55%左右。

2.class

测试代码如下:

ES5:

var i = 0;
var start = +new Date(),
    duration;
 
function A(){
    this.name = '小强';
}
A.prototype.getName = function() {
    return this.name;
};
 
while(i++ < 100000){
    var a = new A();
    a.getName();
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为2ms。

ES6:

'use strict'
let i = 0;
letstart = +new Date(),
    duration;
 
class A{
    constructor() {
      this.name = '小强';
    }
    getName(){
        return this.name;
    }
}
 
while(i++ < 100000){
    const a = new A();
    a.getName();
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为974ms。

可见,class没有丝毫优势,function真是快的不得了。

3.Map

测试代码如下:

ES5:

var i = 0;
var start = +new Date(),
    duration;
 
while(i++ < 1000000){
    var map = {};
    map['key'] = 'value';
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为11ms。

ES6:

'use strict'
let i = 0;
letstart = +new Date(),
    duration;
 
while(i++ < 1000000){
 
    letmap = new Map();
    map.set('key','value');
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为151ms。

建议如果不是必须情况,不要使用Map等复杂类型。

4.字符串模板

测试代码如下:

ES5:

var i = 0;
var start = +new Date(),
    duration;
 
var vars = {
    name: 'haha',
    address: 'tencent'
}
 
while(i++ < 1000000){
    var str = 'string text ' + vars.name + 'string '+ vars.address;
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为8ms。

ES6:

'use strict'
let i = 0;
letstart = +new Date(),
    duration;
 
letvars = {
    name: 'haha',
    address: 'tencent'
};
 
while(i++ < 1000000){
    letstr = `string text ${vars.name} string ${vars.address}`;
}
 
duration = +new Date() - start;
console.log(duration);
 

输出结果为50ms。

字符串模板在执行时由于会首先找出其中的模板变量,所以性能也是大不如ES5的字符串拼接。

其他特性有兴趣的同学可以一一做测试。

总结

对于ES6来说,我们不仅要了解其特性的兼容性,也要从性能上做到心中有数,从上面的测试结果可以看到,大部分ES6新特性相对ES5原生方法要慢得多,但是我依然坚信,ES6是未来的趋势,随着Node版本的更新,相信这些兼容性以及性能问题在不久的将来都将迎刃而解。

本文转载自:http://www.tuicool.com/articles/viymUz

共有 人打赏支持
黑魔法
粉丝 13
博文 176
码字总数 44775
作品 0
武汉
前端工程师
私信 提问
张成文——ECMAScript 6 开发体系实践

2016年04月23日14:00時,在武汉市东湖高新技术开发区民院路38号纽宾凯鲁广国际酒店(光谷步行街地铁C出口省测绘局斜对面),舉行的规模在800人左右的2016源创会武汉站。由张成文(腾讯SNG web)分...

yunwangjun
2016/04/24
2.3K
1
[NodeJs系列]NodeJs模块机制

注: 1. 本文涉及的nodejs源码如无特别说明则全部基于v10.14.1 如果你对NodeJs系列感兴趣,欢迎关注前端神盾局或笔者微信(w979436427)交流讨论node学习心得 Nodejs 中对模块的实现 本节主要基...

superTerrorist
01/19
0
0
koahubjs 1.0.0 发布,基于 Koa.js 快速开发框架

koahubjs 发布 1.0.0 正式版,基于 Koa.js 的快速开发框架。 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架。可以直接在项目里使用 ES6/7(Generator Function, Class, Async ...

einsqing
2017/01/07
1K
6
KoaHub.js 2.0.0 发布,Node.js web快速开发框架

KoaHub.js 2.0.0 发布了。主要更新如下: 【升级】升级koa2和依赖 【优化】内置body,session,cors,static中间件 【新增】新增this.validate,数据验证。 【新增】koahub.js入门视频教程,...

einsqing
2017/03/01
1K
4
Node.js Web 快速开发框架 - Doodoo.js

简介 Doodoo.js -- 中文最佳实践Node.js Web快速开发框架。支持Koa.js中间件,支持模块化,插件,钩子机制,可以直接在项目里使用 ES6/7(Generator Function, Class, Async & Await)等特性...

einsqing
2018/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

grafana安装使用及与zabbix集成

grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询、分析、可视化处理以及配置告警。 Grafana支持的数据源: 官方:Graphite,InfluxDB,Ope...

阿dai学长
34分钟前
6
0
带你看数据挖掘与机器学习-厦大EDP上课出勤预测

带你看数据挖掘与机器学习-厦大EDP上课出勤预测 标签: 数据挖掘 特征工程 机器学习 出勤预测 write by xmhexi 2019/3/22 内容提要 首先说明本文是一篇科普文章,通过一个实际案例,帮助理解什...

xmhexi
今天
85
0
IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
5
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
5
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部