Node.js v21.7.2 ドキュメント
- Node.js v21.7.2
- ► 目次
-
► インデックス
- アサーションテスト
- 非同期コンテキスト追跡
- Async Hooks
- Buffer
- C++ アドオン
- Node-API を使用した C/C++ アドオン
- C++ エンベッダー API
- 子プロセス
- Cluster
- コマンドラインオプション
- Console
- Corepack
- Crypto
- Debugger
- 非推奨 API
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- ファイルシステム
- Globals
- HTTP
- HTTP/2
- HTTPS
- Inspector
- 国際化
- モジュール: CommonJS モジュール
- モジュール: ECMAScript モジュール
- モジュール:
node:module
API - モジュール: パッケージ
- Net
- OS
- Path
- パフォーマンスフック
- 権限
- Process
- Punycode
- クエリ文字列
- Readline
- REPL
- Report
- 単一実行可能アプリケーション
- Stream
- String Decoder
- テストランナー
- Timers
- TLS/SSL
- トレースイベント
- TTY
- UDP/データグラム
- URL
- Utilities
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker Threads
- Zlib
- ► その他のバージョン
- ► オプション
国際化サポート#
Node.js には、国際化されたプログラムを簡単に記述するための多くの機能があります。それらのいくつかを以下に示します。
- ECMAScript 言語仕様のロケール対応または Unicode 対応の関数
- ECMAScript 国際化 API 仕様 (別名 ECMA-402) で説明されているすべての機能
Intl
オブジェクトString.prototype.localeCompare()
やDate.prototype.toLocaleString()
のようなロケール対応メソッド
- WHATWG URL パーサーの国際化ドメイン名 (IDN) サポート
require('node:buffer').transcode()
- より正確な REPL 行編集
require('node:util').TextDecoder
RegExp
Unicode プロパティエスケープ
Node.js と基盤となる V8 エンジンは、ネイティブ C/C++ コードでこれらの機能を実装するために、International Components for Unicode (ICU) を使用しています。完全な ICU データセットは、デフォルトで Node.js によって提供されます。ただし、ICU データファイルのサイズのため、Node.js のビルド時または実行時に ICU データセットをカスタマイズするためのいくつかのオプションが用意されています。
Node.js をビルドするためのオプション#
Node.js で ICU がどのように使用されるかを制御するために、コンパイル時に 4 つの configure
オプションを利用できます。Node.js のコンパイル方法の詳細については、BUILDING.md に記載されています。
--with-intl=none
/--without-intl
--with-intl=system-icu
--with-intl=small-icu
--with-intl=full-icu
(デフォルト)
各 configure
オプションで利用可能な Node.js および JavaScript 機能の概要
機能 | none | system-icu | small-icu | full-icu |
---|---|---|---|---|
String.prototype.normalize() | none (関数は no-op) | full | full | full |
String.prototype.to*Case() | full | full | full | full |
Intl | none (オブジェクトが存在しない) | partial/full (OS による) | partial (英語のみ) | full |
String.prototype.localeCompare() | partial (ロケール非対応) | full | full | full |
String.prototype.toLocale*Case() | partial (ロケール非対応) | full | full | full |
Number.prototype.toLocaleString() | partial (ロケール非対応) | partial/full (OS による) | partial (英語のみ) | full |
Date.prototype.toLocale*String() | partial (ロケール非対応) | partial/full (OS による) | partial (英語のみ) | full |
レガシー URL パーサー | partial (IDN サポートなし) | full | full | full |
WHATWG URL パーサー | partial (IDN サポートなし) | full | full | full |
require('node:buffer').transcode() | none (関数が存在しない) | full | full | full |
REPL | partial (不正確な行編集) | full | full | full |
require('node:util').TextDecoder | partial (基本的なエンコーディングのサポート) | partial/full (OS による) | partial (Unicode のみ) | full |
RegExp Unicode プロパティエスケープ | none (無効な RegExp エラー) | full | full | full |
「(ロケール非対応)」の指定は、関数が、もし存在すれば、その関数の非 Locale
バージョンと同じように動作を実行することを示します。たとえば、none
モードでは、Date.prototype.toLocaleString()
の動作は Date.prototype.toString()
の動作と同一です。
すべての国際化機能を無効にする (none
)#
このオプションを選択した場合、ICU は無効になり、上記のほとんどの国際化機能は、結果の node
バイナリで利用できなくなります。
プリインストールされた ICU でビルドする (system-icu
)#
Node.js は、システムにすでにインストールされている ICU ビルドに対してリンクできます。実際、ほとんどの Linux ディストリビューションには ICU がインストールされており、このオプションを使用すると、OS の他のコンポーネントで使用されているのと同じデータセットを再利用できます。
String.prototype.normalize()
や WHATWG URL パーサー など、ICU ライブラリ自体のみを必要とする機能は、system-icu
の下で完全にサポートされます。 Intl.DateTimeFormat
など、ICU ロケールデータも必要とする機能は、システムにインストールされている ICU データの完全性に応じて、完全または部分的にサポートされる 場合があります。
限定された ICU データセットを埋め込む (small-icu
)#
このオプションにより、結果のバイナリは ICU ライブラリに対して静的にリンクし、ICU データ (通常は英語ロケールのみ) のサブセットを node
実行可能ファイルに含めます。
String.prototype.normalize()
や WHATWG URL パーサー など、ICU ライブラリ自体のみを必要とする機能は、small-icu
の下で完全にサポートされます。Intl.DateTimeFormat
など、ICU ロケールデータも必要とする機能は、一般的に英語ロケールでのみ動作します。
const january = new Date(9e8);
const english = new Intl.DateTimeFormat('en', { month: 'long' });
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
console.log(english.format(january));
// Prints "January"
console.log(spanish.format(january));
// Prints either "M01" or "January" on small-icu, depending on the user’s default locale
// Should print "enero"
このモードでは、機能とバイナリサイズのバランスが提供されます。
ランタイムで ICU データを提供する#
small-icu
オプションを使用した場合でも、すべての ICU ロケールに対して JS メソッドが機能するように、実行時に追加のロケールデータを提供できます。データファイルが /runtime/directory/with/dat/file
に保存されていると仮定すると、次のいずれかを使用して ICU で利用できるようにすることができます。
-
--with-icu-default-data-dir
configure オプション./configure --with-icu-default-data-dir=/runtime/directory/with/dat/file --with-intl=small-icu
これは、デフォルトのデータディレクトリパスをバイナリに埋め込むだけです。実際のデータファイルは、このディレクトリパスから実行時にロードされます。
-
NODE_ICU_DATA
環境変数env NODE_ICU_DATA=/runtime/directory/with/dat/file node
-
--icu-data-dir
CLI パラメーターnode --icu-data-dir=/runtime/directory/with/dat/file
上記の複数が指定されている場合、--icu-data-dir
CLI パラメーターが最も優先度が高く、次に NODE_ICU_DATA
環境変数、そして --with-icu-default-data-dir
configure オプションが続きます。
ICU は、さまざまなデータ形式を自動的に検索してロードできますが、データは ICU バージョンに適しており、ファイル名は正しく命名されている必要があります。データファイルの最も一般的な名前は icudtX[bl].dat
で、X
は対象の ICU バージョンを示し、b
または l
はシステムのエンディアンを示します。指定されたディレクトリから予期されるデータファイルを読み取ることができない場合、Node.js はロードに失敗します。現在の Node.js バージョンに対応するデータファイルの名前は、次のように計算できます。
`icudt${process.versions.icu.split('.')[0]}${os.endianness()[0].toLowerCase()}.dat`;
その他のサポートされる形式と ICU データ全般の詳細については、ICU ユーザーガイドの 「ICU データ」 の記事を参照してください。
full-icu npm モジュールを使用すると、実行中の node
実行可能ファイルの ICU バージョンを検出し、適切なデータファイルをダウンロードすることで、ICU データのインストールを大幅に簡素化できます。npm i full-icu
を通じてモジュールをインストールすると、データファイルは ./node_modules/full-icu
で利用できるようになります。このパスを、上記のように NODE_ICU_DATA
または --icu-data-dir
に渡して、完全な Intl
サポートを有効にすることができます。
ICU 全体を埋め込む (full-icu
)#
このオプションを指定すると、生成されるバイナリはICUに静的にリンクされ、ICUデータのフルセットが含まれます。この方法で作成されたバイナリは、外部依存関係がなく、すべてのロケールをサポートしますが、かなり大きくなる可能性があります。--with-intl
フラグが渡されない場合、これがデフォルトの動作です。公式バイナリもこのモードでビルドされています。
国際化サポートの検出#
ICUが有効になっているか(system-icu
、small-icu
、またはfull-icu
)どうかを確認するには、Intl
が存在するかどうかを確認するだけで十分です。
const hasICU = typeof Intl === 'object';
または、ICUが有効な場合にのみ定義されるプロパティであるprocess.versions.icu
を確認することもできます。
const hasICU = typeof process.versions.icu === 'string';
英語以外のロケール(つまり、full-icu
またはsystem-icu
)のサポートを確認するには、Intl.DateTimeFormat
が良い判別要素になります。
const hasFullICU = (() => {
try {
const january = new Date(9e8);
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
return spanish.format(january) === 'enero';
} catch (err) {
return false;
}
})();
Intl
のサポートに関するより詳細なテストについては、以下のリソースが役立つ可能性があります。