NodeJs 最近各版本特性汇总
(預(yù)測(cè)未來(lái)最好的方法就是把它創(chuàng)造出來(lái)——尼葛洛龐帝)
NodeJs
官方鏈接
github鏈接
V8鏈接
Node.js發(fā)布于2009年5月,由Ryan Dahl開(kāi)發(fā),是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境,使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式I/O模型, [1] 讓JavaScript 運(yùn)行在服務(wù)端的開(kāi)發(fā)平臺(tái),它讓JavaScript成為與PHP、Python、Perl、Ruby等服務(wù)端語(yǔ)言平起平坐的腳本語(yǔ)言。 [2]
Node.js對(duì)一些特殊用例進(jìn)行優(yōu)化,提供替代的API,使得V8在非瀏覽器環(huán)境下運(yùn)行得更好,V8引擎執(zhí)行Javascript的速度非常快,性能非常好,基于Chrome JavaScript運(yùn)行時(shí)建立的平臺(tái), 用于方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用
接下來(lái)整理的是開(kāi)發(fā)中常用的特性,一些作者認(rèn)為不常用的可能會(huì)不記錄或者記錄的不詳細(xì)
NodeJs的發(fā)布規(guī)則
- CURRENT:指代最新的 Node.js 版本系列。
- Active:指正在積極維護(hù)和升級(jí)的版本系列,包括向后移植非破壞性功能和改進(jìn),解決錯(cuò)誤以及修補(bǔ)安全漏洞。
- Maintenance:這是一個(gè)維護(hù)的 LTS 版本系列,直到它的生命周期終止,只會(huì)在短時(shí)間內(nèi)收到錯(cuò)誤修復(fù)和安全補(bǔ)丁。
- LTS:是Long-Term Support 的縮寫(xiě),代表 Node.js 長(zhǎng)期支持的版本(版本號(hào)為復(fù)數(shù))。
- EOL:EOL 是 End of Life 的首字母縮寫(xiě),進(jìn)入到 EOL 時(shí)間線的版本,將不在維護(hù)。
讓我們看下 Node.js版本的生命周期是怎么樣的?首先要知道每年的 4 月、10 月分別發(fā)布偶數(shù)、奇數(shù)版本,下面是過(guò)程說(shuō)明:
最近的一個(gè)偶數(shù)版本在 4 月份發(fā)布之后會(huì)持續(xù) 6 個(gè)月。 待 10 月份會(huì)發(fā)布一個(gè)奇數(shù)版本,最近的偶數(shù)版本會(huì)進(jìn)入 Active LTS版本。持續(xù)時(shí)間為 18 個(gè)月,這期間幾乎不會(huì)有不兼容的大功能更新,開(kāi)發(fā)者也可以放心升級(jí)到 Active LTS 版本。
18 個(gè)月的Active LTS 版本到期后,會(huì)進(jìn)入 Maintenance LTS 版本,也就是進(jìn)入維護(hù)期,時(shí)間為 12
個(gè)月,在這期間僅進(jìn)行安全、Bug 更新。 一旦 Maintenance LTS 版本 12 個(gè)月的時(shí)間已到就會(huì)進(jìn)入 EOL
版本,正式退出歷史舞臺(tái)。
其中偶數(shù)版本會(huì)持續(xù)維護(hù)18個(gè)月,而奇數(shù)版本指揮維護(hù)8個(gè)月。
生命周期圖
20.0.0
2023-04-18發(fā)布
1. 權(quán)限模型
Node.js 現(xiàn)在有一個(gè)名為權(quán)限模型的實(shí)驗(yàn)性功能。它允許開(kāi)發(fā)人員在程序執(zhí)行期間限制對(duì)特定資源的訪問(wèn),例如文件系統(tǒng)操作、子進(jìn)程生成和工作線程創(chuàng)建。API 存在于一個(gè)標(biāo)志后面–experimental-permission,啟用后將限制對(duì)所有可用權(quán)限的訪問(wèn)。通過(guò)使用此功能,開(kāi)發(fā)人員可以防止他們的應(yīng)用程序訪問(wèn)或修改敏感數(shù)據(jù)或運(yùn)行可能有害的代碼。
- 使用–allow-fs-read和–allow-fs-write限制對(duì)文件讀寫(xiě)系統(tǒng)的訪問(wèn)
- 使用–allow-child-process限制訪問(wèn) child_process
- 使用–allow-worker限制訪問(wèn) worker_threads
- 使用–no-addons制對(duì)本機(jī)插件的訪問(wèn)
2. 自定義 ESM 加載程序掛鉤在專用線程上運(yùn)行
通過(guò)加載程序 ( ) 提供的 ESM 掛鉤–experimental-loader=foo.mjs現(xiàn)在在與主線程隔離的專用線程中運(yùn)行。這為加載程序提供了一個(gè)單獨(dú)的范圍,并確保加載程序和應(yīng)用程序代碼之間沒(méi)有交叉污染。
3. import.meta.resolve()
為了與瀏覽器行為保持一致,此函數(shù)現(xiàn)在同步返回。盡管如此,用戶加載resolve程序掛鉤仍然可以定義為異步函數(shù)(或同步函數(shù),如果作者愿意的話)。即使resolve加載了異步掛鉤,import.meta.resolve仍會(huì)同步返回應(yīng)用程序代碼。
4. V8 11.3
V8 引擎更新到版本 11.3,它是 Chromium 113 的一部分。這個(gè)版本包括 JavaScript API 的三個(gè)新特性
- String.prototype.isWellFormed 和 toWellFormed
isWellFormed用于檢查這個(gè)字符串是否是一個(gè)合法的 Unicode,而toWellFormed則會(huì)將一個(gè)字符串轉(zhuǎn)換為 Unicode。
通過(guò)復(fù)制改變 Array 和 TypedArray 的方法
現(xiàn)有的Array.prototype和TypedArray.prototype的函數(shù)會(huì)直接修改接收的數(shù)組。而新函數(shù)會(huì)返回接收的數(shù)組的修改副本,并將原始數(shù)組保持不變。這些新函數(shù)在數(shù)據(jù)不可變的編程風(fēng)格中很有用。
可調(diào)整大小的 ArrayBuffer 和可增長(zhǎng)的 SharedArrayBuffer
帶有集合符號(hào)的 RegExp v 標(biāo)志 + 字符串的屬性
WebAssembly 尾調(diào)用
5. 穩(wěn)定的測(cè)試運(yùn)行器
最近對(duì) Node.js 版本 20 的更新包括對(duì) test_runner 模塊的重要更改。在最近的更新后,該模塊已被標(biāo)記為穩(wěn)定。以前,test_runner 模塊是實(shí)驗(yàn)性的,但這次更改標(biāo)志著它是一個(gè)可以用于生產(chǎn)的穩(wěn)定模塊。
它主要用來(lái)編寫(xiě)并運(yùn)行測(cè)試文件,類似mock等測(cè)試組件包
- describe/it/test函數(shù),以及測(cè)試文件的鉤子。
- mock 數(shù)據(jù)。
- 監(jiān)聽(tīng)文件變化模式(watch mode)。
- node --test支持并行運(yùn)行多個(gè)測(cè)試文件。
6. Ada 2.0
Node.js v20 附帶了最新版本的 URL 解析器 Ada。此更新為 URL 解析帶來(lái)了顯著的性能改進(jìn),包括增強(qiáng)url.domainToASCII了.url.domainToUnicodenode:url
Ada 2.0 已集成到 Node.js 代碼庫(kù)中,確保應(yīng)用程序的所有部分都能從改進(jìn)的性能中受益。此外,Ada 2.0 比其前身 Ada 1.0.4 具有顯著的性能提升,同時(shí)還消除了對(duì) URL 主機(jī)名解析的 ICU 要求。
19.0.0
2022-10-18發(fā)布
1. HTTP(S)/1.1 KeepAlive 默認(rèn)
從此版本開(kāi)始,Node.jskeepAlive默認(rèn)設(shè)置為 true。這意味著任何傳出的 HTTP(s) 連接都將自動(dòng)使用 HTTP 1.1 Keep-Alive。默認(rèn)等待時(shí)間為 5 秒。啟用 keep-alive 將提供更好的吞吐量,因?yàn)槟J(rèn)情況下會(huì)重用連接。
此外,代理現(xiàn)在能夠解析Keep-Alive服務(wù)器可能發(fā)送的響應(yīng)。此標(biāo)頭指示客戶端保持連接的程度。另一方面,Node.js HTTP 服務(wù)器現(xiàn)在將在調(diào)用時(shí)自動(dòng)斷開(kāi)空閑客戶端(使用 HTTP Keep-Alive 重用連接)close()。
默認(rèn)情況下,Node.js HTTP(S)/1.1 請(qǐng)求可能會(huì)體驗(yàn)到更好的吞吐量/性能。
2. 刪除了 DTrace/SystemTap/ETW 支持
3. V8 10.7
V8 引擎更新到 10.7 版,它是 Chromium 107 的一部分。該版本包括 JavaScript API 的新功能:Intl.NumberFormat.
Intl.NumberFormatv3 API 是一個(gè)新的TC39 ECMA402 第 3 階段提案, 擴(kuò)展了現(xiàn)有的Intl.NumberFormat.
4. llhttp 8.1.0
llhttp 已經(jīng)更新到 8.1.0 版本。總的來(lái)說(shuō),這個(gè)版本對(duì) llhttp API 帶來(lái)了許多更新,引入了新的回調(diào)并允許所有回調(diào)都可以暫停。
18.0.0
2022-04-19發(fā)布
1. fetch(實(shí)驗(yàn)性)
默認(rèn)情況下,全局范圍內(nèi)提供了一個(gè)實(shí)驗(yàn)性的獲取 API。該實(shí)現(xiàn)基于undici,一個(gè)由項(xiàng)目貢獻(xiàn)者為 Node.js 編寫(xiě)的 HTTP/1.1 客戶端。
const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) {const data = await res.json();console.log(data); }通過(guò)此添加,可以使用以下全局變量:fetch, FormData, Headers, Request, Response
使用–no-experimental-fetch命令行標(biāo)志禁用此 API
2. HTTP 超時(shí)
server.headersTimeout這限制了解析器等待接收完整 HTTP 標(biāo)頭的時(shí)間,現(xiàn)在60000默認(rèn)設(shè)置為(60 秒)。
server.requestTimeout300000設(shè)置從客戶端接收整個(gè)請(qǐng)求的超時(shí)值(以毫秒為單位)現(xiàn)在默認(rèn)設(shè)置為(5 分鐘)。
如果這些超時(shí)到期,服務(wù)器將以狀態(tài) 408 響應(yīng)而不將請(qǐng)求轉(zhuǎn)發(fā)給請(qǐng)求偵聽(tīng)器,然后關(guān)閉連接。
兩個(gè)超時(shí)都必須設(shè)置為非零值,以防止在服務(wù)器部署前沒(méi)有反向代理的情況下發(fā)生潛在的拒絕服務(wù)攻擊。
3. Test Runner 模塊(實(shí)驗(yàn)性的)
該node:test模塊有助于創(chuàng)建以 TAP 格式報(bào)告結(jié)果的 JavaScript 測(cè)試。
import test from 'node:test';該模塊僅在該方案下可用node:
以下是具有兩個(gè)子測(cè)試的父測(cè)試的示例實(shí)現(xiàn):
4. 工具鏈和編譯器升級(jí)
5. V8 10.1
V8 引擎更新到 10.1 版本,它是 Chromium 101 的一部分。與 Node.js 17.9.0 中包含的版本相比,包括以下新特性
findLast數(shù)組findLastIndex方法
const inputArray = [{v:1}, {v:2}, {v:3}, {v:4}, {v:5}]; inputArray.findLast((element) => element.v % 2 === 0); // → {v:4} inputArray.findLast((element) => element.v % 7 === 0); // → undefined inputArray.findLastIndex((element) => element.v % 2 === 0); // → 3 inputArray.findLastIndex((element) => element.v % 7 === 0); // → -1Intl.LocaleAPI的改進(jìn)。
Intl.supportedValuesOf
改進(jìn)了類字段和私有類方法的性能(它們的初始化現(xiàn)在與普通屬性存儲(chǔ)一樣快)
17.0.0
2021-10-19發(fā)布
1. OpenSSL 3.0
2. V8 9.5
V8 JavaScript 引擎更新到 V8 9.5。此版本附帶Intl.DisplayNamesAPI 的其他受支持類型和timeZoneNameAPI 中的擴(kuò)展選項(xiàng)Intl.DateTimeFormat
3. Readline 承諾 API
該模塊提供了一個(gè)接口,用于一次一行地readline從 Readable 流(例如 )中讀取數(shù)據(jù)。process.stdin
以下簡(jiǎn)單示例說(shuō)明了該readline模塊的基本用法
import * as readline from 'node:readline/promises'; import { stdin as input, stdout as output } from 'process';const rl = readline.createInterface({ input, output });const answer = await rl.question('What do you think of Node.js? ');console.log(`Thank you for your valuable feedback: ${answer}`);rl.close();16.0.0
2021-04-21發(fā)布
1. 穩(wěn)定Timers Promises API
Timers Promises API 提供了一組替代的計(jì)時(shí)器函數(shù),它們返回 Promise 對(duì)象。在 Node.js v15.0.0 中添加,在此版本中,它們從實(shí)驗(yàn)狀態(tài)升級(jí)到穩(wěn)定狀態(tài)。
import { setTimeout } from 'timers/promises';async function run() {const res = await setTimeout(3000, 'fullFilledValue');console.log(`Get result=>${res} after 3s`); }run(); // 3s后輸出:Get result=>fullFilledValue after 3s2. 工具鏈和編譯器升級(jí)
3. V8 JavaScript 引擎更新到 V8 9.0,包括性能調(diào)整和改進(jìn)
這次V8的升級(jí)帶來(lái)了ECMAScript RegExp比對(duì)索引功能,能提供字符串的開(kāi)始與結(jié)束索引。當(dāng)正則表達(dá)式帶有/d標(biāo)簽時(shí),可以通過(guò)indices屬性訪問(wèn)到索引數(shù)組。
14.0.0
2020-04-21發(fā)布
1. V8 8.1
可選鏈接
Nullish 合并
Intl.DisplayNames
為 Intl.DateTimeFormat 啟用 calendar 和 numberingSystem 選項(xiàng)
2. 實(shí)驗(yàn)性異步本地存儲(chǔ) API
3. 強(qiáng)化流 API
13.0.0
2019-10-22發(fā)布
1. 斷言
如果驗(yàn)證函數(shù)傳遞給assert.throws()或assert.rejects() 返回的值不是true,則將拋出斷言錯(cuò)誤而不是原始錯(cuò)誤以突出顯示編程錯(cuò)誤(Ruben Bridgewater)
2. 構(gòu)建
Node.js 版本現(xiàn)在使用默認(rèn)的 full-icu 支持構(gòu)建。這意味著現(xiàn)在包含了 ICU 支持的所有語(yǔ)言環(huán)境,并且與國(guó)際相關(guān)的 API 可能會(huì)返回與以前不同的值(Richard Lau)
3. V8 7.8
新增對(duì)象解構(gòu)、內(nèi)存使用和 WebAssembly 啟動(dòng)時(shí)間的性能改進(jìn)
12.0.0
2019-04-29發(fā)布
1. V8 7.4
在V8 7.4中,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)最重要的新特性是預(yù)計(jì)計(jì)算屬性,可以讓開(kāi)發(fā)人員更方便地通過(guò)表達(dá)式來(lái)定義對(duì)象屬性,同時(shí)引入了更多的原型方法。此外,V8 7.4還實(shí)現(xiàn)了大量的內(nèi)存管理和性能改進(jìn),這將使得Node.js 12的性能更加穩(wěn)定和可靠。
2. 更快的ES模塊加載
隨著Web應(yīng)用程序變得越來(lái)越龐大,加載和解析JavaScript模塊的速度越來(lái)越成為Web開(kāi)發(fā)的瓶頸。為了解決這個(gè)問(wèn)題,Node.js 12引入了較新的V8版本的快速對(duì)象存儲(chǔ)訪問(wèn),從而使得ES模塊的加載和解析速度更快,可實(shí)現(xiàn)更快的Web應(yīng)用程序加載時(shí)間和啟動(dòng)時(shí)間。
3. HTTP/2的完整支持
HTTP/2作為HTTP協(xié)議的下一代,擁有比HTTP 1.x更快、更安全的數(shù)據(jù)傳輸速度。Node.js 12支持HTTP/2的完整支持,包括對(duì)HTTP/2流的完整流控、過(guò)程化二進(jìn)制協(xié)議的解碼和對(duì)H2C升級(jí)的支持。同樣,Node.js 12還支持ALPN協(xié)議,在HTTPS請(qǐng)求中使用HTTP/2。
11.0.0
2018-10-23發(fā)布
1. V8 7.0
2. fs
3. console
10.0.0
2018-04-24發(fā)布
1. 斷言
2. 異步鉤子
3. Buffer
4. V8 6.6
5. 發(fā)送事件
該EventEmitter.prototype.off()方法已添加為 的別名EventEmitter.prototype.removeListener()
6. fs
7. node10x后續(xù)版本開(kāi)放了工作線程
工作線程主要用于解決node計(jì)算類的業(yè)務(wù)問(wèn)題。但需要注意的是,對(duì)io類操作沒(méi)有作用。
總結(jié)
以上是生活随笔為你收集整理的NodeJs 最近各版本特性汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 爬虫一定要用代理IP吗,不用行不行
- 下一篇: C++ —面向对象之多态的实现与应用