node中使用es6/7/8(支持性与性能)

前言

这几年react、vue的快速发展,越来越多的前端开始讲es6的代码运用在项目中,因为我们可以通过babel进行转译为低版本的js以便于运行在所有浏览器中,import、export、let、箭头函数等等,对于node端,当然我们也希望使用这些高级语法,但是需要提前了解到node支持哪些新的语法。

分类

所有的es6特性被分成了三个阶段/分类:

  • shipping --- v8引擎可以支持的很好,默认情况下我们是不需要设立任何的flag而可以直接运行的。
  • staged --- 这些是将要完成的新特性但是还不能被v8引擎所支持,需要使用 runtime flag: --harmony。
  • in progress --- 这些特性是最好不要使用的,因为很有可能未来会被废弃,具有不确定性。

那么那些特性是nodejs版本默认支持的呢?

可以看到,我们常用的一些es6语法,node的支持已经很好了,因为当前node的最新版本已经是 6.11.2 了,这是推荐使用的版本,而最新的版本已经达到了8.3.0 。

所以我们在node端写es6语法时,大部分是可以直接使用的。但是对于es7/8的特性,目前还不能很好的支持。

哪些特性是在开发中呢?

新的特性在不断地添加到v8引擎中去, 一般的说, 还是期待他们到最新的v8引擎中的,尽管不知道是什么时候。

你可以通过grepping来列出所有的in progress的特性,即使用 --v8-options 参数。 值得注意的是, 这些还是兼容性不好的特性,所有需要谨慎的使用他们。

性能 

es6是大势所趋,我们不仅需要了解其特性的兼容性,还要早性能上做到心中有数,下面我们可以对es5和es6在node上跑来比较时间。

块级作用域

es5测试:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 1000000000) {
 var a = 1;
 var b = '2';
 var c = true;
 var d = {};
 var e = [];
}

duration = +new Date() - start;
console.log(duration)

多次测试,耗时分别为 11972/11736/11798

es6测试:

let i = 0;
let start = +new Date(),
 duration;

while (i++ < 1000000000) {
 const a = 1;
 const b = '2';
 const c = true;
 const d = {};
 const e = [];
}

duration = +new Date() - start;
console.log(duration)

经过多次测试, 耗时分别为 11583/11674/11521。

在这一方面使用es6语法略快。

class

es5语法

var i = 0;
var start = +new Date(),
 duration;

function Foo() {;
 this.name = 'wayne'
}

Foo.prototype.getName = function () {
 return this.name;
}

var foo = {};

while (i++ < 10000000) {
 foo[i] = new Foo();
 foo[i].getName();
}

duration = +new Date() - start;

console.log(duration)

经过测试,耗时分别为 2030/2062/1919ms。

es6语法:

注意: 因为我们这里只是测试class,所以两者都是用var来声明变量,即单一变量原则。

var i = 0;
var start = +new Date(),
 duration;

class Foo {
 constructor() {
  this.name = 'wayne'
 }
 getName () {
  return this.name;
 }
}

var foo = {};

while (i++ < 10000000) {
 foo[i] = new Foo();
 foo[i].getName();
}

duration = +new Date() - start;

console.log(duration)

经过三轮测试,结果分别是 2044/2129/2080, 由此可见,两者在速度上几乎是没有区别的

4.x的node版本在运行es6代码相比于es5代码是非常慢的,但是现在使用node的6.11.2版本来运行es6代码和运行es5代码相比,两者是一样快的,可见node对于新特性的运行速度得到了极大地改善。

map

es5语法:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 100000000) {
 var map = {};
 map['key'] = 'value'
}

duration = +new Date() - start;
console.log(duration)

运行5次,结果分别为: 993/858/897/855/862

es6语法:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 100000000) {
 var map = new Map();
 map.set('key', 'value');
}

duration = +new Date() - start;
console.log(duration)

经过几轮测试,耗时分别为: 10458/10316/10319。 即es6的Map在运行时间上是es5的10倍以上,所以在node环境下我们最好少使用Map语法。

模板字符串

es5语法:

var i = 0;
var start = +new Date(),
 duration;

var person = {
 name: 'wayne',
 age: 21,
 school: 'xjtu'
}

