Node12有哪些值得關注的新特性?

前言

時隔一年,Node.js 12 如約而至,正式發佈第一個 Current 版本。它將從2019年10月開始進入長期支持(LTS)版本直到2022年4月。

該版本帶來的新特性:

  • V8 更新帶來好多不錯的特性。
  • HTTP 解析速度提升。
  • 啓動速度大幅提升。
  • 更好的診斷報告和堆分析工具。
  • ESM 模塊更新。

LTS

Node維護了着兩條發佈流程線:奇數版本每年的10月份發佈,偶數版本第二年的4月份發佈。當一個奇數版本發佈後,最近的一個偶數版本會立即進入LTS維護計劃,一直持續18個月(LTS Start )。再之後會有12個月的延長維護期(Maintenance Start)。

這兩個期間可以支持的變更是不一樣的:

  • LTS期間支持的變更:bug fix,安全問題 fix, 文檔更新和與未來新特性兼容問題的更新。
  • Maintenanece期間支持的變更: 嚴重的bug fix,嚴重的安全問題 fix 或者文檔更新。當一個偶數版本發佈時,奇數版本只有2個月的維護期,再只能乖乖升級。

就目前而言,Node.js 6.x 和 8.x 將在 2019 年末結束 LTS 的支持,大家儘快升級到 10.x 吧。

ESM

自從ES6中的標準化以來,import/ exportsyntax已成爲JavaScript開發人員的首選模塊語法,而Node團隊一直在努力實現本機化。實驗性支持從第8階段的Node 8.0開始,並在最新的Node版本上邁出了重要的一步。所有主流瀏覽器都支持 ECMAScript模塊<script type="module">,因此這是Node的一個巨大更新。

// default exports
import module from 'module'
// named exports
import { namedExport } from 'module'
// namespace exports
import * as module from 'module'

V8引擎更新到7.4

本次版本更新,也帶幾個不錯的特性:

  • 異步堆棧跟蹤
  • 參數調用不匹配時的調用速度優化
  • 更快的 JavaScript 解析速度
  • 更快的 await

ECMAScript 新特性支持

隨着 V8 的更新,很多 ES 的新規範也落地了,比如支持類的私有變量。

class Greet {
  #name = 'World';
  get name() {
    return this.#name;
  }
  set name(name) {
    this.#name = name;
  }
  sayHello() {
    console.log(`Hello, ${this.#name}`);
  }
}

在類的外部或去#name變量會拋出異常

const greet = new Greet()
greet.#name = 'NewName';
// -> SyntaxError
console.log(greet.#name)
// -> SyntaxError

改善了啓動性能

Node 將在構建時間之前爲內置庫構建代碼緩存並將其嵌入爲二進制文件。主線程能夠使用此代碼緩存,將啓動時間縮短30%。

HTTP 解析速度提升

默認的 HTTP 解析器切換爲 llhttp ,性能提升顯著
llhttp

TLS和安全

Node 12 現在支持TLS 1.3,它提供更高的安全性和更短的延遲。TLS 1.3已經成爲協議的一個重大更新,並且正在積極地在Web上集成。通過實施TLS 1.3,Node應用程序將增加最終用戶隱私,同時通過減少HTTPS握手所需的時間來提高請求性能。此外,默認情況下已禁用TLS 1.0和1.1,並且crypto庫已刪除已棄用的函數。

堆大小分配策略

以前使用默認的V8堆大小,相當於700MB(32位系統)或1400MB(64位系統)。Node現在將根據可用內存確定堆大小,這將確保它不會使用超過允許的資源。

堆轉儲功能

Node 12提供了生成堆轉儲的功能,從而可以更輕鬆地調查內存問題。

其他值得關注的更新

  • 工作線程不再需要標誌
  • http已將其默認解析器更新爲llhttp
  • assert 驗證所需的參數並調整鬆散的斷言
  • buffer 改進使其更穩定和安全
  • async_hooks 刪除已棄用的功能

本文首發於公衆號「前端新視界」,分享前端資訊、技術乾貨、編碼人生,歡迎關注。

前端新視界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章