Nodejs下的ES6兼容性与性能分析
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
ES6標(biāo)準(zhǔn)發(fā)布后,前端人員也開(kāi)發(fā)漸漸了解到了es6,但是由于兼容性的問(wèn)題,仍然沒(méi)有得到廣泛的推廣,不過(guò)業(yè)界也用了一些折中性的方案來(lái)解決兼容性和開(kāi)發(fā)體系問(wèn)題,但大家仍很疑惑,使用ES6會(huì)有哪些兼容性問(wèn)題。
一、Nodejs下ES6兼容性現(xiàn)狀
??之前寫了es6通過(guò)Babel編譯后的在瀏覽器端的兼容性問(wèn)題《Babel下的ES6兼容性和規(guī)范》,隨著范圍的擴(kuò)展,ES6在Nodejs上兼容性也有必要重新梳理下。 ??隨著iojs的引入,新版的Nodejs開(kāi)始原生支持部分ES6的特性,既然ES6在瀏覽器端使用需要使用babel等編譯,在Nodejs總可以放心使用了吧。然而事實(shí)并非如此,為此在nodejs端,我也做了特性兼容性研究:
ES6新特性在Nodejs下的兼容性列表 這里羅列下nodejs支持的新特性,沒(méi)列出的新特性均為不支持。
https://iojs.org/en/es6.html https://kangax.github.io/compat-table/es6/
| let,const,塊 | strict模式支持 |
| class類 | strict模式支持 |
| Map,Set 和 WeakMap,WeakSet | 支持 |
| generators | 支持 |
| 進(jìn)制轉(zhuǎn)換 | 支持 |
| 對(duì)象字面量擴(kuò)展 | 支持 |
| promise | 支持 |
| String對(duì)象新API | 支持 |
| symbols | 支持 |
| 字符串模板 | 支持 |
可見(jiàn),es6的新特性在Nodejs中比babel還要差,而新版的babel已經(jīng)能夠支持es6的90%新特性了~
二、Nodejs ES6性能分析
??盡管目前Node下使用ES6我們?nèi)匀粫?huì)大失所望,但es6發(fā)展的趨勢(shì)定是必然,這里還是有必要對(duì)ES6的原生性能做了詳細(xì)的對(duì)比測(cè)試。測(cè)試基本方法:
1,對(duì)于重復(fù)操作循環(huán)執(zhí)行100萬(wàn)次 2,所有程序運(yùn)行在Nodejs下執(zhí)行 3,環(huán)境描述
- CPU: Interl(R) Core(Tm) i5-3470 CPU @ 3.2GHz
- 內(nèi)存:4.00GB
- 操作系統(tǒng): 64位操作系統(tǒng)
- node版本:node v5.1.1
2.1、let, const, 塊
'use strict' let i = 0; let t1 = +new Date(),t2;while(i++ < 1000000){const a = 1;const b = '1';const c = true;const d = {};const e = []; }t2 = +new Date() - t1; console.log(t2);| 100萬(wàn) | 52-53ms | 33-34ms |
結(jié)果讓我震驚了,使用let,const聲明變量的速度竟然比var快了約65%左右。原因可能是使用var會(huì)去檢查作用域上的同名變量,而使用let或const不用考慮。
2.2、class類使用
'use strict' let i = 0; let t1 = +new Date(),t2;while(i++ < 100000){class A{constructor() {this.name = 'ouven';}getName(){return this.name;}}const a = new A();a.getName(); }t2 = +new Date() - t1; console.log(t2);| 10萬(wàn) | 1179-1211ms | 1411-1442ms |
可見(jiàn)使用Nodejs的Class比ES的function構(gòu)造方法慢約25%
2.3、Map,Set 和 WeakMap,WeakSet
'use strict' let i = 0; let t1 = +new Date(),t2;while(i++ < 1000000){let map = new Map();map.set('key','value'); }t2 = +new Date() - t1; console.log(t2);| 100萬(wàn) | 11-13ms | 179-180ms |
測(cè)試結(jié)果看,Map的效率相對(duì)普通的對(duì)象key-value的結(jié)果相比慢的多,但是Map的Key可以使負(fù)責(zé)類型,這里的參考性也就不是絕對(duì)準(zhǔn)確。建議是不到必須情況,不要使用Map等復(fù)雜類型。Set、WeakMap、WeakSet均相對(duì)object結(jié)構(gòu)執(zhí)行效率慢得多。
2.4、字符串模板
'use strict' let i = 0; let t1 = +new Date(),t2;let vars = {name: 'ouven',address: 'tencent' };while(i++ < 1000000){let str = `string text ${vars.name} string ${vars.address}`;}t2 = +new Date() - t1; console.log(t2);| 100萬(wàn) | 8ms | 59-61ms |
ES6的字符串模板看起來(lái)很好,但是由于執(zhí)行時(shí)必須掃描這個(gè)串,找出里面的模板變量,所以整體上性能就相對(duì)ES5的字符串拼接慢了很多。
其它的特性實(shí)現(xiàn)有興趣的同學(xué)可以自己繼續(xù)研究。相信結(jié)果大概可以預(yù)測(cè)到。
測(cè)試用例代碼地址
三、小結(jié)
??這里選擇了ES6中的少數(shù)特性和ES5的實(shí)現(xiàn)的執(zhí)行效率做了對(duì)比,整體上說(shuō),ES6的新特性相對(duì)ES5的實(shí)現(xiàn)效率慢些,而有些特性當(dāng)然是ES5無(wú)法實(shí)現(xiàn)的。所以在了解使用ES6的同時(shí),除了了解它的新特性和優(yōu)點(diǎn),對(duì)于ES6本身的一些問(wèn)題也要做到心中有數(shù)。當(dāng)然,隨著ES6的完善和Node的更新,相信這些也不會(huì)是大的問(wèn)題,而且這些也不會(huì)影響ES6的發(fā)展。
??https://github.com/ouvens/ecmaScript-2015-babel-rules
原文鏈接:https://ouvens.github.io/frontend-javascript/2015/12/06/es6-in-nodejs.html
轉(zhuǎn)載于:https://my.oschina.net/zhangstephen/blog/541276
總結(jié)
以上是生活随笔為你收集整理的Nodejs下的ES6兼容性与性能分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android app启动过程(转)
- 下一篇: node.js用get方式获取网页中的链