while (i++ < 100000000) {
 var str = 'Hello, I am ' + person.name + ', and I am ' + person.age + ' years old, I come from ' + person.school;
}

duration = +new Date() - start;
console.log(duration)

经过测试,可以发现时间分别为 2396/2372/2427

es6语法:

var i = 0;
var start = +new Date(),
 duration;

var person = {
 name: 'wayne',
 age: 21,
 school: 'xjtu'
}

while (i++ < 100000000) {
 var str = `Hello, I am ${person.name}, and I am ${person.age} years old, I come from ${person.school}`;
}

duration = +new Date() - start;
console.log(duration)

经过测试,可以发现耗时分别为 2978/3022/3010。

经过计算,使用es6的语法耗时是es5语法的1.25倍左右。 因此,尽量减少在node端使用模板字符串,如果大量使用,显然耗时是非常严重的。

箭头函数

es5语法:

var i = 0;
var start = +new Date(),
 duration;

var func = {};

while (i++ < 10000000) {
 func[i] = function (x) {
  return 10 + x;
 }
}

duration = +new Date() - start;
console.log(duration)

经过测试,发现耗时分别为 1675/1639/1621。

es6语法:

var i = 0;
var start = +new Date(),
 duration;

var func = {};

while (i++ < 10000000) {
 func[i] = (x) => 10 + x
}

duration = +new Date() - start;
console.log(duration)

经过测试,发现耗时分别为 1596/1770/1597。

即使用箭头函数的运行速度和使用es5方式的箭头函数在运行速度上是一致的,并且使用es6的箭头函数写起来更加方便,所以推荐使用,我们可以直接使用。

总结

