Node.js v20 の新機能 (テスト ランナー、アクセス許可モデル、SEA、V8 JS Engine 11.3)

公開: 2023-04-28

Node.js v20 が利用可能になりました! 2023年4月18日に公開され、どなたでもご利用いただけるようになりました。 今回のリリースでは、Node.js の安全性が大幅に向上し、パフォーマンスが向上するはずです。

これは偶数番号のリリースであるため、2023 年 10 月に長期サポート (LTS) バージョンになり、2026 年 4 月までサポートされる予定です。ただし、Node.js チームはコミュニティを積極的に求めています。 LTS に昇格する前に問題を特定して修正するためのフィードバック。

Node.js のこの新しいリリースは、実験的なアクセス許可モデル、同期import.meta.resolve 、安定したテスト ランナー、V8 JavaScript エンジンのバージョン 11.3 への更新、パフォーマンスの改善とバグの導入など、開発者がきっと喜ぶエキサイティングな更新と機能をもたらします。修正、その他多数。

この記事では、Node.js v20 で導入された変更点を探り、その新しい機能と機能を詳しく見ていきます。

Node.js v20 の概要

Node.js v20 のインストールは、Node.js の他のバージョンと非常によく似ています。 あなたがする必要があるのは次のとおりです。

  1. Node.js の公式 Web サイトからインストーラー パッケージをダウンロードします。
  2. インストーラーをダウンロードしたら、それを実行し、指示に従ってインストール プロセスを完了します。 このプロセスは非常に簡単で、使用許諾契約に同意して「次へ」ボタンをクリックするだけです。
  3. インストールプロセスが完了したら、システム/マシンを再起動して、すべての変更を有効にします。
  4. 次のコマンドを実行して、Node.js のインストールを確認します。
 node -v
Node.js v20 のインストールを確認する
Node.js v20 のインストール

バージョン番号 (v20.0.0) が表示されている場合は、Node.js が正しくインストールされており、Node.js v20 を使用する準備ができていることを意味します。

Node.js v20 が登場しました! アクセス許可モデル、同期 import.meta.resolve、安定したテスト ランナー、その他のエキサイティングな機能と更新をここで確認してください

Node.js v20 の新機能

今回の Node.js リリースで導入された 5 つの主要な更新について見ていきましょう。 これらの機能は次のとおりです。

実験的な許可モデル

Node.js v20 での実験的なアクセス許可モデルの導入は、開発者が実行中に特定のリソースへのアクセスをより詳細に制御できるようにする重要な追加です。

この新機能は、運用環境など、セキュリティとリソースの使用が重要な場合に役立ちます。

アクセス許可モデルには、ファイル システム、child_process、worker_threads、およびネイティブ アドオンへのアクセスの制限を含む、いくつかの機能が付属しています。

開発者は--allow-fs-read--allow-fs-write--allow-child-processなどのフラグを使用して、アクセス可能なリソースを指定できます。 これらのフラグを有効にするには、開発者は--experimental-permissionフラグを必要な権限と組み合わせて使用​​する必要があります。

以下は、パーミッション モデルを使用してファイル システム全体への読み取りおよび書き込みアクセスを許可する方法の例です。

 $ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

開発者は、アクセス許可モデルを使用して、特定のフォルダーやファイルへのアクセスを指定することもできます。 たとえば、次のコマンドは/tmp/フォルダーへの書き込みアクセスを許可します。

 $ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

