<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Node.js 18 新特性搶先看

          共 3689字,需瀏覽 8分鐘

           ·

          2022-04-30 12:30

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

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

          一、前言

          本文基于開源項目:

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

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

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

          二、快速體驗

          推薦用?fnmnvsnvm?等 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 后自動跳轉、文件上傳、響應結果解析等等。

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

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


          去年 Node.js 官方推出了 undici,一個非常現(xiàn)代化的庫,具備優(yōu)越的性能,良好的擴展性,內置的 mock 等能力,集大成者。
          從而?Node.js 終于內置了新的請求庫,它遵循?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。
          目前還處于默認開啟的實驗性特性階段!!!
          可能是為了遵循規(guī)范, undici 的很多能力如 Mock,Proxy,Pool 等都沒有提供出來。

          五、五大模塊

          Test Runner

          單元測試很重要,很多新興的編程語言都是會內置對應的能力,但前端這塊一直都是由社區(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 對代碼轉譯打樁,現(xiàn)在變?yōu)榈?Node.js 內置覆蓋率輸出,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 引擎升級

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

          ESM 的支持

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

          工具鏈和編譯器的升級

          • Linux 版是在 RHEL8 上構建的,要求 glibc 2.28 以上版本。

          • macOS 要求 10.15 以上版本。

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

          五、最后

          關注我,一起攜手進階

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

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一区二区三区的 | 亚洲A V免费视频 | 超碰性爱| 亚洲天堂视频一区 | 性大毛片视频 |