Wie man eine ausführbare Datei (.exe) aus JavaScript-Code erstellt (mit Node.js)

Erstellen einer ausführbaren Datei

Für diese Demo werden wir das pkg Kommandozeilen-Tool verwenden. Sie können nexe oder ein anderes Tool Ihrer Wahl wählen, aber ich finde pkg einfacher zu benutzen. Zunächst einmal müssen wir pkg global mit dem Befehl npm installieren. Man kann es auch lokal installieren, um die CLI-Schnittstelle programmatisch zu nutzen.

$ npm install --global pkg
(Quelle: gist.github.com)

Wenn das Paket global installiert ist, erhält man den Befehl pkg, um ausführbare Dateien zu erstellen. Der Befehl pkg benötigt eine Eingabedatei, bei der es sich um ein JavaScript-Programm handelt, das ausgeführt wird, wenn der Benutzer auf die erzeugte ausführbare Datei doppelklickt. Andere Befehlszeilenoptionen steuern, wie die ausführbare Datei erzeugt wird.

Eingabedatei

Der Pfad der Eingabedatei wird durch das Argument <input> angegeben, wie in unserem Fall durch den Befehl $ pkg server.js, der ein lokaler Dateipfad ist. Wir können aber auch den Pfad zu package.json angeben, und der Befehl pkg verwendet die Eigenschaft bin von package.json, um den Pfad der JavaScript-Eingabedatei zu finden. Wenn ein Verzeichnispfad angegeben wird, sucht der Befehl pkg die package.json-Datei dieses Verzeichnisses anhand ihrer bin-Eigenschaft.

Assets

Assets sind statische Ressourcen wie .html, .js, .css, .png, .json-Dateien, die in die ausführbare Datei aufgenommen werden sollten. Um pkg anzuweisen, solche Dateien in die ausführbare Datei aufzunehmen, müssen wir diese Dateipfade über die pkg.assets-Eigenschaft von package.json angeben. Sein Wert ist ein glob-Muster oder ein Array von glob-Mustern.

💡 In diesem Fall sollte package.json der Eingabepfad sein, damit pkg assets die Dateien auswählen kann, die in die ausführbare Datei aufgenommen werden sollen.

Wenn eine ausführbare Datei erstellt wird, nimmt pkg die JavaScript-Eingabedatei zusammen mit statischen Assets in eine einzige ausführbare Datei auf. An dieser Stelle werden die Dinge ein wenig kompliziert. Da alle Projektdateien nun in eine einzige Datei gepackt sind, verlieren die relativen Dateipfade ihre Bedeutung und damit auch die Ordnerstruktur.

Aber zur Laufzeit (wenn die ausführbare Datei ausgeführt wird) sind diese Dateien in einem virtuellen Dateisystem organisiert, das als Snapshot-Dateisystem bezeichnet wird. Normalerweise haben diese Dateien zur Laufzeit das Präfix /snapshot/ (oder C:\snapshot\ in Windows) in ihrem Pfad, als ob sie sich innerhalb des /snapshot-Verzeichnisses des Systems befinden würden.

Aber Sie können eine Asset-Datei in der ausführbaren Datei (zur Laufzeit) sicher lokalisieren, indem Sie die Methode path.join und die Variable __dirname verwenden, um einen relativen Pfad wie path.join( __dirname, './www/main.js' ) zu konstruieren. Der Pfad funktioniert genauso gut wie ein echter Verzeichnispfad in einem echten Dateisystem. Um mehr über das Snapshot-Dateisystem zu erfahren, lesen Sie diese Dokumentation.

💡 Achtung. Während des Kompilierungsprozesses sieht sich pkg die require()-Anweisungen im Code an und schließt diese Dateien automatisch als statische Assets ein. Daher müssen Sie solche Dateien möglicherweise nicht als statische Elemente in package.json angeben. Es gibt jedoch einige Vorbehalte, die hier erläutert werden.

Targets

Wir können eine ausführbare Datei für ein bestimmtes System mit dem --targets Befehlszeilen-Flag erzeugen. Der Wert dieses Flags ist eine Zeichenkette im Format <node>-<platform>-<arch>. Es könnte auch eine kommagetrennte Liste dieses Musters sein, um mehrere Systemarchitekturen anzusprechen. Sie können auch das Feld pkg.targets der package.json verwenden, um diese Werte anzugeben.

Der Wert node ist eine Ziel-Hauptversion des Knotens. Der platform-Wert ist der Name des Zielbetriebssystems und könnte einer der folgenden freebsd, linux, alpine, macos, win sein. Der Wert arch ist die Zielprozessorarchitektur und könnte einer der folgenden Werte sein: x64, x86, armv6, armv7.

Wir könnten einen dieser Werte in der Zielspezifikation weglassen. In diesem Fall verwendet pkg seinen Wert aus der aktuellen Systemkonfiguration. Wir können 'host' als Wert für --targets verwenden, in diesem Fall werden alle diese Werte aus der aktuellen Systemkonfiguration bezogen.

Ausgabe

Wir werden versuchen, ausführbare Dateien für die Betriebssysteme macOS und Windows zu erstellen, insbesondere für die x64 Prozessorarchitektur. Da unser Einstiegspunkt server.js ist, werden wir die bin-Eigenschaft von package.json verwenden, um den Dateipfad anzugeben. Außerdem werden wir alle Dateipfade innerhalb von node_modules und src als statische Assets angeben, da unser server.js davon abhängt. Unter Berücksichtigung all dieser Anforderungen sieht unser package.json wie folgt aus.

(Quelle: gist.github.com)

Um die binären ausführbaren Dateien zu generieren, müssen wir den Befehl pkg . ausführen, da pkg die package.json-Datei aus dem aktuellen Verzeichnis verwenden soll, um die Eingabedatei, die Assets und die Ziele zu finden. Wir könnten auch den Befehl pkg package.json verwenden, der dasselbe tut.

Wenn dieser Befehl ausgeführt wird, lädt pkg die entsprechenden Node.js-Binärdateien auf der Grundlage der targets-Werte herunter und speichert sie in einem Verzeichnis, das durch die Umgebungsvariable PKG_CACHE_PATH angegeben wird, sodass pkg beim nächsten Mal, wenn dieselben Ziele angetroffen werden, die zwischengespeicherten Binärdateien verwenden kann.

Wenn alle Binärdateien heruntergeladen sind, erzeugt pkg die ausführbaren Dateien im aktuellen Verzeichnis. Der Dateiname und die Erweiterung dieser Dateien werden von pkg bestimmt und sehen normalerweise wie <package>-<target>.<ext> aus, wobei package der name-Wert in package.json ist.

Das Benennungsschema und das Ausgabeverzeichnis können jedoch mit den Optionswerten --output oder --out-path gesteuert werden. Wir verwenden die Option --output, um das Ausgabeverzeichnis und den Namen der ausführbaren Datei anzugeben.

$ pkg --output build/web .

Der obige Befehl erzeugt die folgenden Dateien im Verzeichnis build.

node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)

Nun können Sie auf eine dieser Dateien doppelklicken (je nach Ihrem Rechner) und es wird eine Webseite im Standard-Systembrowser geöffnet, die die Formel 1-Treiber anzeigt.

(http://127.0.0.1:52254/)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.