Node.js v21.7.2 ドキュメント
- Node.js v21.7.2
- ► 目次
-
► インデックス
- アサーションテスト
- 非同期コンテキスト追跡
- Async hooks
- Buffer
- C++ アドオン
- Node-API を使用した C/C++ アドオン
- C++ エンベッダー API
- 子プロセス
- Cluster
- コマンドラインオプション
- Console
- Corepack
- Crypto
- デバッガー
- 非推奨の API
- 診断チャネル
- DNS
- Domain
- エラー
- Events
- ファイルシステム
- グローバル
- HTTP
- HTTP/2
- HTTPS
- Inspector
- 国際化
- モジュール: CommonJS モジュール
- モジュール: ECMAScript モジュール
- モジュール:
node:module
API - モジュール: パッケージ
- Net
- OS
- Path
- パフォーマンスフック
- パーミッション
- プロセス
- Punycode
- クエリ文字列
- Readline
- REPL
- レポート
- シングル実行可能アプリケーション
- Stream
- 文字列デコーダー
- テストランナー
- タイマー
- TLS/SSL
- トレースイベント
- TTY
- UDP/データグラム
- URL
- ユーティリティ
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker threads
- Zlib
- ► その他のバージョン
- ► オプション
モジュール: ECMAScript モジュール#
はじめに#
ECMAScript モジュールは、JavaScript コードを再利用するためにパッケージ化するための公式標準形式です。モジュールは、さまざまなimport
ステートメントとexport
ステートメントを使用して定義されます。
ESモジュールの次の例では、関数をエクスポートします
// addTwo.mjs
function addTwo(num) {
return num + 2;
}
export { addTwo };
ESモジュールの次の例では、addTwo.mjs
から関数をインポートします
// app.mjs
import { addTwo } from './addTwo.mjs';
// Prints: 6
console.log(addTwo(4));
Node.jsは、現在指定されているECMAScriptモジュールを完全にサポートしており、それらと元のモジュール形式であるCommonJSとの間の相互運用性を提供します。
有効化#
Node.jsには、CommonJSモジュールとECMAScriptモジュールの2つのモジュールシステムがあります。
作成者は、.mjs
ファイル拡張子、値が"module"
のpackage.json
の"type"
フィールド、値が"module"
の--input-type
フラグ、または値が"module"
の--experimental-default-type
フラグを使用して、JavaScriptをESモジュールとして解釈するようにNode.jsに指示できます。これらは、コードがESモジュールとして実行されることを意図している明示的なマーカーです。
逆に、作成者は、.cjs
ファイル拡張子、値が"commonjs"
のpackage.json
の"type"
フィールド、値が"commonjs"
の--input-type
フラグ、または値が"commonjs"
の--experimental-default-type
フラグを使用して、JavaScriptをCommonJSとして解釈するようにNode.jsに指示できます。
コードにいずれかのモジュールシステムの明示的なマーカーがない場合、Node.jsはモジュールのソースコードを調べてESモジュール構文を探します。そのような構文が見つかった場合、Node.jsはコードをESモジュールとして実行します。それ以外の場合は、モジュールをCommonJSとして実行します。詳細については、モジュールシステムの決定を参照してください。
パッケージ#
このセクションはモジュール:パッケージに移動されました。
import
指定子#
用語#
import
ステートメントの指定子は、import { sep } from 'node:path'
の'node:path'
など、from
キーワードの後の文字列です。指定子は、export from
ステートメントや、import()
式の引数としても使用されます。
指定子には3つのタイプがあります。
-
'./startup.js'
や'../config.mjs'
のような相対指定子。これらは、インポートするファイルの場所からの相対パスを参照します。これらのファイル拡張子は常に必要です。 -
'some-package'
や'some-package/shuffle'
のようなベア指定子。これらは、パッケージ名によるパッケージのエントリポイント、または例に従ってパッケージ名がプレフィックスされたパッケージ内の特定の機能モジュールを参照できます。ファイル拡張子の追加は、"exports"
フィールドがないパッケージにのみ必要です。 -
'file:///opt/nodejs/config.js'
のような絶対指定子。これらは、完全パスを直接かつ明示的に参照します。
ベア指定子の解決は、Node.jsモジュール解決およびロードアルゴリズムによって処理されます。その他すべての指定子の解決は、標準の相対URL解決セマンティクスでのみ常に解決されます。
CommonJSと同様に、パッケージ内のモジュールファイルは、パッケージのpackage.json
に"exports"
フィールドが含まれていない限り、パッケージ名にパスを追加することでアクセスできます。その場合、パッケージ内のファイルは"exports"
で定義されたパスを介してのみアクセスできます。
Node.jsモジュール解決のベア指定子に適用されるこれらのパッケージ解決ルールの詳細については、パッケージのドキュメントを参照してください。
必須のファイル拡張子#
import
キーワードを使用して相対または絶対指定子を解決する場合は、ファイル拡張子を指定する必要があります。ディレクトリインデックス(例:'./startup/index.js'
)も完全に指定する必要があります。
この動作は、通常構成されたサーバーを想定すると、ブラウザ環境でのimport
の動作と一致します。
URL#
ESモジュールはURLとして解決およびキャッシュされます。これは、特殊文字をパーセントエンコードする必要があることを意味します。たとえば、#
を%23
、?
を%3F
でエンコードします。
file:
、node:
、およびdata:
URLスキームがサポートされています。カスタムHTTPSローダーを使用しない限り、'https://example.com/app.js'
のような指定子はNode.jsではネイティブにサポートされていません。
file:
URL#
解決するために使用されるimport
指定子に異なるクエリまたはフラグメントがある場合、モジュールは複数回ロードされます。
import './foo.mjs?query=1'; // loads ./foo.mjs with query of "?query=1"
import './foo.mjs?query=2'; // loads ./foo.mjs with query of "?query=2"
ボリュームルートは、/
、//
、またはfile:///
を介して参照できます。URLとパス解決の違い(パーセントエンコードの詳細など)を考慮すると、パスをインポートする場合はurl.pathToFileURLを使用することをお勧めします。
data:
インポート#
data:
URLは、次のMIMEタイプでインポートするためにサポートされています
- ESモジュールの場合は
text/javascript
- JSONの場合は
application/json
- Wasmの場合は
application/wasm
import 'data:text/javascript,console.log("hello!");';
import _ from 'data:application/json,"world!"' with { type: 'json' };
data:
URLは、組み込みモジュールと絶対指定子に対してのみベア指定子を解決します。相対指定子の解決は、data:
が特殊なスキームではないため機能しません。たとえば、data:text/javascript,import "./foo";
から./foo
をロードしようとすると、data:
URLには相対解決の概念がないため、解決に失敗します。
node:
インポート#
node:
URLは、Node.js組み込みモジュールをロードする別の手段としてサポートされています。このURLスキームを使用すると、組み込みモジュールを有効な絶対URL文字列で参照できます。
import fs from 'node:fs/promises';
インポート属性#
この機能は以前は "インポートアサーション" と呼ばれており、
with
の代わりにassert
キーワードを使用していました。以前のassert
キーワードを使用しているコードは、代わりにwith
を使用するように更新する必要があります。
インポート属性提案は、モジュールインポートステートメントのインライン構文を追加し、モジュール指定子とともに詳細な情報を渡せるようにします。
import fooData from './foo.json' with { type: 'json' };
const { default: barData } =
await import('./bar.json', { with: { type: 'json' } });
Node.js は、以下の type
値をサポートしており、これらの属性は必須です。
属性 type | 必要となる対象 |
---|---|
'json' | JSON モジュール |
組み込みモジュール#
コアモジュールは、パブリックAPIの名前付きエクスポートを提供します。また、CommonJSエクスポートの値であるデフォルトのエクスポートも提供されます。デフォルトのエクスポートは、特に、名前付きエクスポートの変更に使用できます。組み込みモジュールの名前付きエクスポートは、module.syncBuiltinESMExports()
を呼び出すことによってのみ更新されます。
import EventEmitter from 'node:events';
const e = new EventEmitter();
import { readFile } from 'node:fs';
readFile('./foo.txt', (err, source) => {
if (err) {
console.error(err);
} else {
console.log(source);
}
});
import fs, { readFileSync } from 'node:fs';
import { syncBuiltinESMExports } from 'node:module';
import { Buffer } from 'node:buffer';
fs.readFileSync = () => Buffer.from('Hello, ESM');
syncBuiltinESMExports();
fs.readFileSync === readFileSync;
import()
式#
動的import()
は、CommonJSとESモジュールの両方でサポートされています。CommonJSモジュールでは、ESモジュールをロードするために使用できます。
import.meta
#
import.meta
メタプロパティは、以下のプロパティを含む Object
です。
import.meta.dirname
#
- <string> 現在のモジュールのディレクトリ名。これは、
import.meta.filename
のpath.dirname()
と同じです。
注意点:
file:
モジュールでのみ存在します。
import.meta.filename
#
- <string>現在のモジュールの完全な絶対パスとファイル名、および
- シンボリックリンクが解決されたもの。
- これは、
url.fileURLToPath()
と同じです。 import.meta.url
.
注意点 ローカルモジュールのみがこのプロパティをサポートしています。
file:
プロトコルを使用しないモジュールはこれを提供しません。
import.meta.url
#
- <string> モジュールの絶対
file:
URL。
これは、現在のモジュールファイルのURLを提供するブラウザとまったく同じように定義されています。
これにより、相対ファイルロードなどの便利なパターンが可能になります
import { readFileSync } from 'node:fs';
const buffer = readFileSync(new URL('./data.proto', import.meta.url));
import.meta.resolve(specifier)
#
import.meta.resolve
は、各モジュールにスコープされたモジュール相対解決関数であり、URL文字列を返します。
const dependencyAsset = import.meta.resolve('component-lib/asset.css');
// file:///app/node_modules/component-lib/asset.css
import.meta.resolve('./dep.js');
// file:///app/dep.js
Node.jsモジュール解決のすべての機能がサポートされています。依存関係の解決は、パッケージ内で許可されたエクスポートの解決の対象となります。
注意点:
- これにより、同期ファイルシステム操作が発生する可能性があり、
require.resolve
と同様にパフォーマンスに影響を与える可能性があります。 - この機能は、カスタムローダー内では使用できません(デッドロックが発生します)。
非標準API:
--experimental-import-meta-resolve
フラグを使用すると、その関数は2番目の引数を受け入れます
CommonJSとの相互運用性#
import
ステートメント#
import
ステートメントは、ESモジュールまたはCommonJSモジュールを参照できます。import
ステートメントはESモジュールでのみ許可されていますが、動的なimport()
式は、ESモジュールをロードするためにCommonJSでサポートされています。
CommonJSモジュールをインポートする場合、module.exports
オブジェクトがデフォルトのエクスポートとして提供されます。名前付きエクスポートは、より良いエコシステム互換性のための利便性として、静的解析によって提供される場合があります。
require
#
CommonJSモジュールのrequire
は、参照するファイルを常にCommonJSとして扱います。
ESモジュールは非同期実行であるため、ESモジュールをロードするためにrequire
を使用することはサポートされていません。代わりに、CommonJSモジュールからESモジュールをロードするには、import()
を使用してください。
CommonJS名前空間#
CommonJSモジュールは、任意の型のmodule.exports
オブジェクトで構成されます。
CommonJSモジュールをインポートする場合、ESモジュールのデフォルトインポートまたはそれに対応する構文糖を使用して確実にインポートできます。
import { default as cjs } from 'cjs';
// The following import statement is "syntax sugar" (equivalent but sweeter)
// for `{ default as cjsSugar }` in the above import statement:
import cjsSugar from 'cjs';
console.log(cjs);
console.log(cjs === cjsSugar);
// Prints:
// <module.exports>
// true
CommonJSモジュールのECMAScriptモジュール名前空間表現は、常にCommonJSのmodule.exports
値を指すdefault
エクスポートキーを持つ名前空間です。
このモジュール名前空間エキゾチックオブジェクトは、import * as m from 'cjs'
または動的インポートを使用すると直接観測できます。
import * as m from 'cjs';
console.log(m);
console.log(m === await import('cjs'));
// Prints:
// [Module] { default: <module.exports> }
// true
JSエコシステムでの既存の利用法との互換性を高めるために、Node.jsはさらに、インポートされたすべてのCommonJSモジュールのCommonJS名前付きエクスポートを特定し、静的分析プロセスを使用して個別のESモジュールエクスポートとして提供しようとします。
たとえば、次のようなCommonJSモジュールを考えてみましょう
// cjs.cjs
exports.name = 'exported';
上記のモジュールは、ESモジュールでの名前付きインポートをサポートしています
import { name } from './cjs.cjs';
console.log(name);
// Prints: 'exported'
import cjs from './cjs.cjs';
console.log(cjs);
// Prints: { name: 'exported' }
import * as m from './cjs.cjs';
console.log(m);
// Prints: [Module] { default: { name: 'exported' }, name: 'exported' }
モジュール名前空間エキゾチックオブジェクトの最後の例からわかるように、name
エクスポートはmodule.exports
オブジェクトからコピーされ、モジュールがインポートされるときにESモジュール名前空間に直接設定されます。
ライブバインディングの更新やmodule.exports
に追加された新しいエクスポートは、これらの名前付きエクスポートでは検出されません。
名前付きエクスポートの検出は、一般的な構文パターンに基づいていますが、名前付きエクスポートを常に正しく検出するとは限りません。このような場合は、上記で説明したデフォルトのインポート形式を使用する方が適切な場合があります。
名前付きエクスポート検出は、多くの一般的なエクスポートパターン、再エクスポートパターン、およびビルドツールとトランスパイラーの出力をカバーしています。実装された正確なセマンティクスについては、cjs-module-lexerを参照してください。
ESモジュールとCommonJSの違い#
require
、exports
、またはmodule.exports
なし#
ほとんどの場合、ESモジュールのimport
を使用してCommonJSモジュールをロードできます。
必要な場合は、module.createRequire()
を使用して、ESモジュール内にrequire
関数を作成できます。
__filename
または__dirname
なし#
これらのCommonJS変数は、ESモジュールでは使用できません。
__filename
および__dirname
のユースケースは、import.meta.filename
およびimport.meta.dirname
を介して複製できます。
アドオンロードなし#
アドオンは、現在ESモジュールインポートではサポートされていません。
代わりに、module.createRequire()
またはprocess.dlopen
でロードできます。
require.resolve
なし#
相対解決は、new URL('./local', import.meta.url)
を介して処理できます。
完全なrequire.resolve
の代替として、import.meta.resolve APIがあります。
または、module.createRequire()
を使用することもできます。
NODE_PATH
なし#
NODE_PATH
は、import
指定子を解決する際には使用されません。この動作が必要な場合は、シンボリックリンクを使用してください。
require.extensions
なし#
require.extensions
は、import
では使用されません。モジュールのカスタマイズフックは、代替手段を提供できます。
require.cache
なし#
ESモジュールローダーには独自の別個のキャッシュがあるため、require.cache
はimport
では使用されません。
JSONモジュール#
JSONファイルはimport
で参照できます
import packageConfig from './package.json' with { type: 'json' };
with { type: 'json' }
構文は必須です。 インポート属性を参照してください。
インポートされたJSONは、default
エクスポートのみを公開します。名前付きエクスポートのサポートはありません。重複を避けるために、CommonJSキャッシュにキャッシュエントリが作成されます。JSONモジュールが同じパスからすでにインポートされている場合、同じオブジェクトがCommonJSで返されます。
Wasmモジュール#
WebAssemblyモジュールのインポートは、--experimental-wasm-modules
フラグの下でサポートされており、すべての.wasm
ファイルを通常のモジュールとしてインポートできるようになり、モジュールインポートもサポートされます。
この統合は、WebAssemblyのESモジュール統合提案に沿ったものです。
たとえば、以下を含むindex.mjs
があるとします。
import * as M from './module.wasm';
console.log(M);
以下で実行すると
node --experimental-wasm-modules index.mjs
module.wasm
のインスタンス化のためのエクスポートインターフェースが提供されます。
トップレベルのawait
#
await
キーワードは、ECMAScriptモジュールのトップレベルの本体で使用できます。
以下を持つa.mjs
があると仮定します。
export const five = await Promise.resolve(5);
そして、以下を持つb.mjs
があると仮定します。
import { five } from './a.mjs';
console.log(five); // Logs `5`
node b.mjs # works
トップレベルのawait
式が解決されない場合、node
プロセスはステータスコード13
で終了します。
import { spawn } from 'node:child_process';
import { execPath } from 'node:process';
spawn(execPath, [
'--input-type=module',
'--eval',
// Never-resolving Promise:
'await new Promise(() => {})',
]).once('exit', (code) => {
console.log(code); // Logs `13`
});
HTTPSおよびHTTPインポート#
https:
およびhttp:
を使用してネットワークベースのモジュールをインポートすることは、--experimental-network-imports
フラグの下でサポートされています。これにより、WebブラウザのようなインポートがNode.jsで動作するようになります。ただし、ブラウザサンドボックスではなく特権環境で実行する場合、アプリケーションの安定性とセキュリティに関する懸念が異なるため、いくつかの違いがあります。
インポートはHTTP/1に制限されています#
HTTP/2およびHTTP/3の自動プロトコルネゴシエーションはまだサポートされていません。
HTTPはループバックアドレスに制限されています#
http:
は中間者攻撃に対して脆弱であるため、IPv4アドレス127.0.0.0/8
(127.0.0.1
から127.255.255.255
)とIPv6アドレス::1
の範囲外のアドレスには使用できません。http:
のサポートは、ローカル開発で使用することを目的としています。
認証は宛先サーバーに送信されません。#
Authorization
、Cookie
、およびProxy-Authorization
ヘッダーはサーバーに送信されません。インポートされたURLの一部にユーザー情報を含めることは避けてください。サーバー上でこれらを安全に使用するためのセキュリティモデルが検討されています。
CORSは宛先サーバーでチェックされません#
CORSは、APIのコンシューマーを特定のホストセットに制限できるように設計されています。これは、サーバーベースの実装では意味がないため、サポートされていません。
ネットワーク以外の依存関係を読み込むことはできません#
これらのモジュールは、http:
またはhttps:
を介していない他のモジュールにアクセスできません。セキュリティ上の懸念を回避しながらローカルモジュールにアクセスするには、ローカル依存関係への参照を渡します。
// file.mjs
import worker_threads from 'node:worker_threads';
import { configure, resize } from 'https://example.com/imagelib.mjs';
configure({ worker_threads });
// https://example.com/imagelib.mjs
let worker_threads;
export function configure(opts) {
worker_threads = opts.worker_threads;
}
export function resize(img, size) {
// Perform resizing in worker_thread to avoid main thread blocking
}
ネットワークベースのロードはデフォルトで有効になっていません#
当面の間、http:
またはhttps:
を介してリソースをロードするには、--experimental-network-imports
フラグが必要です。将来的には、これを強制するために別のメカニズムが使用されます。Node.jsアプリケーションの信頼性に影響を与える可能性のある可変状態を、推移的な依存関係が誤って使用するのを防ぐために、オプトインが必要です。
ローダー#
以前のローダーのドキュメントは、現在モジュール:カスタマイズフックにあります。
解決とロードアルゴリズム#
機能#
デフォルトのリゾルバーには、以下のプロパティがあります。
- ESモジュールで使用されているFileURLベースの解決
- 相対URLおよび絶対URL解決
- デフォルトの拡張子なし
- フォルダーのメインなし
- node_modulesを介したベアスペシファイアパッケージ解決ルックアップ
- 不明な拡張子またはプロトコルでの失敗なし
- ロードフェーズへのフォーマットのヒントをオプションで提供できます
デフォルトのローダーには、以下のプロパティがあります。
node:
URLを介した組み込みモジュールのロードのサポートdata:
URLを介した「インライン」モジュールのロードのサポートfile:
モジュールのロードのサポート- 他のURLプロトコルでの失敗
file:
ロードでの不明な拡張子での失敗(.cjs
、.js
、および.mjs
のみをサポート)
解決アルゴリズム#
ESモジュールスペシファイアをロードするアルゴリズムは、以下のESM_RESOLVEメソッドを通じて提供されます。これは、親URLに対するモジュールスペシファイアの解決済みURLを返します。
解決アルゴリズムは、モジュールロードの完全な解決済みURLと、推奨されるモジュール形式を決定します。解決アルゴリズムは、解決済みURLプロトコルをロードできるかどうか、またはファイル拡張子が許可されているかどうかを決定しません。代わりに、これらの検証は、ロードフェーズ中にNode.jsによって適用されます(たとえば、file:
、data:
、node:
ではないプロトコルを持つURLをロードするように要求された場合、または--experimental-network-imports
が有効な場合、https:
)。
アルゴリズムは、拡張子に基づいてファイルの形式を決定しようともします(以下のESM_FILE_FORMAT
アルゴリズムを参照)。ファイル拡張子を認識しない場合(たとえば、.mjs
、.cjs
、または.json
ではない場合)、undefined
の形式が返され、ロードフェーズ中にエラーがスローされます。
解決されたURLのモジュール形式を決定するアルゴリズムは、ESM_FILE_FORMATによって提供され、すべてのファイルの一意のモジュール形式を返します。ECMAScriptモジュールの場合、"module"形式が返され、レガシーCommonJSローダーを介したロードを示すために"commonjs"形式が使用されます。今後のアップデートでは、"addon"などの追加形式を拡張できます。
以下のアルゴリズムでは、特に明記されていない限り、すべてのサブルーチンエラーは、これらのトップレベルルーチンのエラーとして伝播されます。
defaultConditionsは、条件付き環境名配列["node", "import"]
です。
リゾルバーは、以下のエラーをスローできます。
- 無効なモジュールスペシファイア:モジュールスペシファイアが無効なURL、パッケージ名、またはパッケージサブパススペシファイアです。
- 無効なパッケージ構成:package.json構成が無効であるか、無効な構成が含まれています。
- 無効なパッケージターゲット:パッケージのエクスポートまたはインポートは、無効な型または文字列ターゲットであるパッケージのターゲットモジュールを定義します。
- パッケージパスがエクスポートされていません:パッケージのエクスポートは、特定のモジュールのパッケージ内のターゲットサブパスを定義または許可していません。
- パッケージインポートが定義されていません:パッケージのインポートは、スペシファイアを定義していません。
- モジュールが見つかりません:要求されたパッケージまたはモジュールが存在しません。
- サポートされていないディレクトリインポート:解決されたパスがディレクトリに対応しており、これはモジュールインポートのサポートされているターゲットではありません。
解決アルゴリズムの仕様#
ESM_RESOLVE(specifier, parentURL)
- resolvedをundefinedにします。
- specifierが有効なURLである場合、
- resolvedを、URLとしてspecifierを解析および再シリアル化した結果に設定します。
- それ以外の場合、specifierが"/"、"./"、または"../"で始まる場合、
- resolvedを、parentURLに対するspecifierのURL解決の結果に設定します。
- それ以外の場合、specifierが"#"で始まる場合、
- resolvedを、PACKAGE_IMPORTS_RESOLVE(specifier, parentURL, defaultConditions)の結果に設定します。
- それ以外の場合、
- 注:specifierは、ここでベアスペシファイアになります。
- resolvedを、PACKAGE_RESOLVE(specifier, parentURL)の結果に設定します。
- formatをundefinedにします。
- resolvedが"file:" URLである場合、
- resolvedに、"/"または"\"(それぞれ"%2F"および"%5C")のパーセントエンコーディングが含まれている場合、
- 無効なモジュールスペシファイアエラーをスローします。
- resolvedにあるファイルがディレクトリである場合、
- サポートされていないディレクトリインポートエラーをスローします。
- resolvedにあるファイルが存在しない場合、
- モジュールが見つかりませんエラーをスローします。
- resolvedを、同じURLクエリ文字列およびフラグメントコンポーネントを維持しながら、resolvedの実際のパスに設定します。
- formatを、ESM_FILE_FORMAT(resolved)の結果に設定します。
- それ以外の場合、
- formatを、URL resolvedに関連付けられたコンテンツタイプのモジュール形式に設定します。
- formatとresolvedをロードフェーズに返します。
PACKAGE_RESOLVE(packageSpecifier, parentURL)
- packageNameをundefinedにします。
- packageSpecifierが空の文字列である場合、
- 無効なモジュールスペシファイアエラーをスローします。
- packageSpecifierがNode.js組み込みモジュール名である場合、
- 文字列"node:"とpackageSpecifierを連結したものを返します。
- packageSpecifierが"@"で始まらない場合、
- packageNameを、最初の"/"セパレーターまたは文字列の終わりまでのpackageSpecifierのサブストリングに設定します。
- それ以外の場合、
- packageSpecifierに"/"セパレーターが含まれていない場合、
- 無効なモジュールスペシファイアエラーをスローします。
- packageNameを、2番目の"/"セパレーターまたは文字列の終わりまでのpackageSpecifierのサブストリングに設定します。
- packageNameが"."で始まるか、"\"または"%"が含まれている場合、
- 無効なモジュールスペシファイアエラーをスローします。
- packageSubpathを、"."と、packageNameの長さの位置から始まるpackageSpecifierのサブストリングを連結したものにします。
- packageSubpathが"/"で終わる場合、
- 無効なモジュールスペシファイアエラーをスローします。
- selfUrlを、PACKAGE_SELF_RESOLVE(packageName, packageSubpath, parentURL)の結果にします。
- selfUrlがundefinedでない場合は、selfUrlを返します。
- parentURLがファイルシステムのルートではない間、
- packageURLを、parentURLに対する、"node_modules/"とpackageSpecifierを連結したもののURL解決にします。
- parentURLを、parentURLの親フォルダーURLに設定します。
- packageURLにあるフォルダーが存在しない場合、
- 次のループ反復を続行します。
- pjsonを、READ_PACKAGE_JSON(packageURL)の結果にします。
- pjsonがnullでなく、pjson.exportsがnullまたはundefinedでない場合、
- PACKAGE_EXPORTS_RESOLVE(packageURL, packageSubpath, pjson.exports, defaultConditions)の結果を返します。
- それ以外の場合、packageSubpathが"."と等しい場合、
- pjson.mainが文字列である場合、
- packageURL内のmainのURL解決を返します。
- それ以外の場合、
- packageURL内のpackageSubpathのURL解決を返します。
- モジュールが見つかりませんエラーをスローします。
PACKAGE_SELF_RESOLVE(packageName, packageSubpath, parentURL)
- packageURLを、LOOKUP_PACKAGE_SCOPE(parentURL)の結果にします。
- packageURLがnullである場合、
- undefinedを返します。
- pjsonを、READ_PACKAGE_JSON(packageURL)の結果にします。
- pjsonがnullであるか、またはpjson.exportsがnullまたはundefinedである場合、
- undefinedを返します。
- pjson.nameがpackageNameと等しい場合、
- PACKAGE_EXPORTS_RESOLVE(packageURL, packageSubpath, pjson.exports, defaultConditions)の結果を返します。
- それ以外の場合は、undefinedを返します。
PACKAGE_EXPORTS_RESOLVE(packageURL, subpath, exports, conditions)
- exports が、"." で始まるキーと、"." で始まらないキーの両方を持つオブジェクトである場合、不正なパッケージ構成エラーをスローします。
- subpath が "." に等しい場合、
- mainExport を undefined とします。
- exports が文字列または配列、または "." で始まるキーを含まないオブジェクトである場合、
- mainExport を exports に設定します。
- そうではなく、exports が "." プロパティを含むオブジェクトである場合、
- mainExport を exports["."] に設定します。
- mainExport が undefined でない場合、
- resolved を PACKAGE_TARGET_RESOLVE( packageURL, mainExport, null, false, conditions) の結果とします。
- resolved が null または undefined でない場合、resolved を返します。
- そうではなく、exports がオブジェクトで、exports のすべてのキーが "." で始まる場合、
- アサート: subpath は "./" で始まります。
- resolved を PACKAGE_IMPORTS_EXPORTS_RESOLVE( subpath, exports, packageURL, false, conditions) の結果とします。
- resolved が null または undefined でない場合、resolved を返します。
- パッケージパスがエクスポートされていませんエラーをスローします。
PACKAGE_IMPORTS_RESOLVE(specifier, parentURL, conditions)
- アサート: specifier は "#" で始まります。
- specifier が "#" に完全に等しいか、"#/" で始まる場合、
- 無効なモジュールスペシファイアエラーをスローします。
- packageURLを、LOOKUP_PACKAGE_SCOPE(parentURL)の結果にします。
- packageURL が null でない場合、
- pjsonを、READ_PACKAGE_JSON(packageURL)の結果にします。
- pjson.imports が非 null のオブジェクトである場合、
- resolved を PACKAGE_IMPORTS_EXPORTS_RESOLVE( specifier, pjson.imports, packageURL, true, conditions) の結果とします。
- resolved が null または undefined でない場合、resolved を返します。
- パッケージインポートが定義されていませんエラーをスローします。
PACKAGE_IMPORTS_EXPORTS_RESOLVE(matchKey, matchObj, packageURL, isImports, conditions)
- matchKey が matchObj のキーであり、"*" を含まない場合、
- target を matchObj[matchKey] の値とします。
- PACKAGE_TARGET_RESOLVE(packageURL, target, null, isImports, conditions) の結果を返します。
- expansionKeys を、単一の "*" のみを含む matchObj のキーのリストとし、特異性の降順で並べられたソート関数 PATTERN_KEY_COMPARE でソートします。
- expansionKeys の各キー expansionKey について、以下を実行します。
- patternBase を、最初の "*" 文字を除いた expansionKey の部分文字列とします。
- matchKey が patternBase で始まるが、patternBase に等しくない場合、
- patternTrailer を、最初の "*" 文字の後のインデックスからの expansionKey の部分文字列とします。
- patternTrailer の長さがゼロの場合、または matchKey が patternTrailer で終わり、matchKey の長さが expansionKey の長さ以上の場合、
- target を matchObj[expansionKey] の値とします。
- patternMatch を、patternBase の長さのインデックスから matchKey の長さから patternTrailer の長さを引いたまでの matchKey の部分文字列とします。
- PACKAGE_TARGET_RESOLVE(packageURL, target, patternMatch, isImports, conditions) の結果を返します。
- null を返します。
PATTERN_KEY_COMPARE(keyA, keyB)
- アサート: keyA は "/" で終わるか、単一の "*" のみを含みます。
- アサート: keyB は "/" で終わるか、単一の "*" のみを含みます。
- baseLengthA を、keyA に "*" が含まれる場合は keyA の "*" のインデックスに 1 を加えたもの、それ以外の場合は keyA の長さとします。
- baseLengthB を、keyB に "*" が含まれる場合は keyB の "*" のインデックスに 1 を加えたもの、それ以外の場合は keyB の長さとします。
- baseLengthA が baseLengthB より大きい場合は -1 を返します。
- baseLengthB が baseLengthA より大きい場合は 1 を返します。
- keyA に "*" が含まれない場合は 1 を返します。
- keyB に "*" が含まれない場合は -1 を返します。
- keyA の長さが keyB の長さより大きい場合は -1 を返します。
- keyB の長さが keyA の長さより大きい場合は 1 を返します。
- 0 を返します。
PACKAGE_TARGET_RESOLVE(packageURL, target, patternMatch, isImports, conditions)
- target が文字列の場合、
- target が "./" で始まらない場合、
- isImports が false の場合、または target が "../" または "/" で始まる場合、または target が有効な URL の場合、
- 不正なパッケージターゲットエラーをスローします。
- patternMatch が文字列の場合、
- PACKAGE_RESOLVE("*" のすべてのインスタンスが patternMatch に置き換えられた target, packageURL + "/") を返します。
- PACKAGE_RESOLVE(target, packageURL + "/") を返します。
- target を "/" または "\" で分割したものが、最初の "." セグメントの後、大文字と小文字を区別せず、パーセントエンコードされたバリアントを含め、""、"."、".."、または "node_modules" セグメントを含む場合、不正なパッケージターゲットエラーをスローします。
- resolvedTarget を packageURL と target の連結の URL 解決とします。
- アサート: packageURL は resolvedTarget に含まれています。
- patternMatch が null の場合、
- resolvedTarget を返します。
- patternMatch を "/" または "\" で分割したものが、大文字と小文字を区別せず、パーセントエンコードされたバリアントを含め、""、"."、".."、または "node_modules" セグメントを含む場合、不正なモジュール指定子エラーをスローします。
- "*" のすべてのインスタンスが patternMatch に置き換えられた resolvedTarget の URL 解決を返します。
- そうではなく、target が非 null オブジェクトの場合、
- target が、ECMA-262 6.1.7 配列インデックス で定義されているようなインデックスプロパティキーを含む場合、不正なパッケージ構成エラーをスローします。
- target の各プロパティ p について、オブジェクトの挿入順に、
- p が "default" に等しい場合、または conditions が p のエントリを含む場合、
- targetValue を target の p プロパティの値とします。
- resolved を PACKAGE_TARGET_RESOLVE( packageURL, targetValue, patternMatch, isImports, conditions) の結果とします。
- resolved が undefined に等しい場合、ループを続けます。
- resolved を返します。
- undefinedを返します。
- そうではなく、target が配列の場合、
- target.length がゼロの場合、null を返します。
- target の各アイテム targetValue について、以下を実行します。
- Invalid Package Target エラーが発生した場合はループを継続し、resolved を PACKAGE_TARGET_RESOLVE( packageURL, targetValue, patternMatch, isImports, conditions) の結果とします。
- resolved が undefined の場合、ループを続けます。
- resolved を返します。
- 最後のフォールバック解決の null 戻り値またはエラーを返すかスローします。
- そうではなく、target が null の場合、null を返します。
- それ以外の場合、不正なパッケージターゲットエラーをスローします。
ESM_FILE_FORMAT(url)
- アサート: url は既存のファイルに対応します。
- url が ".mjs" で終わる場合、
- "module" を返します。
- url が ".cjs" で終わる場合、
- "commonjs" を返します。
- url が ".json" で終わる場合、
- "json" を返します。
--experimental-wasm-modules
が有効で、url が ".wasm" で終わる場合、
- "wasm" を返します。
- packageURL を LOOKUP_PACKAGE_SCOPE(url) の結果とします。
- pjsonを、READ_PACKAGE_JSON(packageURL)の結果にします。
- packageType を null とします。
- pjson?.type が "module" または "commonjs" の場合、
- packageType を pjson.type に設定します。
- url が ".js" で終わる場合、
- packageType が null でない場合、
- packageType を返します。
--experimental-detect-module
が有効で、モジュールのソースに静的インポートまたはエクスポート構文が含まれている場合、
- "module" を返します。
- "commonjs" を返します。
- url に拡張子がない場合、
- packageType が "module" で、
--experimental-wasm-modules
が有効で、url のファイルに WebAssembly モジュールのヘッダーが含まれている場合、
- "wasm" を返します。
- packageType が null でない場合、
- packageType を返します。
--experimental-detect-module
が有効で、モジュールのソースに静的インポートまたはエクスポート構文が含まれている場合、
- "module" を返します。
- "commonjs" を返します。
- undefined を返します(ロードフェーズでスローされます)。
LOOKUP_PACKAGE_SCOPE(url)
- scopeURL を url とします。
- scopeURL がファイルシステムのルートでない間、
- scopeURL を scopeURL の親 URL に設定します。
- scopeURL が "node_modules" パスセグメントで終わる場合、null を返します。
- pjsonURL を scopeURL 内の "package.json" の解決とします。
- pjsonURL のファイルが存在する場合、
- scopeURL を返します。
- null を返します。
READ_PACKAGE_JSON(packageURL)
- pjsonURL を packageURL 内の "package.json" の解決とします。
- pjsonURL のファイルが存在しない場合、
- null を返します。
- packageURL のファイルが有効な JSON として解析されない場合、
- 不正なパッケージ構成エラーをスローします。
- pjsonURL のファイルの解析された JSON ソースを返します。
ESM 指定子解決アルゴリズムのカスタマイズ#
モジュールカスタマイズフックは、ESM指定子解決アルゴリズムをカスタマイズするメカニズムを提供します。ESM指定子にCommonJSスタイルの解決を提供する例は、commonjs-extension-resolution-loaderです。