<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    Node.js 18 新特性搶先看

    共 3689字,需瀏覽 8分鐘

     ·

    2022-04-30 12:30

    本文適合對Node.js感興趣的小伙伴閱讀~

    歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進階~

    一、前言

    本文基于開源項目:

    https://nodejs.org/en/blog/announcements/v18-release-announce/

    https://nodejs.org/en/blog/release/v18.0.0/

    Node.js 發(fā)布了 18.0.0 版本,內(nèi)置了?fetch、node:test?等標準模塊。
    簡單概括:std lib 在標準化,user lib 在精細化。

    二、快速體驗

    推薦用?fnmnvs,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 版本,請勿在生產(chǎn)環(huán)境使用,需要等到 2022-10-25 才會成為 LTS 版本。

    三、展望未來

    該項目還在繼續(xù)其“Next 10”的努力。這項工作的目標是反思導致 Node.js 前 10 年成功的原因,并為下一個 10 年的成功設(shè)定方向。


    Node.js 官方啟動了?next-10?工作,并討論出了未來重要的幾件事

    • 現(xiàn)代化的 HTTP
    • 友好的類型支持
    • 對初學者更友好的漸進式文檔
    • 對 ECMAScript 規(guī)范的支持和及時跟進
    • 可觀測性,包括 logging/metrics/tracing,以及 APM 等
    • 更好的多線程支持
    • 支持打包為單文件的分發(fā)方式

    6 月份的 OpenJS World 會議中將分享 ESM 和 Observability 進展,可以關(guān)注下相關(guān)動態(tài)。

    四、Fetch API

    小伙伴們應該都很熟悉fetch()這個 API,它提供了標準的網(wǎng)絡(luò)請求能力,取代了遠古的 XMLHttpRequest 。

    反觀 Node.js 側(cè),官方提供的?http.request(),太底層太基礎(chǔ)了,用起來往往需要大量的封裝。譬如 302 后自動跳轉(zhuǎn)、文件上傳、響應結(jié)果解析等等。

    因此在 Node.js 社區(qū)有非常多的上層請求庫封裝:
    • 曾經(jīng)廣受社區(qū)歡迎的 request 庫去年宣布停止維護后,也引起了社區(qū)比較大的混亂。。

    • Egg 內(nèi)置的是?urllib,沉淀了多年在網(wǎng)絡(luò)請求上踩的坑,足夠穩(wěn)定,不過代碼也有點久遠了。


    去年 Node.js 官方推出了 undici,一個非?,F(xiàn)代化的庫,具備優(yōu)越的性能,良好的擴展性,內(nèi)置的 mock 等能力,集大成者。
    從而?Node.js 終于內(nèi)置了新的請求庫,它遵循?Fetch 規(guī)范,底層就是基于 undici 來實現(xiàn)的。
    const?res?=?await?fetch('https://nodejs.org/api/documentation.json');
    if?(res.ok)?{
    ??const?data?=?await?res.json();
    ??console.log(data);
    }
    就這么簡單,比?http.request()?那一坨 callback-style 代碼簡潔多了,平時寫個腳本啥的,不用再引入額外的類庫了。
    全局增加了 fetch, FormData, Headers, Request, Response 這幾個 API,以及 Web Streams API。
    目前還處于默認開啟的實驗性特性階段?。。?/span>
    可能是為了遵循規(guī)范, undici 的很多能力如 Mock,Proxy,Pool 等都沒有提供出來。

    五、五大模塊

    Test Runner

    單元測試很重要,很多新興的編程語言都是會內(nèi)置對應的能力,但前端這塊一直都是由社區(qū)來實現(xiàn),前端同學耳熟能詳?shù)?Test Runner 有?MochaJest。??
    //?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',?()?=>?{});
    });

    終于,Node.js 在 18.x 里官方支持了?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)。
    類似覆蓋率的演進過程,以前我們需要通過 nyc 對代碼轉(zhuǎn)譯打樁,現(xiàn)在變?yōu)榈?Node.js 內(nèi)置覆蓋率輸出,nyc 變?yōu)?c8 這樣的覆蓋率報告生成工具。
    后續(xù) mocha 等估計會變?yōu)轭愃频纳蠈臃庋b,提供批量執(zhí)行 和 Reporter 等能力。

    Build-time user-land snapshot

    簡單的說,可以把某個 js 直接編譯成 v8 snapshot,從而可以極大的提速啟動時間。
    目前這個版本,還只能通過 Node.js 源碼來編譯,且只能編譯成 Node.js Runtime 的方式,即 Build-time。
    #?把一段?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.js 源碼:
    $?node?--build-snapshot?--snapshot-blob?marked.blob?marked.js?
    $?node?--snapshot-blob?marked.blob

    V8 引擎升級

    內(nèi)置的 V8 引擎升級到 10.1 版本,值得注意的特性:
    • class fields 和 private class methods 的性能優(yōu)化。
    • Intl 規(guī)范 的支持,在做日期的本地化,字符串處理的時候非常有用。
    • 數(shù)組支持 findLast() 和 findLastIndex() 等。

    ESM 的支持

    雖然在 18.x 中沒有新的內(nèi)容,但在過去的幾個月中一直在持續(xù)推動 ECMAScript模塊實現(xiàn):
    • JSON Import Assertions 的支持。
    • JSON 模塊的正式支持。
    • 對 HTTPS 和 HTTP 導入的實驗性支持。
    • Node.js 加載器團隊也在繼續(xù)開發(fā) ECMAScript 模塊加載器實現(xiàn)。

    工具鏈和編譯器的升級

    • Linux 版是在 RHEL8 上構(gòu)建的,要求 glibc 2.28 以上版本。

    • macOS 要求 10.15 以上版本。

    • Windows 很多舊版本也不支持了。

    五、最后

    關(guān)注我,一起攜手進階

    歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進階~

    瀏覽 65
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    久久久久久少妇 | 日韩无码小电影 | 在线观看中文字幕一区 | 久久人人妻人人做人人玩精品 | 黄色视频网在线观看 |