[譯] What's New for Node.js in 2020

原文: What's New for Node.js in 2020 - David Nealnode

譯者:spacegit

Node.js在2019年走到了第十個年頭, npm上面的包數量也超過了一百萬. NodeJS自身的下載量也在以每一年40%的速度持續增加. 而對於NodeJS最近的另外一個里程碑即是它加入了OpenJS基金會, 該基金會旨在提升項目的健康度與可持續性, 同時與JavaScript社區有一個緊密的合做.github

正如咱們所見, 這麼短的時間內發生了許許多多! 每年NodeJS社區都會有一些精彩的瞬間, 2020年也不例外.npm

NodeJS的下一個主要發行版本有許多有趣的新特性. 在這篇文章中我會介紹一些NodeJS在2020年最具特色的值得期待的新特性.json

NodeJS 13版本有哪些新東西?

寫下這篇文章的時候, NodeJS最近的一個release版本是13. 其中很多特性與更新讓咱們能夠嘗着鮮邁入2020年的大門.promise

下面是一些亮點部分:瀏覽器

  • ECMAScript模塊
  • WebAssembly支持
  • Diagnostic report 診斷報告
  • 對日期, 時間, 數字與貨幣格式的徹底本地化支持
  • QUIC協議支持
  • V8 JavaScript引擎性能更新

在咱們一頭扎進這些特性的細節以前, 讓咱們先從NodeJS的release計劃中看看有什麼值得期待的.安全

2020年NodeJS Release流程

每間隔半年, NodeJS就會放出一個新的主要版本, 分別在四月份與十月份. 這些主要版本就是咱們所稱呼的Current 版本. 截至本文, Current版本已經達到了13, 於2019年10月放出.併發

奇數版本(v9, v11, v13等等)一般在每一個十月放出, 而且一般不會持續太長時間, 也並不推薦用於生產環境. 換句話說能夠把奇數版本看作是beta版本. 一般來講都是用來測試新特性與下個偶數版本將要作出的變動.async

偶數版本(v8, v10, v12等等)一般在每一個四月份放出. 放出後, 上一個偶數版本將不會再進行更新. 雖然已經比奇數版本穩定多了, 但仍然會在接下來的半年時間內持續且頻繁地更新. 簡單來講, 能夠把這個看作是一個release前的準備與候選階段.

當一個偶數版本通過了半年時間的準備和優化以後, 它就會進入一個新的被稱爲Long-Term Support(LTS)階段. LTS階段已經爲生產環境作好了準備. 在接下來的一年時間內, LTS版本會持續收到bug修復, 安全問題更新以及其餘不會阻塞影響到現有應用的更新.

在LTS階段以後就是最後的Maintenance 維護階段. 在這個階段的NodeJS版本只會接受到嚴重bug與安全問題的修復補丁. Maintainance階段一般會持續18個月, 在這以後, 這個版本就會被認爲已經達到了生命週期的終點(End of Life EOL), 再也不會被維護.

NodeJS生命週期


關注【IVWEB社區】公衆號查看最新技術週刊,今天的你比昨天更優秀!


2020年指望的Release計劃

那麼咱們能夠指望在2020年會有以下的release計劃:

2020/1 - 2020/3

  • 13.x都講師Current版本, 而且會有頻繁的開發動做
  • 10.x與12.x都在LTS階段

2020/4

  • 14.x版本放出, 而且成爲Current版本
  • 13.x將會很快再也不接收更新
  • 10.x進入Maintenance階段

2020/10

  • 15.x版本release, 而且成爲Current版本
  • 14.x進入LTS階段
  • 12.x進入Maintenance階段

NodeJS 2020 schedule

注意: Node 8.x 因爲其依賴的OpenSSL-1.0.2將會在2019年年底進入EOL階段, 所以也計劃在2019年年底進入EOL階段. 若是尚未完成升級, 請作好從8.x版本遷移到10.x或者12.x的計劃.

對ECMAScript Modules的支持

v13.2.0版本中, NodeJS同時支持了傳統的CommonJS Module與新標準的ECMAScript(ES) Modules (開箱即用!). 這意味着終於能用上在瀏覽器JS中早已開始使用的importexport了. 此外, 很重要的一點是, 在NodeJS的ES Modules中, JavaScript的strict模式是默認開啓的, 所以不須要手動在文件首設置"use strict";.

// message.js
async function sendMessage() {...}
export { sendMessage };

// index.js
import { sendMessage } from './message';
複製代碼

然而, 咱們仍然須要作出一些小改動來讓NodeJS知道正在使用的是ES Modules. 兩個最經常使用的方法分別是使用.mjs拓展名, 或者在最近的package.json文件中配置"type": "module".

  • 選擇1: 把.js文件重命名爲.mjs
  • 選擇2: 更改根目錄下的package.json或者在含有ES模塊的目錄中添加package.json文件, 並設置typemodule
{
    "type": "module"
}
複製代碼

另外一個開啓ES Module特性的方法就是在根目錄中的package.json文件中開啓ES, 而且將全部的CommonJS module的文件都重命名爲.cjs拓展名形式.

我的來講, 我以爲.mjs.cjs看起來怪怪的, 因此我很開心經過package.json文件就能開啓ES和CommonJS Module.

NodeJS可以加載WebAssembly模塊了

與ES Module支持一同到來的還有對WebAssembly(Wasm)模塊加載的能力! 一個WebAssembly模塊是一個可以被多處複用的編譯後的二進制格式文件, 它可以比JavaScript更快的解析, 而且可以達到原生級別的速度. WebAssembly模塊可以被C/C++, Go, C#, Java, Python, Elixir, Rust等等等等其餘語言編譯出來.

截至本文, WebAssembly模塊的支持仍然處在實驗中的階段. 要開啓這個功能, 必需要在命令行中傳入參數來開啓這個flag:

node --experimental-wasm-nmodules index.js
複製代碼

舉個例子, 假設有一個圖像處理的WebAssembly Module形式的庫. 那麼使用它的方法看起來應該像這樣:

import * as imageUtils from './imageUtils.wasm';
import * as fs from 'fs';

(async () => {
    const image = await fs.promises.readFile('./image.png');
    const updatedImage = await imageUtils.rotate90degrees(image);
})();
複製代碼

也可使用NodeJS中的動態import()方法來引入WebAssembly Module

'use strict';

const fs = require('fs');
(async () => {
    const imageUtils = await import('./imageUtils.wasm');
    const image = await fs.promises.readFile('./image.png');
    const updatedImage = await imageUtils.rotate90degress(image);
})
複製代碼

WebAssembly系統接口(WASI)

與JavaScript相似, WebAssembly也基於安全考量而設計, 阻斷了全部對底層操做系統接口的直接訪問(或者能夠稱之爲沙箱Sandbox). 但仍然存在一些時候咱們的確能夠經過調用系統級的接口來讓咱們控制的WebAssembly Module得到好處.

這就是咱們須要嶄新的WebAssembly System Interface (WASI)的理由了. WASI被設計成了調用底層系統的標準接口, 好比宿主程序, 原生操做系統之類的.

最初的WASI支持最近才被提交到NodeJS項目中, 但不得不說他是一個使人激動的咱們可能在2020年內可以看到NodeJS新特性.

診斷報告(Diagnostic Reports)在2020年啓動

診斷報告是一種人類可讀的JSON格式的進程信息總結. 包括了調用棧, 操做系統信息, 加載的模塊以及其餘有用的信息. 它被設計用來協助輔助應用. 這些報告可以被未處理的異常, 致命錯誤(fatal errors), 進程信號(process signal), 或者新的process.reportAPI觸發. 此外可以配置NodeJS使它自動保存這些診斷報告到一個文件夾或者文件中.

截至本文, 診斷報告已經在實驗中階段了. 要開啓這個特性, 必須在命令行中執行NodeJS時傳遞參數flag:

node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json
複製代碼

2020內的本地化支持擴展

在v13.x版本中, NodeJS已經有完整的ICU(International Components For Unicode)編譯版本. ICU是一個成熟且廣爲流行的全球本地化庫. 在衆多的特性中, ICU囊括了對數字/日期/時間/貨幣的格式化, 時間的計算與字符串比較, 在Unicode與其餘字符集之間的轉換等功能的支持.

2020年內的其餘的NodeJS更新

  • QUIC協議支持: 一個現代的性能與可靠性更好的針對創建鏈接的應用的傳輸層協議.
  • 更好的Python3構建支持: 在2020年, 應該可以經過Python3來構建NodeJS和原生模塊了
  • V8 JavaScript引擎的升級: V8的v7.8和7.9增長了性能與Wasm的支持
  • 穩定的Workers Threads的API: NodeJS中的Worker thread使得併發的重CPU操做在JavaScript中成爲可能.
相關文章
相關標籤/搜索