前言
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 有什麼新特性?
http/2
Node 8.4 首次支持了http/2
但由於仍處於實驗性階段,運行時需要加上—expose-http2 參數,而在node 9中去除了這一參數,可以直接使用:
當然由於現在主流瀏覽器只有在HTTPS時才啟用HTTP2,我們要啟動一個https的服務器。
其他關於http/2的變化還包括:
新增對 ALTSVC(HTTP Alternative Services) 的支持。
新增 maxSessionMemory ,限制單個http2線程允許使用的內存上限,一旦超過這個值,http2請求將被拒絕。
收集並報告有關 Http2Session 和 Http2Stream 實例的基本計時信息。
改進了Http2Stream和Http2Session的關閉方式,Http2Stream.prototype.rstStream() 方法被移動至 Http2Stream.prototype.close() 中。
在Http2Session上引入了新的屬性來確定會話是否安全。
util
新增方法util.isDeepStrictEqual(value1, value2),可進行兩個值的深度比較,返回一個布爾值。此前我們常用assert.deepStrictEqual()進行比較,後者在兩個值不相等時會拋出異常。
新增方法util.callbackify,可以將 Promise 轉化為callback形式的函數,適用於解決一些兼容性問題的場景:
允許在 debuglog() 中使用通配符,通過 NODE_DEBUG=foo* 環境運行
HTTP/1
當傳入的請求無法成功解析時,http模塊現在將返回400狀態碼。在過去,Node.js只會掛斷socket,導致其他服務器(如nginx)誤以為Node.js服務器關閉。
在此前的版本中,一旦套接字被分配給請求,request.setTimeout()就會調用socket.setTimeout()。 這使得即使底層的套接字永不連接,也會在請求上發出超時事件。在 Node.js 9 中,socket.setTimeout()僅在底層套接字成功連接時被調用。
新增103狀態碼:103 Early Hints 該狀態碼允許服務器在主報頭之前先發送部分報頭,以達到預加載文件的目的。
更嚴謹的錯誤碼
Node.js核心代碼庫正在慢慢遷移到一個新的錯誤系統,Node.js 9 中採用了更嚴謹的錯誤碼
在Node.js 9 之前,你可能會這樣處理錯誤:
現在則應該用這種方式進行處理:
其他變化
assert 模塊的方法現在可以拋出任何類型的錯誤(RangeError,SyntaxError等)。在之前版本的Node.js中,這些方法只能拋出斷言錯誤(assertion errors)。
在先前版本的Node.js中,如果定時器的延時溢出,不會提供任何溢出發生的指示,而在Node.js 9中,定時器會發出警告。
NODE_OPTIONS 新增了 stack-trace-limit 屬性,用於開發環境下設置堆棧上限,使用方式:NODE_OPTIONS=--stack-trace-limit=100
支持 console.debug 方法,此方法與console.log表現一致
cluster.settings中允許通過cwd屬性配置目標目錄
在使用Electron等程序時,我們需要控制什麼時候使用v8 platform,為了使Node正常工作,我們有時需要手動創建NodePlatform。Node.js 9 新增了用於創建/銷燬NodePlatform的公共API
stream模塊中,新增了 state.ending 屬性判斷stream是否已調用 end() 方法
async_wrap新增了兩個屬性值:TCPSERVERWRAP 和 PIPESERVERWRAP,從而允許我們通過連接種類區分服務器
添加了新的異步鉤子,提供一個API來註冊回調從而跟蹤應用程序中的所有異步資源,記錄其所觀察到的異步操作的時間信息
在N-API(用於構建本地插件的API) 中,Node.js 9中為需要引用當前事件循環的插件添加了一個函數。從而使插件得以訪問當前的事件循環,要注意的是這個特性目前仍是實驗性的
閱讀更多 星前線 的文章