在node端使用es6还是不错的,对于常见的class、let、箭头函数等等在速度上和es5不相上下,但是在写起来会更加方便,还是推荐使用的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • NodeJS模块与ES6模块系统语法及注意点详解

    社区模块规范: 1.CommonJS规范 规范实现者: NodeJS 服务端 Browserify 浏览器 2.AMD规范 全称 异步模块定义 规范实现者: RequireJS 浏览器 3.CMD规范 通用模块定义 规范实现者: seaJS 服务端和浏览器通用 官方模块规范 1.ESM规范 就是ES6 Module 各浏览器和服务端 目前常用的就是浏览器端的RequireJS.NodeJS.以及ESM CommonJS语法分析 module.export 关键 1.module.exports实

  • 在node中如何使用 ES6

    ES6+ 太棒了,但是很多高级功能node是不支持的,就需要使用babel转换成ES5, 1.安装babel依赖 npm install babel-core --save-dev 2.安装babel-register npm install babel-register --save-dev 3.babel转换配置,项目根目录添加.babelrc 文件 { "presets" : ['es2015'] } 这时候又需要安装es6转换模块,注意,babel不是帮我们直接转换代码的,它需

  • 详解如何在NodeJS项目中优雅的使用ES6

    NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 项目地址:https://github.com/future-challenger/petshop 现在开始Babel 在开始使用Babel之前,假设 1.你已经安装了nodejs,并且已经熟悉了Js. 2.你也可以使用n

  • 让nodeJS支持ES6的词法----babel的安装和使用方法

    要使用Babel, 我们需要nodeJS的环境和npm, 主要安装了nodeJS, npm就默认安装了 , 现在安装nodeJS很简单了, 直接下载安装就好了: 安装es-checker 在使用Babel之前 , 我们要先检测一下当前node对es6的支持情况, 我们使用先es-checker, 命令行下执行: 运行下面代码 npm -g install es-checker es-checker安装完毕以后, 命令行执行:es-checker , 如下图, 我的node环境版本是v4.4.3,

  • Node中使用ES6语法的基础教程

    相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5和javscript的关系.javascript是一门编程语言,那么它就会有版本,es5还是es6 就就是它的版本号.最新版es7己经在紧锣密布的进行中,它最新的语法会让我们写代码更新的行云流水. 引言 Node本身已经支持部分ES6语法,但是import export,以及async await(No

  • node中使用es6/7/8(支持性与性能)

    前言 这几年react.vue的快速发展,越来越多的前端开始讲es6的代码运用在项目中,因为我们可以通过babel进行转译为低版本的js以便于运行在所有浏览器中,import.export.let.箭头函数等等,对于node端,当然我们也希望使用这些高级语法,但是需要提前了解到node支持哪些新的语法. 分类 所有的es6特性被分成了三个阶段/分类: shipping --- v8引擎可以支持的很好,默认情况下我们是不需要设立任何的flag而可以直接运行的. staged --- 这些是将要完成

  • node中使用es5/6以及支持性与性能对比

    前言 这几年react.vue的快速发展,越来越多的前端开始讲es6的代码运用在项目中,因为我们可以通过babel进行转译为低版本的js以便于运行在所有浏览器中,import.export.let.箭头函数等等,对于node端,当然我们也希望使用这些高级语法,但是需要提前了解到node支持哪些新的语法. 分类 所有的es6特性被分成了三个阶段/分类: shipping --- v8引擎可以支持的很好,默认情况下我们是不需要设立任何的flag而可以直接运行的. staged --- 这些是将要完成

  • 详解Node中导入模块require和import的区别

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口. 不把require和import整清楚,会在未来的标准编程中死的很难看. require时代的模块 node编程中最重要的思想之一就是模块,而正是这个思想,让JavaScript的大规模工程成为可能.模块化编程在js界流行,也是基于此,随后在浏览器端,req

  • node中modules.exports与exports导出的区别

    一:node是什么? node只是平台,或者说是环境,其实用的还是js语法 主要框架express以及koa,两个框架是同一个团队开发,node中也有类似于php的Ci框架的MVC模式 M->model数据层的增删改差操作 V->view视图层 C->controller路由控制,主要起到转发工作 一个完整的node构成:node.js+express+mysql 二:工作代码的顺序: app.js为node的入口文件, 在view写好html文件,模板可以任意, rouer负责路由跳转

  • node中的session的具体使用

    前言 在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明. session是什么 session不就是会话嘛,那什么是会话呢? 会话是一个比连接粒度更大的概念,一次会话可能包含多次连接,每次连接都被认为是会话的一次操作. 当用户在Web页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去. 当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Sessi

  • 详解Node.js如何处理ES6模块

    一.两种模块的差异 ES6 模块和 CommonJS 模块有很大的差异. 语法上面,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用import和export. 用法上面,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行.import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行. 二.Node.js 的区分 Node.js 要求 ES6

  • Node中的streams流的具体使用

    目录 Node中的streams流 转换流 创建 对象模式 最后 Node中的streams流 streams流是Node中的最好的特性之一.它在我们的开发过程当中可以帮助我们做很多事情.比如通过流的方式梳理大量数据,或者帮我们分离应用程序. 和streams流相关的内容有哪些呢?大致有这么几点: 处理大量数据 使用管道方法 转换流 读写流 解耦I/O 转换流 Node中的流其实是允许我们进行异步编程的.最常见的就是转换流,它就像是一个接收输入并且产生输出的大黑盒子. 举个例子: const t

  • 浅谈node中的exports与module.exports的关系

    因为是做前端的,对node的生态一直也比较关注,对于node中对commonJS模块化的实现给了我们很大的方便,之前对于导出的module.exports和exports一直模模糊糊,今天做一个整理 先来个js基础部分的复习 let obj1 = {} let obj2 = obj1 obj2.a = 'a' obj1.b = 'b' console.log(obj1) //{a: 'a', b: 'b'} console.log(obj2) //{a: 'a', b: 'b'} obj2 =

  • 深入理解Node中的buffer模块

    在Node.ES2015出现之前,前端工程师只需要进行一些简单的字符串或DOM操作就可以满足业务需要,所以对二进制数据是比较陌生.node出现以后,前端面对的技术场景发生了变化,可以深入到网络传输.文件操作.图片处理等领域,而这些操作都与二进制数据紧密相关. Node里面的buffer,是一个二进制数据容器,数据结构类似与数组,数组里面的方法在buffer都存在(slice操作的结果不一样).下面就从源码(v6.0版本)层面分析,揭开buffer操作的面纱. 1. buffer的基本使用 在No

随机推荐