【首發於我的個人部落格:tonghuashuo.github.io/blog/nodejs…】
Node.js 釋出計劃
Node.js 從 5.0 開始一直遵循著半年一個大版本的釋出週期,每年 4 月左右釋出一個主版本號為偶數的 LTS(Long-Term-Support)版本,每年 10 月左右釋出一個主版本號為奇數的非 LTS 版本。
新版本釋出後的半年內被稱為“當前版本”,起初可能會遇到較多的向下相容問題,早期升級的開發者可能會受到短期的“生長痛”影響,經過若干小版本的更新後會逐漸趨於穩定。
每年 10 月的奇數版本釋出後,同年 4 月釋出的偶數版本進入 LTS 階段,為期一年半。期間除非 Release 工作組同意,不再新增新特性,只對現有功能進行完善,變更內容僅限於:
- 修復 Bug
- 安全性升級
- npm 升級(主版本號不變)
- 相關文件的更新
- 效能優化(基本不會影響已有的應用程式)
- 會引入大量繁瑣噁心的程式碼(對已有應用程式的影響很低),但是對未來做向下相容補丁有利的變更
最後還有 1 年時間的維護期,期間除非是非常嚴重的 Bug 或安全性問題,不再有改動,對文件的修改也需要授權才可以。LTS 版本的生命週期共計 3 年,之後不再維護。
奇數版本通常會相對激進地引入一些新的語法和特性,變化也會比較快,主要用於對一些新特性的試錯和測試,穩定性並非追求的第一目標(畢竟只活半年)。由於變化較快,風險非常不可控,不推薦在生產環境使用奇數版本的 Node.js,想嚐鮮的開發者們,請務必做好足夠的思想準備,迎接不穩定的功能變更,並確定自己有足夠能力應對升級引發的各種問題(已有程式碼、開發環境和工具受升級影響無法正常使用等)。建議先在個人裝置上有了一定實踐,踩掉一些坑,感覺自己能 hold 住了,再考慮遷移到公司裝置上。
偶數版本主要考慮用於生產環境,穩定性的優先順序會比較高,但並不排除引入斷層升級的可能性(例如 Node.js 8.0 升級更新了 npm 到 5.0,新版 npm 對用老版本安裝的依賴沒有做好相應的處理,導致大量從 4.x 升級過來的使用者直接沒法幹活了,只能通過全新安裝依賴來解決。官方 Github 上有人維護了一長串的 Known Issue,其中影響較大的幾個問題至今沒能得到解決,可能官方也不打算管了)。升級建議:
- 新版本剛釋出先別急更新到生產環境,找測試裝置踩一遍坑先
- 多關注官方 Github 上的 Issue
- 持續關注最新動態,因為最多 3 年時間,老版本就退休了,升級是早晚的
Node.js 9.0.0 的主要變化
本次升級並沒有太多令人興奮的點,官方並不希望大版本的更新導致嚴重的斷層,因此新特性、語法會在次版本更新中逐漸被加入。主要變化如下:
- 一個主要的依賴迎來了更新,V8 引擎更新到了 6.2,非同步 IO 庫 libuv 更新到 1.15.0,DNS 庫 c-ares 更新到 1.13.0
- N-API 和 HTTP2 可以直接用了,不需要再加 flag。新版本引入了 Async Hook,儘管依然屬於實驗性功能,但此次升級後就已經可以使用了
- Node.js 核心庫開始逐漸遷移到一個全新的報錯系統,為每一種錯誤型別提供唯一的錯誤程式碼,以此在不破壞已有程式碼的前提下,提高使用者程式碼的健壯性
- 當接收到的請求無法被正確解析時,HTTP 模組會返回一個 400 錯誤。此前 Node.js 會直接將 socket 掛起,導致伺服器誤以為 node 程式掛了
- assert 模組可以丟擲任意型別的錯誤,而不再僅限於斷言錯誤
- Node.js 使用 32 位帶符號整數來表示計時器延遲,當延遲溢位時,新版本會增加 1 毫秒延遲,以往版本對此沒有處理
- API 文件和測試套件的更新,JS 和 C++ 的測試覆蓋率均達到 90% 以上
Node.js 9.0.0 釋出之後
按照官方的釋出計劃,9.0 的釋出,意味著 8.x 進入 LTS 階段,7.x 徹底退出舞臺,6.x 的 LTS 還有半年結束。也就是說,差不多是時候考慮往生產環境部署 Node.js 8.x 了。
番外
或許是因為大部分人都是實用主義者,大家心裡都很清楚,奇數版本就是用來試錯的,只有偶數版本才會被用於生產環境,因此大部分人都會關注“有用”的偶數版本,而忽略“與我無關”的奇數版本。從搜尋引擎對“node 7”和“node 8”的收錄情況來看,關於 node 7 的討論非常少,除了一些主流媒體報導了一些版本釋出的訊息,基本搜不到什麼有價值的內容,而關於 node 8 的討論就明顯要多一些。
倒不是想說這有什麼不對,每個人的精力都有限,實用主義沒什麼不好。作為一名大前端技術的愛好者,同時也是一名職業的開發者,我個人是比較樂於去了解和嘗試新技術的,即便它最後並沒能夠成為主流,但只有親自嘗試了,才有發言權說這東西究竟如何。也只有親自參與其中,才能真正領略到開源世界眾多開發者們的智慧,思考的過程才是真正學到東西的過程。
希望本文能夠為“或許註定要被忽略”的 Node.js 9.x 多少貢獻一點點的關注度吧。