Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erläuterung der Verwendung von Node.js zum Schreiben plattformübergreifender Spawn-Anweisungen

Ausführliche Erläuterung der Verwendung von Node.js zum Schreiben plattformübergreifender Spawn-Anweisungen

高洛峰
高洛峰Original
2017-02-15 17:25:242580Durchsuche

Das Mächtigste an Node.js ist „plattformübergreifend“. Mit ein wenig Sorgfalt beim Codieren funktioniert Ihr Code auf Windows-, Linux- und OSX-Plattformen. Der folgende Artikel stellt hauptsächlich vor, wie man Node.js zum Schreiben plattformübergreifender Spawn-Anweisungen verwendet. Freunde in Not können sich darauf beziehen.

Vorwort

Node.js ist plattformübergreifend, was bedeutet, dass es auf Windows-, OSX- und Linux-Plattformen ausgeführt werden kann. Viele Node.js-Entwickler entwickeln unter OSX und stellen den Code dann auf Linux-Servern bereit. Da sowohl OSX als auch Linux auf Unix basieren, haben sie viele Gemeinsamkeiten. Windows ist auch eine offiziell unterstützte Plattform für Node.js. Solange Sie den Code richtig schreiben, können Sie ihn ohne Druck auf verschiedenen Plattformen ausführen.

Unter dem child_process-Modul von Node.js gibt es eine Spawn-Funktion, mit der Befehle auf dem System aufgerufen werden können. Beispielsweise können wir auf Linux, macOS und anderen Systemen

const spawn = require('child_process').spawn;

spawn('npm', {
 stdio: 'inherit'
});

zum Aufrufen des npm-Befehls.

Die gleiche Anweisung meldet jedoch einen Fehler, wenn sie unter Windows ausgeführt wird.

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

Denn wenn wir unter Windows npm ausführen, führen wir tatsächlich den Stapel npm.cmd aus, und unter Windows führen wir die Stapelverarbeitung .cmd und .bat aus kann nicht unabhängig vom cmd.exe-Interpreter ausgeführt werden.

Daher müssen wir cmd explizit aufrufen

spawn('cmd', ['/c', 'npm'], {
 stdio: 'inherit'
});

oder beim Aufruf der Spawn-Funktion die Shell-Option auf true setzen Rufen Sie cmd implizit auf (diese Option wurde ab Node.js v6-Version hinzugefügt)

spawn('npm', {
 stdio: 'inherit',
 shell: true
});

Außerdem besteht zwar keine Notwendigkeit, es unter Linux festzulegen, Mit der Shell-Option von macOS und anderen Systemen kann der Befehl normal ausgeführt werden. Wenn Sie Shell auf „true“ setzen, wird die Ausführung des Befehls nicht behindert, es wird jedoch ein zusätzlicher unnötiger Shell-Prozess generiert, der sich auf die Leistung auswirkt.

Wenn Sie also einen plattformübergreifenden Spawn-Befehl schreiben möchten, ohne zusätzlichen Overhead hinzuzufügen, können Sie ihn wie folgt schreiben

const process = require('process');
const { spawn } = require('child_process');

spawn('npm', {
 stdio: 'inherit',
 // 仅在当前运行环境为 Windows 时,才使用 shell
 shell: process.platform === 'win32'
});

Cross-Spawn-Module von Drittanbietern


In Bezug auf die plattformübergreifende Schreibmethode der Spawn-Funktion gibt es neben der Verarbeitung beim Schreiben des Codes selbst auch Module von Drittanbietern, die das kapseln relevante Details, wie z. B. Cross-Spawn.

Mit diesem Modul können Sie beim Aufruf der Spawn-Funktion automatisch entscheiden, ob eine Shell generiert werden soll, um den angegebenen Befehl basierend auf der aktuell laufenden Plattform auszuführen.

Darüber hinaus kann es auch

  • Node.js-Versionen vor Version 6 unterstützen (die Verwendung der Shell-Option erfordert mindestens Node.js v6); >

    Plattformübergreifende Unterstützung für Shebang;
  • Bequemere Escape-Zeichen in Befehlen und Parametern.

  • Installation

npm install cross-spawn
Nutzung

const spawn = require('cross-spawn');

spawn('npm', {
 stdio: 'inherit'
});

Ausführlichere Erklärungen zur Verwendung von Node.js zum Schreiben plattformübergreifender Spawn-Anweisungen finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn