Node.js の最も強力な点は「クロスプラットフォーム」です。コーディング時に少し注意すれば、コードは Windows、Linux、OSX プラットフォームで動作します。以下の記事では、Node.js を使用してクロスプラットフォームのスポーン ステートメントを作成する方法を主に紹介します。必要な友人は参照してください。
はじめに
Node.js はクロスプラットフォームです。つまり、Windows、OSX、Linux プラットフォームで実行できます。多くの Node.js 開発者は OSX で開発し、コードを Linux サーバーにデプロイします。 OSX と Linux はどちらも Unix をベースにしているため、多くの共通点があります。 Windows は、Node.js が公式にサポートされているプラットフォームでもあり、コードを正しい方法で記述すれば、何のストレスもなくさまざまなプラットフォームで実行できます。
Node.js の child_process モジュールの下に spawn 関数があり、これを使用してシステム上のコマンドを呼び出すことができます。たとえば、Linux、macOS、その他のシステムでは、
const spawn = require('child_process').spawn; spawn('npm', { stdio: 'inherit' });
を実行して呼び出すことができます。 npmコマンド。
ただし、同じステートメントを Windows で実行するとエラーが報告されます。
Error: spawn npm ENOENT at exports._errnoException (util.js:855:11) at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32) at onErrorNT (internal/child_process.js:344:16) at nextTickCallbackWith2Args (node.js:455:9) at process._tickCallback (node.js:369:17) at Function.Module.runMain (module.js:432:11) at startup (node.js:141:18) at node.js:980:3
Windows では npm を実行すると実際には npm.cmd のバッチ処理が実行され、Windows では .cmd、.bat のバッチ処理が cmd.exe から分離できないためです。 この説明 サーバーは独立して実行されます。 。
そのため、明示的に cmd
spawn('cmd', ['/c', 'npm'], { stdio: 'inherit' });
を呼び出すか、spawn 関数を呼び出すときに使用し、暗黙的に cmd を呼び出すためにシェル オプションを true に設定する必要があります (このオプションは Node.js v6 バージョンから追加されました)
spawn('npm', { stdio: 'inherit', shell: true });
さらに、Linux、macOS、その他のシステムではシェル オプションを設定する必要はありませんが、シェルを true に設定してもコマンドの実行は妨げられませんが、追加のコマンドが生成されます。不要なシェルプロセスが発生し、パフォーマンスに影響を与えます。
そのため、追加のオーバーヘッドを加えずにクロスプラットフォームの spawn コマンドを書きたい場合は、次のように書くことができます
const process = require('process'); const { spawn } = require('child_process'); spawn('npm', { stdio: 'inherit', // 仅在当前运行环境为 Windows 时,才使用 shell shell: process.platform === 'win32' });
サードパーティモジュールのcross-spawn
クロスプラットフォームの書き込みについてspawn 関数のメソッド。自分でコードを記述するときに処理を実行することに加えて、crossspawn など、関連する詳細をカプセル化するサードパーティのモジュールもあります。
このモジュールを使用すると、spawn 関数を呼び出すときに、現在実行中のプラットフォームに基づいて、指定されたコマンドを実行するシェルを生成するかどうかを自動的に決定できます。
さらに、v6 より前の Node.js バージョンもサポートできます (シェル オプションを使用するには、少なくとも Node.js v6 が必要です)。
コマンドとパラメーターのシバンをサポートします。文字をエスケープする方が便利です。
npm install cross-spawn
const spawn = require('cross-spawn'); spawn('npm', { stdio: 'inherit' });