Node.js判定の極意!require.main、process.argv、global.process駆使し多角的に検証
Node.js スクリプトが実行されているかどうかを確認することは、さまざまな状況で役立ちます。 例えば、スクリプトが特定の環境でのみ実行されるようにコードを分岐させたり、Node.js 固有の機能を使用するかどうかを判断したりする場合があります。
方法
Node.js でスクリプトが実行されているかどうかを確認する方法はいくつかあります。 以下に、最も一般的な方法をいくつかご紹介します。
require.main === module を使用する
最も一般的な方法は、require.main === module
チェックを使用することです。 これは、require.main
は、現在実行されているスクリプトを表すモジュールオブジェクトを指し、module
は現在のスクリプトのモジュールオブジェクトであるためです。 以下のコード例をご覧ください。
if (require.main === module) {
// スクリプトが直接実行されている
console.log('スクリプトが直接実行されています');
} else {
// スクリプトがモジュールとして読み込まれている
console.log('スクリプトがモジュールとして読み込まれています');
}
process.argv[0] を使用する
別の方法は、process.argv[0]
を使用することです。 これは、最初の引数として Node.js 実行可能ファイルのパスを含む、コマンドライン引数の配列です。 以下のコード例をご覧ください。
if (process.argv[0].includes('node')) {
// スクリプトが Node.js で実行されている
console.log('スクリプトが Node.js で実行されています');
} else {
// スクリプトが他の環境で実行されている
console.log('スクリプトが他の環境で実行されています');
}
global.process を使用する
Node.js 10 以降では、global.process
オブジェクトを使用してスクリプトが実行されているかどうかを確認することもできます。 以下のコード例をご覧ください。
if (global.process && global.process.versions.node) {
// スクリプトが Node.js で実行されている
console.log('スクリプトが Node.js で実行されています');
} else {
// スクリプトが他の環境で実行されている
console.log('スクリプトが他の環境で実行されています');
}
isNode
パッケージを使用して、スクリプトが Node.js 環境で実行されているかどうかを簡単に確認することもできます。 以下のコード例をご覧ください。
const isNode = require('is-node');
if (isNode) {
// スクリプトが Node.js で実行されている
console.log('スクリプトが Node.js で実行されています');
} else {
// スクリプトが他の環境で実行されている
console.log('スクリプトが他の環境で実行されています');
}
上記以外にも、Node.js でスクリプトが実行されているかどうかを確認する方法はいくつかあります。 上記の例は、最も一般的で使いやすい方法のいくつかですが、ニーズに合った方法を選択することが重要です。
補足
- CommonJS は、Node.js でモジュールをロードするための標準的な方法です。 上記の方法は、CommonJS モジュールで実行されているスクリプトにも適用できます。
- ECMAScript モジュール (ESM) は、Node.js でモジュールをロードするための新しい方法です。 ESM モジュールで実行されているスクリプトかどうかを確認するには、別の方法が必要になる場合があります。
// require.main === module を使用する
if (require.main === module) {
console.log('スクリプトが直接実行されています');
} else {
console.log('スクリプトがモジュールとして読み込まれています');
}
// process.argv[0] を使用する
if (process.argv[0].includes('node')) {
console.log('スクリプトが Node.js で実行されています');
} else {
console.log('スクリプトが他の環境で実行されています');
}
// global.process を使用する (Node.js 10 以降)
if (global.process && global.process.versions.node) {
console.log('スクリプトが Node.js で実行されています');
} else {
console.log('スクリプトが他の環境で実行されています');
}
// isNode パッケージを使用する
const isNode = require('is-node');
if (isNode) {
console.log('スクリプトが Node.js で実行されています');
} else {
console.log('スクリプトが他の環境で実行されています');
}
このコードを保存して index.js
として実行すると、次の出力が得られます。
スクリプトが直接実行されています
スクリプトが Node.js で実行されています
スクリプトが Node.js で実行されています
スクリプトが Node.js で実行されています
上記のように、すべての方法が同じ結果を返します。 これは、スクリプトが index.js
として直接実行されているためです。
スクリプトを require
ステートメントを使用してモジュールとして読み込む場合は、2 番目の方法と 3 番目の方法のみが true
を返します。 これは、require.main
と global.process
は、実行中のスクリプトのみを参照するためです。 isNode
パッケージは、スクリプトが Node.js 環境で実行されているかどうかを常に正しく判断できます。
Node.js でスクリプトが実行されているかどうかを確認するその他の方法
__dirname と process.cwd() を使用する
__dirname
グローバル変数は、現在実行されているスクリプトのディレクトリパスを返します。 process.cwd()
メソッドは、現在のワーキング ディレクトリパスを返します。 Node.js でスクリプトが実行されている場合、__dirname
と process.cwd()
は同じ値になります。 以下のコード例をご覧ください。
if (__dirname === process.cwd()) {
// スクリプトが直接実行されている
console.log('スクリプトが直接実行されています');
} else {
// スクリプトがモジュールとして読み込まれている
console.log('スクリプトがモジュールとして読み込まれています');
}
URL.bundler プロパティを使用する (ESM)
ECMAScript モジュール (ESM) で、URL.bundler
プロパティを使用してスクリプトが Node.js 環境で実行されているかどうかを確認できます。 これは、URL.bundler
が node
に設定されている場合、スクリプトが Node.js で実行されていることを示します。 以下のコード例をご覧ください。
if (URL.bundler === 'node') {
// スクリプトが Node.js で実行されている
console.log('スクリプトが Node.js で実行されています');
} else {
// スクリプトが他の環境で実行されている
console.log('スクリプトが他の環境で実行されています');
}
vm.isModule 関数を使用する (Node.js 18 以降)
Node.js 18 以降では、vm.isModule
関数を使用してスクリプトが ESM モジュールかどうかを確認できます。 ESM モジュールの場合、スクリプトは Node.js 環境で実行されているとみなされます。 以下のコード例をご覧ください。
if (vm.isModule(module)) {
// スクリプトが ESM モジュールとして実行されている
console.log('スクリプトが ESM モジュールとして実行されています');
} else {
// スクリプトが他の形式で実行されている
console.log('スクリプトが他の形式で実行されています');
}
注意事項
上記の方法の中には、すべての状況で確実に機能するとは限らないものがあることに注意する必要があります。 例えば、__dirname
と process.cwd()
を使用する方法は、スクリプトがシンボリック リンク経由で実行されている場合に誤った結果を返す可能性があります。
スクリプトが Node.js で実行されているかどうかを確実に確認する必要がある場合は、require.main === module
チェックを使用するのが最善の方法です。
javascript node.js commonjs