パーミッション モデルの重要な利点の 1 つは、ファイル システムのアクセスをより細かく制御できることです。 たとえば、開発者はパスとワイルドカード パターンを指定して、特定のフォルダーまたはファイルへのアクセスを許可できます。

 $ node --experimental-permission --allow-fs-read=/home/user/* index.js

上記のコマンドは、 /home/user/ディレクトリ内のすべてのフォルダーへの読み取りアクセスを許可します。

プロセス オブジェクトの権限プロパティを使用して、実行時に特定の権限が付与されているかどうかを確認することもできます。 たとえば、Node.js プロセスが特定のフォルダー/home/user/documentsへの読み取りアクセス権を持っているかどうかを確認する場合は、次のコードを使用できます。

 if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }

パーミッション モデルを使用すると、Node.js プロセスのファイル システム アクセスをよりきめ細かく制御できるため、セキュリティが向上し、リソースの使用効率が向上します。

アクセス許可モデルはまだ実験段階であり、Node.js の将来のリリースで変更される可能性があることに注意してください。 これらの実験的な機能を使用する場合は、アクセス許可モデルのドキュメントを最新の状態に保ち、注意を払うことをお勧めします。

安定したテスト ランナー

Node.js v20 には、開発者が追加の依存関係をインストールすることなく、JavaScript テスト スイートを迅速かつ簡単に構築して実行できるようにする、安定したバージョンの test_runner モジュールが含まれています。

安定したテスト ランナーには、テスト ファイルのオーサリングと構造化のためのdescribeit / test 、 hooks などのいくつかのビルディング ブロックが含まれるようになりました。また、モック、ウォッチ モード、およびnode --testコマンド。

テストランナーの使用方法の例を次に示します。

 import { test, mock } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World"); test('synchronous passing test', async (t) => { // This test passes because it does not throw an exception. assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });

テスト ランナーは--test-reporterフラグを介して構成可能なカスタム テスト レポーター、 --experimental-test-coverageフラグを介した実験的なテスト カバレッジ、およびモック機能を提供します。

Jest や Mocha などのフル機能のテスト フレームワークを置き換えることは意図されていませんが、安定したテスト ランナーは、テスト スイートを作成するためのシンプルで迅速な方法を提供します。 Node.js v19 で導入されて以来、大幅に強化されており、エンドユーザーのテストとフィードバックのおかげで、Node.js v20 で安定版としてマークされています。

詳細については、このマージされたプル リクエストを参照してください。

V8 JavaScript エンジンを 11.3 にアップデート

Node.js を強化する V8 JavaScript エンジンは、Node.js v20 でバージョン 11.3 に更新されました。 これにより、パフォーマンスが向上し、新しい言語機能が導入されます。 このアップデートには次の新機能が含まれます。

  • String.prototype.isWellFormedおよびtoWellFormed : これらのメソッドは、適切な文字列形式を確保するために特に役立ちます。 これにより、ユーザー文字列の入力が正しい UTF-16 形式であることが保証され、絵文字の時代のエラーが減少します。
  • コピーによって Array と TypedArray を変更するメソッド: これは、元のデータに影響を与えずに配列の変更されたコピーを作成する場合に役立ちます。これは、比較やその他の目的で元のデータを保持する必要がある場合に特に重要です。
  • サイズ変更可能なArrayBufferと拡張可能なSharedArrayBuffer : 柔軟性が向上し、より効率的なメモリ割り当てが可能になります。
  • 文字列の記法とプロパティを設定した RegExp v フラグ: 正規表現の機能を追加します。
  • WebAssembly テール コール: 特定のタイプの関数呼び出しを最適化する方法を提供します。

これらの更新は、パフォーマンスと機能を改善するという Node.js 開発コミュニティの継続的な取り組みを示しています。

同期 import.meta.resolve()

Node.js v20 では、 import.meta.resolve()が導入されました。これにより、場所に依存しないスクリプトを簡単に記述できるようになります。 この関数は、ブラウザーの動作と同様に同期的に返されるため、より効率的な実行が可能になります。

ユーザー ローダー解決フックは引き続き非同期関数として定義できますが、非同期解決フックが読み込まれている場合でも、 import.meta.resolve()アプリケーション コードに対して同期的に戻ります。

import.meta.resolve()の同期動作により、特に大量のデータを処理する場合に、より効率的なコード実行が可能になります。 作成者は、好みに応じて、解決フックを非同期関数または同期関数として定義できます。 非同期解決フックがロードされているかどうかに関係なく、アプリケーション コードは引き続き同期的に実行されます。

実験的な単一実行可能アプリケーション (SEA)

Experimental Single Executable Applications (SEA) は、Node.js v20 で導入された新機能で、アプリケーションを Node.js バイナリにバンドルして、エンド ユーザーが単一の実行可能ファイルとして配布および実行できるようにします。

これはコミュニティからの長年の要望であり、チームは過去 1 年にわたってアプローチを改良してきました。

Node.js v20 では、単一の実行可能アプリを構築するには、生の JS ファイルを注入するのではなく、JSON 構成から Node.js によって準備された blob を注入する必要があります。

blob はバイナリ データを含むファイルであり、この場合は Node.js によって準備され、バイナリに挿入されます。 この変更は、共存する複数のリソースを SEA に埋め込むことを可能にするために行われました。これにより、新しいユース ケースが開かれます。

sea-config.jso n ファイルの例を次に示します。

 { "main": "myscript.js", "output": "sea-prep.blob" }

コマンドnode --experimental-sea-config sea-config.jsonで実行すると、blob がsea-prep.blobファイルに書き込まれ、バイナリに挿入できます。

SEA 機能により、開発者は、ユーザーが Node.js をインストールする必要なく、Node.js アプリケーションを配布できます。 この機能は、OpenJS World の JavaScriptLandia Awards の一環として、Outstanding Contribution from a New Arrival 賞を受賞した Darshan Sen によって作成されました。

OpenJS Foundation のメンバーである Microsoft は、ベクター攻撃を減らし、Node.js アーキテクチャを強化してエクスペリエンスを向上させる方法として、この機能を調査しています。 SEA 機能はまだ実験段階ですが、Node.js コミュニティにとって刺激的な新しい開発です。

パフォーマンス

Node.js v20 では、ランタイムが大幅に改善されており、新たに結成された Node.js パフォーマンス チームがパフォーマンスに新たに焦点を当てています。 改善には、URL、 fetch()EventTargetなど、ランタイムのコア部分の最適化が含まれます。

注目すべき改善点の 1 つは、 EventTargetの初期化コストが半分に削減されたことです。その結果、それを使用するすべてのサブシステムへのアクセスが高速化されました。 さらに、V8 Fast API 呼び出しは、 URL.canParse()やタイマーなどの API のパフォーマンスを向上させるために利用されています。

もう 1 つの具体的な変更点は、C++ で記述された高速で仕様に準拠した URL パーサーである Ada の更新バージョン 2.0 が含まれていることです。

Node.js v20 が安定したネイティブ テスト ランナーをもたらすことをご存知ですか? コードをより効率的にテストする時が来ました! それをチェックしてください️ クリックしてツイートします

まとめ

この記事では、V8 JavaScript エンジンの改善、パフォーマンス、テスト ランナー、実験的なパーミッション モデルの導入、単一実行アプリケーションなど、Node.js v20 がもたらす主要な機能 (実験的および安定版) と改善点のいくつかを学びました。 .

Node.js v14 は 2023 年 4 月にサポートが終了することを知っておくことが重要であるため、Node.js v18 (LTS) または vNode.js 20 (まもなく LTS) へのアップグレードの計画を開始することをお勧めします。

Node.js の最新バージョンを試してみませんか? Node.jsアプリケーションをKinstaにデプロイすることでそれを行うことができ、最初の20ドルを私たちに与えます. すでに Node.js v20 をサポートしているため、今日から新しい機能をテストできます。

今ではあなたの番です! Node.js v20 で最も興味深い機能や改善点は何ですか? 私たちが見落としているかもしれない重要なものはありますか? コメントでお知らせください。