可能是最全的 Node.js 9 新特性整理

前言

Node.js 每年進行兩次大的發佈,2017年10月,Node.js發佈了 9.0 版本,與此同時, Node.js 8.9.0 成為了最新的 LTS 版本。這意味著對 8.9.0 的支持將會維持到2019年底,此後的一個LTS版本將會是 Node.js 10。

可能是最全的 Node.js 9 新特性整理

Node.js 9 有什麼新特性?

http/2

Node 8.4 首次支持了http/2

可能是最全的 Node.js 9 新特性整理

但由於仍處於實驗性階段,運行時需要加上—expose-http2 參數,而在node 9中去除了這一參數,可以直接使用:

可能是最全的 Node.js 9 新特性整理

可能是最全的 Node.js 9 新特性整理

當然由於現在主流瀏覽器只有在HTTPS時才啟用HTTP2,我們要啟動一個https的服務器。

其他關於http/2的變化還包括:

  1. 新增對 ALTSVC(HTTP Alternative Services) 的支持。

  2. 新增 maxSessionMemory ,限制單個http2線程允許使用的內存上限,一旦超過這個值,http2請求將被拒絕。

  3. 收集並報告有關 Http2Session 和 Http2Stream 實例的基本計時信息。

  4. 改進了Http2Stream和Http2Session的關閉方式,Http2Stream.prototype.rstStream() 方法被移動至 Http2Stream.prototype.close() 中。

  5. 在Http2Session上引入了新的屬性來確定會話是否安全。

util

  • 新增方法util.isDeepStrictEqual(value1, value2),可進行兩個值的深度比較,返回一個布爾值。此前我們常用assert.deepStrictEqual()進行比較,後者在兩個值不相等時會拋出異常。

可能是最全的 Node.js 9 新特性整理

  • 新增方法util.callbackify,可以將 Promise 轉化為callback形式的函數,適用於解決一些兼容性問題的場景:

可能是最全的 Node.js 9 新特性整理

  • 允許在 debuglog() 中使用通配符,通過 NODE_DEBUG=foo* 環境運行

可能是最全的 Node.js 9 新特性整理

HTTP/1

  1. 當傳入的請求無法成功解析時,http模塊現在將返回400狀態碼。在過去,Node.js只會掛斷socket,導致其他服務器(如nginx)誤以為Node.js服務器關閉。

  2. 在此前的版本中,一旦套接字被分配給請求,request.setTimeout()就會調用socket.setTimeout()。 這使得即使底層的套接字永不連接,也會在請求上發出超時事件。在 Node.js 9 中,socket.setTimeout()僅在底層套接字成功連接時被調用。

  3. 新增103狀態碼:103 Early Hints 該狀態碼允許服務器在主報頭之前先發送部分報頭,以達到預加載文件的目的。

更嚴謹的錯誤碼

Node.js核心代碼庫正在慢慢遷移到一個新的錯誤系統,Node.js 9 中採用了更嚴謹的錯誤碼

在Node.js 9 之前,你可能會這樣處理錯誤:

可能是最全的 Node.js 9 新特性整理

現在則應該用這種方式進行處理:

可能是最全的 Node.js 9 新特性整理

其他變化

  1. assert 模塊的方法現在可以拋出任何類型的錯誤(RangeError,SyntaxError等)。在之前版本的Node.js中,這些方法只能拋出斷言錯誤(assertion errors)。

  2. 在先前版本的Node.js中,如果定時器的延時溢出,不會提供任何溢出發生的指示,而在Node.js 9中,定時器會發出警告。

  3. NODE_OPTIONS 新增了 stack-trace-limit 屬性,用於開發環境下設置堆棧上限,使用方式:NODE_OPTIONS=--stack-trace-limit=100

  4. 支持 console.debug 方法,此方法與console.log表現一致

  5. cluster.settings中允許通過cwd屬性配置目標目錄

  6. 在使用Electron等程序時,我們需要控制什麼時候使用v8 platform,為了使Node正常工作,我們有時需要手動創建NodePlatform。Node.js 9 新增了用於創建/銷燬NodePlatform的公共API

  7. stream模塊中,新增了 state.ending 屬性判斷stream是否已調用 end() 方法

  8. async_wrap新增了兩個屬性值:TCPSERVERWRAP 和 PIPESERVERWRAP,從而允許我們通過連接種類區分服務器

  9. 添加了新的異步鉤子,提供一個API來註冊回調從而跟蹤應用程序中的所有異步資源,記錄其所觀察到的異步操作的時間信息

  10. 在N-API(用於構建本地插件的API) 中,Node.js 9中為需要引用當前事件循環的插件添加了一個函數。從而使插件得以訪問當前的事件循環,要注意的是這個特性目前仍是實驗性的


分享到:


相關文章: