譯者:spacegit
Node.js在2019年走到了第十個年頭, npm
上面的包數量也超過了一百萬. NodeJS自身的下載量也在以每一年40%的速度持續增加. 而對於NodeJS最近的另外一個里程碑即是它加入了OpenJS基金會, 該基金會旨在提升項目的健康度與可持續性, 同時與JavaScript社區有一個緊密的合做.github
正如咱們所見, 這麼短的時間內發生了許許多多! 每年NodeJS社區都會有一些精彩的瞬間, 2020年也不例外.npm
NodeJS的下一個主要發行版本有許多有趣的新特性. 在這篇文章中我會介紹一些NodeJS在2020年最具特色的值得期待的新特性.json
寫下這篇文章的時候, NodeJS最近的一個release版本是13
. 其中很多特性與更新讓咱們能夠嘗着鮮邁入2020年的大門.promise
下面是一些亮點部分:瀏覽器
在咱們一頭扎進這些特性的細節以前, 讓咱們先從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), 再也不會被維護.
關注【IVWEB社區】公衆號查看最新技術週刊,今天的你比昨天更優秀!
那麼咱們能夠指望在2020年會有以下的release計劃:
2020/1 - 2020/3
2020/4
2020/10
注意: Node 8.x 因爲其依賴的OpenSSL-1.0.2將會在2019年年底進入EOL階段, 所以也計劃在2019年年底進入EOL階段. 若是尚未完成升級, 請作好從8.x版本遷移到10.x或者12.x的計劃.
在v13.2.0
版本中, NodeJS同時支持了傳統的CommonJS Module與新標準的ECMAScript(ES) Modules (開箱即用!). 這意味着終於能用上在瀏覽器JS中早已開始使用的import
和export
了. 此外, 很重要的一點是, 在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"
.
.js
文件重命名爲.mjs
package.json
或者在含有ES模塊的目錄中添加package.json
文件, 並設置type
爲module
{
"type": "module"
}
複製代碼
另外一個開啓ES Module特性的方法就是在根目錄中的package.json
文件中開啓ES, 而且將全部的CommonJS module的文件都重命名爲.cjs
拓展名形式.
我的來講, 我以爲.mjs
和.cjs
看起來怪怪的, 因此我很開心經過package.json
文件就能開啓ES和CommonJS Module.
與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);
})
複製代碼
與JavaScript相似, WebAssembly也基於安全考量而設計, 阻斷了全部對底層操做系統接口的直接訪問(或者能夠稱之爲沙箱Sandbox). 但仍然存在一些時候咱們的確能夠經過調用系統級的接口來讓咱們控制的WebAssembly Module得到好處.
這就是咱們須要嶄新的WebAssembly System Interface (WASI)的理由了. WASI被設計成了調用底層系統的標準接口, 好比宿主程序, 原生操做系統之類的.
最初的WASI支持最近才被提交到NodeJS項目中, 但不得不說他是一個使人激動的咱們可能在2020年內可以看到NodeJS新特性.
診斷報告是一種人類可讀的JSON格式的進程信息總結. 包括了調用棧, 操做系統信息, 加載的模塊以及其餘有用的信息. 它被設計用來協助輔助應用. 這些報告可以被未處理的異常, 致命錯誤(fatal errors), 進程信號(process signal), 或者新的process.report
API觸發. 此外可以配置NodeJS使它自動保存這些診斷報告到一個文件夾或者文件中.
截至本文, 診斷報告已經在實驗中階段了. 要開啓這個特性, 必須在命令行中執行NodeJS時傳遞參數flag:
node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json
複製代碼
在v13.x版本中, NodeJS已經有完整的ICU(International Components For Unicode)編譯版本. ICU是一個成熟且廣爲流行的全球本地化庫. 在衆多的特性中, ICU囊括了對數字/日期/時間/貨幣的格式化, 時間的計算與字符串比較, 在Unicode與其餘字符集之間的轉換等功能的支持.
Workers Threads
的API: NodeJS中的Worker thread使得併發的重CPU操做在JavaScript中成爲可能.