英文 | https ://medium.com/@nodejs/node-js-v15-0-0-is-here-deb00750f278前兩天,Node.js官方發布了Node.js 15的正式版本,Node.js 15將替代Node.js 14成為當前的穩定發行版,且將在本月晚些時候升級為LTS(長期支持)版本。如果大家想體驗下Node.js 15的最新功能,可以從官方進行下載。那節點。js 15帶來了一些新的功能和特性呢?主要體現在以下幾個方面:
1、中止控制器AbortController接口表示一個控制器對象,允許開發者根據需要中止一個或多個Web請求,Node。js 15加入了AbortController的一個實驗性實現。AbortController是一個分布式實用工具類,可根據AbortController Web API在基於更改的Promise的API中取消發出的請求信號,如下所示。
const ac = new AbortController();ac.signal.addEventListener('abort', () => console.log('Aborted!'),{ once: true });ac.abort();console.log(ac.signal.aborted); //Prints True在上面的示例中,當調用abortController.abort()方法時就會發出中斷事件,同時,AbortController將僅觸發一次中斷事件。同時,附加到AbortSignal上的事件偵聽器應使用{或等效於EventEmitterAPI的一次()),以確保重新終止事件得到處理,然後再將事件偵聽器刪除。關於AbortController的Node.js API文檔,可以參考:AbortController。2、N-API 7N-API是一個用於內置本機插件的API,它獨立於且之上JavaScript運行時環境(如V8),並作為Node.js本身的一部分。此API將作為跨Node.js版本已編譯的應用程式它是為了將插件和替換JavaScript引擎的插入隔離開來,並且允許在一個版本編譯的模塊中不需要重新編譯就可以在更高版本的Node.js上運行。N-API是一個C語言的API,它確保了Node.js版本和不同編譯器級別之間的應用程式接口(ABI)的穩定性。C++ API可以更容易使用。為了支持使用C ++,Node.js使用了一個C ++包裝器模塊稱為node-addon-api,此包裝器提供了一個可內聯的C ++ API。使用node-addon-api生成的二進位文件將依賴於Node.js導出的基於C函數符號的N -API接口,node-addon-api是一種更有效的編寫代碼的方法,用來編寫調用N-API。關於Node.js的N-API,可以參考:帶有N-API的C / C ++插件下面是node-addon-api的一個使用示例。Object obj = Object::New(env);obj["foo"] = String::New(env, "bar");napi_status status;napi_value object, string;status = napi_create_object(env, &object);if (status != napi_ok) { napi_throw_error(env, ...); return;}
status = napi_create_string_utf8(env, "bar", NAPI_AUTO_LENGTH, &string);if (status != napi_ok) { napi_throw_error(env, ...); return;}
status = napi_set_named_property(env, object, "foo", string);if (status != napi_ok) { napi_throw_error(env, ...); return;}此次更新的N-API 7是上一個大版本以來的第一個新版本,帶來了ArrayBuffers的相關內容。3、npm 7Node.js 15附帶了npm的新大版本npm7。npm7有很多新功能,包括npm工作區和新的package-lock.json格式。npm7還包括yarn.lock文件支持。npm7的一大堆變化是默認安裝對等依賴項。4、未處理的拒絕默認值從Node.js 15開始,unhandledRejection的默認狀態已更改為throw(以前是warn)。在throw模式下,如果未設置unhandledRejection hook,則將unhandledRejection升級為未捕獲的異常。會看到任何行為變化,並且仍然可以使用--unhandled-rejections = mode進度標誌來切換模式。Node.js之前的多個版本都會發出UnhandledPromiseRejectionWarning,而根據《 Node.js用戶見解:Unhandled Promise Rejections》調查的結果,Node.js TSC同意將模式切換為throw。5、QUICQUIC是谷歌制定的一種基於UDP的低時延的網際網路傳輸層協議,它是HTTP / 3的基礎傳輸協議。並且,在2016年11月國際網際網路工程任務組(IETF)提出了第一次QUIC工作組會議,受到了業界的廣泛關注,意味著QUIC開始在成為新一代傳輸層協議上邁出了關鍵的一步。同時,QUIC具有內置的TLS 1.3安全性,流控制,錯誤糾正,連接遷移和多路互補。Node.js 15附帶QUIC的實驗性支持,可通過--experimental-quic配置標誌編譯Node.js來啟用。例如,核心網模塊公開了Node.js QUIC實現,代碼如下。const { createQuicSocket } = require('net');'use strict';
const key = getTLSKeySomehow();const cert = getTLSCertSomehow();
const { createQuicSocket } = require('net');
// Create the QUIC UDP IPv4 socket bound to local IP port 1234const socket = createQuicSocket({ endpoint: { port: 1234 } });
socket.on('session', async (session) => { // A new server side session has been created!
// The peer opened a new stream! session.on('stream', (stream) => { // Let's say hello stream.end('Hello World');
// Let's see what the peer has to say... stream.setEncoding('utf8'); stream.on('data', console.log); stream.on('end', () => console.log('stream ended')); });
const uni = await session.openStream({ halfOpen: true }); uni.write('hi '); uni.end('from the server!');});
// Tell the socket to operate as a server using the given// key and certificate to secure new connections, using// the fictional 'hello' application protocol.(async function() { await socket.listen({ key, cert, alpn: 'hello' }); console.log('The socket is listening for sessions!');})();關於QUIC的更多信息,可以參考下面的文檔:QUIC。6、V8 8.6V8 JavaScript引擎已更新為V8 8.6(V8 8.4是Node.js 14中的最新版本)。除了性能調整和改進之外,V8更新還帶來了以下語言特性:Promise.any()-MDNPromise.any()接收一個Promise可重複對象,只要其中的一個諾言成功,就返回那個已經成功的諾言。如果可繼承對象中沒有一個諾言成功(即所有的諾言都失敗/拒絕),就返回一個失敗的promise和AggregateError類型的實例,它是Error的一個子類,用於把單個的錯誤集合在一起。Promise.any()的參考文檔如下所示:Promise.any()AggregateError——MDNAggregateError主要用於操作報告多個錯誤被拋出的場景,語法格式如下:new AggregateError(errors[, message])捕獲一個AggregateError的示例代碼如下:Promise.any([ Promise.reject(new Error("some error")),]).catch(e => { console.log(e instanceof AggregateError); // true console.log(e.message); // "All Promises rejected" console.log(e.name); // "AggregateError" console.log(e.errors); // [ Error: "some error" ]});創建一個AggregateError的示例代碼如下:try { throw new AggregateError([ new Error("some error"), ], 'Hello');} catch (e) { console.log(e instanceof AggregateError); // true console.log(e.message); // "Hello" console.log(e.name); // "AggregateError" console.log(e.errors); // [ Error: "some error" ]}String.prototype.replaceAll()-MDNreplaceAll()方法是返回一個新字符串,新字符串所有滿足pattern的部分都已被替換。pattern可以是一個字符串或一個RegExp,replace可以是一個字符串或一個在每次匹配被調用的函數。const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
const regex = /dog/gi;
console.log(p.replaceAll(regex, 'ferret'));// expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"
console.log(p.replaceAll('dog', 'monkey'));// expected output: "The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy?"詳細內容參考:String.prototype.replaceAll()升級另外,通過Node.js 15新版本的發布!官方希望開發者儘快進行進行升級,互換遇到的問題反饋就給官方,。當然,開發者還可以使用Node.js 15測試你的應用程式和模塊,以確保您的項目與最新的Node.js特性和更改兼容。並且,Node.js官方也開始計劃升級到Node.js 14,進入在下周升級到LTS,支持會持續到直到2023年4月。還要注意的是,Node.js 10到2021年4月結束生命周期。因此,如果你仍在使用Node.js 10,我們建議你開始計劃升級。