Node.js 18 新特性搶先看
本文適合對Node.js感興趣的小伙伴閱讀~
歡迎關注前端早茶,與廣東靚仔攜手共同進階~
一、前言
本文基于開源項目:
https://nodejs.org/en/blog/announcements/v18-release-announce/
https://nodejs.org/en/blog/release/v18.0.0/
fetch、node:test?等標準模塊。二、快速體驗
推薦用?fnm,nvs,nvm?等 Node.js 版本管理器。? ?
$?fnm?install?18
Installing?Node?v18.0.0?(arm64)
$?fnm?use?18
Using?Node?v18.0.0
$?node?-v
v18.0.0
需要注意的是,該版本不是 LTS 版本,請勿在生產環(huán)境使用,需要等到 2022-10-25 才會成為 LTS 版本。

三、展望未來
該項目還在繼續(xù)其“Next 10”的努力。這項工作的目標是反思導致 Node.js 前 10 年成功的原因,并為下一個 10 年的成功設定方向。
Node.js 官方啟動了?next-10?工作,并討論出了未來重要的幾件事:
現(xiàn)代化的 HTTP 友好的類型支持 對初學者更友好的漸進式文檔 對 ECMAScript 規(guī)范的支持和及時跟進 可觀測性,包括 logging/metrics/tracing,以及 APM 等 更好的多線程支持 支持打包為單文件的分發(fā)方式
6 月份的 OpenJS World 會議中將分享 ESM 和 Observability 進展,可以關注下相關動態(tài)。
四、Fetch API
小伙伴們應該都很熟悉fetch()這個 API,它提供了標準的網絡請求能力,取代了遠古的 XMLHttpRequest 。
反觀 Node.js 側,官方提供的?http.request(),太底層太基礎了,用起來往往需要大量的封裝。譬如 302 后自動跳轉、文件上傳、響應結果解析等等。
曾經廣受社區(qū)歡迎的 request 庫去年宣布停止維護后,也引起了社區(qū)比較大的混亂。。
Egg 內置的是?urllib,沉淀了多年在網絡請求上踩的坑,足夠穩(wěn)定,不過代碼也有點久遠了。
const?res?=?await?fetch('https://nodejs.org/api/documentation.json');
if?(res.ok)?{
??const?data?=?await?res.json();
??console.log(data);
}
五、五大模塊
Test Runner
//?mocha?showcase
import?assert?from?'assert/strict';
describe('test/index.test.js',?()?=>?{
??it('test1',?async?()?=>?{
????const?res?=?await?fetch('https://nodejs.org/api/documentation.json');
????assert(res.ok);
??});
??
??it.skip('skip?some?test',?()?=>?{});
});
import?test?from?'node:test';
import?assert?from?'assert/strict';
//?等價于?describe()
test('asynchronous?passing?test',?async?()?=>?{
??const?res?=?await?fetch('https://nodejs.org/api/documentation.json');
??assert(res.ok);
});
test('multi?level?test',?async?(t)?=>?{
??//?等價于?it()
??await?t.test('subtest?1',?(t)?=>?{
????assert.strictEqual(1,?1);
??});
??await?t.test('subtest?2',?(t)?=>?{
????assert.strictEqual(2,?2);
??});
});
//?等價于?describe.skip()?/?it.skip()
test('skip?option',?{?skip:?true?},?()?=>?{});
//?等價于?describe.only()?/?it.only()
test('only?option',?{?only:?true?},?()?=>?{});
語法其實差不多,會更簡潔一點,就一個 test(),options 除了 skip 和 only 外,還支持 concurrency 并發(fā)。無需啟動器,每一個文件都是一個可執(zhí)行的 Node.js 代碼。 暫未支持 before/after/beforeEach/afterEach能力,看 issue 描述會后續(xù)支持。暫未支持 Reporter,但日志輸出為標準 TAP 格式,所以應該很容易能復用現(xiàn)有的社區(qū)生態(tài)。
Build-time user-land snapshot
#?把一段?markdown?渲染的邏輯,直接打包到?Node?Runtime
$?cd?/path/to/node/source
$?./configure?--node-snapshot-main=marked.js
$?make?node
#?執(zhí)行編譯好的?Node?Runtime
$?out/Release/node
>?const?html?=?globalThis.marked('#?this?is?title');
$?node?--build-snapshot?--snapshot-blob?marked.blob?marked.js?
$?node?--snapshot-blob?marked.blob
V8 引擎升級
class fields 和 private class methods 的性能優(yōu)化。 Intl 規(guī)范 的支持,在做日期的本地化,字符串處理的時候非常有用。 數(shù)組支持 findLast() 和 findLastIndex() 等。
ESM 的支持
對 JSON Import Assertions 的支持。 JSON 模塊的正式支持。 對 HTTPS 和 HTTP 導入的實驗性支持。 Node.js 加載器團隊也在繼續(xù)開發(fā) ECMAScript 模塊加載器實現(xiàn)。
工具鏈和編譯器的升級
Linux 版是在 RHEL8 上構建的,要求 glibc 2.28 以上版本。
macOS 要求 10.15 以上版本。
Windows 很多舊版本也不支持了。
五、最后
關注我,一起攜手進階
歡迎關注前端早茶,與廣東靚仔攜手共同進階~
