Node.js 8 中的重要新特性
隨著 Node.js 8.0 版本的發(fā)布(5月30日下午12點(diǎn)發(fā)布),我們得到了最新的 LTS 版本,具有一系列新功能和性能改進(jìn)。
本文我們將介紹 Node.js 8.0 版本中重要的功能和修復(fù)。
與以前的 Node.js 版本相比,8.0.0相當(dāng)強(qiáng)大。雖然這其中有些還正在進(jìn)行,很多正在商榷。但基本上是穩(wěn)定和可測(cè)試的
•James M Snell(@jasnell)2017年5月30日
新版本的代號(hào)是 Carbon。Node 8 將從2017年10月起成為現(xiàn)行的 LTS 版本,并將保持到2019年12月31日。這也意味著 Node.js 6.x 版本將在 2018 年 4 月進(jìn)入維護(hù)模式,并在 2019 年 4 月廢棄。
你可以在這里獲取 8.0 release文檔
Async Hooks API 簡(jiǎn)介
Async Hooks(以前稱為 AsyncWrap )API允許您獲取有關(guān)句柄對(duì)象生命周期的結(jié)構(gòu)跟蹤信息。
API 可以發(fā)送消息通知消費(fèi)者關(guān)于 Node.js 中所有句柄對(duì)象的生命周期。它可以解決與continuation-local-storage npm package相同的問(wèn)題,只不過(guò)現(xiàn)在可以在 Node 核心代碼中實(shí)現(xiàn)。
如果您曾經(jīng)使用過(guò) continuation-local-storage,那么現(xiàn)在有了 async hooks ,目前有一個(gè)替代方案--cls-hooked ,但目前尚未穩(wěn)定,因此謹(jǐn)慎使用!
Async Hooks API 如何在 Node.js 8 中工作的?
createHooks函數(shù)可以為每一個(gè)異步操作的生命周期注冊(cè)鉤子函數(shù)。
const asyncHooks = require('async_hooks') asyncHooks.createHooks({ init, pre, post, destroy })
這些函數(shù)將根據(jù)處理程序的生命周期事件觸發(fā)。
這里閱讀更多Async Hooks的信息,或者這里查看當(dāng)前的進(jìn)度。
N-API 簡(jiǎn)介
N-API是用于編寫(xiě)原生插件的 API。它獨(dú)立于底層的 JavaScript 運(yùn)行環(huán)境,但作為 Node.js 本身的一部分進(jìn)行維護(hù)。它的目標(biāo)是使應(yīng)用程序二進(jìn)制接口(ABI)在不同 Node.js 版本之間保持穩(wěn)定。
N-API的目的是將附加組件與底層JavaScript引擎的更改分開(kāi),以便原生組件可以在不同版本的 Node 環(huán)境中運(yùn)行并且不需要重新編譯。
查看更多N-API的相關(guān)信息。
Node 8 中 Buffer 安全性的改進(jìn)
在 Node.js 8之前,用new Buffer(Number)來(lái)創(chuàng)建一個(gè)Buffer,并未將內(nèi)存初始化為0。因此,新的緩沖區(qū)實(shí)例可能包含敏感信息,導(dǎo)致安全問(wèn)題。
雖然這樣可以使 Buffer 的創(chuàng)建更快,但對(duì)于大多數(shù)情況來(lái)看,這并不可行。因?yàn)閺?Node.js 8 開(kāi)始,使用new Buffer(Number) 或者Buffer(Number) 的將會(huì)自動(dòng)將內(nèi)存置為0.
將V8升級(jí)到5.8:為 TurboFan 和Ingnition 做準(zhǔn)備
使用 Node.js 8,底層的V8 JavaScript引擎也會(huì)被更新。
它給 Node.js 用戶帶來(lái)的最大的變化就是可以在 V8 5.9中引入TurboFan 和 Ignition 。Ignition 是 V8 的解釋器,而 TurboFan 是優(yōu)化編譯器。
“ Ignition 和 TurboFan 管道已經(jīng)開(kāi)發(fā)了近3½年。它代表了 V8 團(tuán)隊(duì)通過(guò)測(cè)量現(xiàn)實(shí) JavaScript 性能并仔細(xì)考慮了當(dāng)前語(yǔ)言中的缺點(diǎn)而獲得的最終結(jié)果。這為我們能夠在未來(lái)幾年內(nèi)繼續(xù)優(yōu)化 JavaScript 奠定了基礎(chǔ)。- Daniel Clifford 和 V8 團(tuán)隊(duì)
下面是 Node 8 版本之前的 V8 編譯管道的示例圖
圖片來(lái)源:Benedikt Meurer
這個(gè)管道的最大問(wèn)題是新的語(yǔ)言功能必須在管道的不同部分實(shí)現(xiàn),增加了大量額外的開(kāi)發(fā)工作。
這是簡(jiǎn)化的管道外觀,沒(méi)有 FullCode Generator 和 Crankshaft:
圖片來(lái)源:Benedikt Meurer
這一新管道大大降低了V8團(tuán)隊(duì)的技術(shù)負(fù)擔(dān),并且實(shí)現(xiàn)了以前不可能實(shí)現(xiàn)的大量?jī)?yōu)化。
閱讀更多關(guān)于 TurboFan and Ignition和TurboFan Inlining Heuristics
npm 升級(jí)到 5.0.0
新的 Node.js 8 版本還附帶了npm 5 - 最新版本的npm CLI。
npm 新版本的亮點(diǎn):
•一種新的標(biāo)準(zhǔn)化鎖定文件的功能,用于跨套件管理器兼容性(package-lock.json),一種新的格式和 shrinkwrap 語(yǔ)義化。
•--save 不再需要,默認(rèn)情況下將保存所有安裝
•node-gyp 現(xiàn)在支持 Windows(node-gyp.cmd)
•現(xiàn)在將包括sha512和sha1校驗(yàn)。
Node.js 8中的其他顯著變化
Buffer
•Buffer 方法現(xiàn)在接受 Uint8Array 作為輸入
Child Process
•優(yōu)化參數(shù)和 kill 信號(hào)校驗(yàn)
•Child Process 方法接受 Uint8Array 作為輸入
Console
•使用 console 發(fā)出的錯(cuò)誤事件現(xiàn)在被限制
Domains
•Native Promise 實(shí)例現(xiàn)在是 Domain 敏感的
File System
•實(shí)用工具類(lèi)fs.SyncWriteStream已被棄用
•fs.read()字符串接口已被刪除
HTTP
•傳出的 Cookie 頭連接成一個(gè)字符串
•httpResponse.writeHeader()方法已被棄用
Stream
•Stream 現(xiàn)在支持destroy()和_destroy()API
TLS
•rejectUnauthorized選項(xiàng)現(xiàn)在默認(rèn)為true
URL
•WHATWG URL實(shí)現(xiàn)現(xiàn)在是完全支持的 Node.js API
接下來(lái)是 Node.js 8
Node.js 8 為我們帶來(lái)了非常有趣的改進(jìn),包括Async Hooks API,它目前較難掌握,文檔還在不斷改進(jìn)狀態(tài)。我們將盡快開(kāi)始播放新版本,并盡快讓您對(duì)這些功能的更詳細(xì)的說(shuō)明。
相關(guān)文章
node.js與C語(yǔ)言 實(shí)現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小
這篇文章主要介紹了node.js與C語(yǔ)言 實(shí)現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小的相關(guān)資料,需要的朋友可以參考下2017-01-01使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切及算法實(shí)例代碼詳解
這篇文章主要介紹了使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09nest.js,egg.js,midway,express,koa的區(qū)別小結(jié)
本文主要介紹了nest.js,egg.js,midway,express,koa的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Node.js 進(jìn)程平滑離場(chǎng)剖析小結(jié)
這篇文章主要介紹了Node.js 進(jìn)程平滑離場(chǎng)剖析小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01實(shí)例詳解Nodejs 保存 payload 發(fā)送過(guò)來(lái)的文件
這篇文章主要介紹了實(shí)例詳解Nodejs 保存 payload 發(fā)送過(guò)來(lái)的文件 的相關(guān)資料,需要的朋友可以參考下2016-01-01nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
郵箱注冊(cè)是常見(jiàn)的功能,通常需要發(fā)送郵箱驗(yàn)證碼驗(yàn)證,本文就來(lái)介紹一下nodemailer郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10