Hoe maak je een uitvoerbaar (.exe) bestand van JavaScript code (met Node.js)

Een uitvoerbaar bestand maken

Voor deze demo gaan we pkg command-line tool gebruiken. U bent vrij om nexe of een ander programma naar keuze te kiezen, maar ik vind pkg makkelijker in gebruik. Allereerst moeten we pkg globaal installeren met het npm commando. U kunt het ook lokaal installeren om de CLI interface programmatisch te gebruiken.

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

Als het pakket eenmaal globaal is geïnstalleerd, krijgt u het pkg commando om uitvoerbare bestanden te maken. De pkg-opdracht heeft een invoerbestand nodig dat een JavaScript-programma is dat wordt uitgevoerd wanneer de gebruiker dubbelklikt op het gegenereerde uitvoerbare bestand. Andere command-line opties bepalen hoe het uitvoerbare bestand wordt gegenereerd.

Entry File

Het entry-bestandspad wordt gegeven via het <input> argument, zoals het $ pkg server.js commando in ons geval, dat een lokaal bestandspad is. Maar we kunnen ook het pad naar package.json opgeven en het pkg commando zal de bin eigenschap van de package.json gebruiken om het pad van het entry JavaScript bestand te vinden. Als een directory pad is opgegeven, dan zoekt het pkg commando naar het package.json bestand van die directory gebruik makend van de bin eigenschap.

Assets

Assets zijn statische bronnen zoals .html, .js, .css, .png, .json bestanden die in het uitvoerbare bestand moeten worden opgenomen. Om pkg te instrueren om dergelijke bestanden in het uitvoerbare bestand op te nemen, moeten we deze bestandspaden opgeven via pkg.assets property van package.json. De waarde hiervan is een glob pattern of een array van glob patterns.

💡 In dit geval moet package.json het invoerpad zijn, zodat pkg assets kan kiezen die in het uitvoerbare bestand moeten worden opgenomen.

Wanneer een uitvoerbaar bestand is gemaakt, zal pkg het ingevoerde JavaScript-bestand samen met statische elementen in één uitvoerbaar bestand opnemen. Dit is waar de dingen een beetje ingewikkeld worden. Omdat alle project bestanden nu zijn verpakt in een enkel bestand, verliezen de relatieve bestandspaden hun betekenis en zo ook de mappenstructuur.

Maar tijdens runtime (wanneer het uitvoerbare bestand draait), zijn deze bestanden georganiseerd in een virtueel bestandssysteem dat een snapshot bestandssysteem wordt genoemd. Gewoonlijk hebben deze bestanden in runtime /snapshot/ (of C:\snapshot\ in windows) voorvoegsel in hun pad alsof ze zich in /snapshot directory van het systeem bevinden.

Maar u kunt veilig een asset bestand in het uitvoerbare bestand lokaliseren (in runtime) door gebruik te maken van de path.join methode en __dirname variabele om een relatief pad te construeren zoals path.join( __dirname, './www/main.js' ). Het pad zal net zo werken als een echt directory pad in een echt bestandssysteem. Lees deze documentatie om meer te weten te komen over het snapshot-bestandssysteem.

💡 Pas op. Tijdens het compilatieproces kijkt pkg naar de require()-statements in de code en neemt deze bestanden automatisch op als statische elementen. Daarom hoeft u dergelijke bestanden wellicht niet als static assets in de package.json op te nemen. Er zijn echter enkele voorbehouden, zoals hier wordt uitgelegd.

Targets

We kunnen een uitvoerbaar bestand voor een specifiek systeem genereren met de --targets command-line vlag. De waarde van deze vlag is een string in het formaat <node>-<platform>-<arch>. Het zou ook een door komma’s gescheiden lijst van dit patroon kunnen zijn om meerdere systeemarchitecturen te targeten. U zou ook het pkg.targets veld van de package.json kunnen gebruiken om deze waarden op te geven.

De node waarde is een doel-major versie van de Node. De platform waarde is de naam van het doel-besturingssysteem en het zou een van deze freebsd, linux, alpine, macos, win kunnen zijn. De arch-waarde is de architectuur van de doelprocessor en kan een van de volgende zijn x64, x86, armv6, armv7.

We kunnen een van deze waarden weglaten uit de doelspecificatie. In dat geval gebruikt pkg zijn waarde uit de huidige systeemconfiguratie. We kunnen 'host' gebruiken als waarde voor de --targets in dat geval worden al deze waarden verkregen uit de huidige systeemconfiguratie.

Output

We zullen proberen uitvoerbare bestanden te maken voor de besturingssystemen macOS en Windows, met name voor de processorarchitectuur x64. Aangezien ons startpunt server.js is, zullen we bin eigenschap van de package.json gebruiken om het bestandspad aan te geven. Ook zullen we alle bestandspaden in node_modules en src vermelden als statische activa, omdat onze server.js daarvan afhankelijk is. Al deze vereisten in aanmerking genomen, ziet onze package.json er als volgt uit.

(bron: gist.github.com)

Om de binaire uitvoerbare bestanden te genereren, moeten we pkg . commando uitvoeren, omdat we willen dat pkg het package.json bestand uit de huidige directory gebruikt om het invoerbestand, de assets en de targets te vinden. We kunnen ook pkg package.json commando gebruiken, dat hetzelfde doet.

Zodra dit commando is uitgevoerd, downloadt pkg de juiste Node.js binaries gebaseerd op de targets waarden en slaat ze op in een directory gespecificeerd door de PKG_CACHE_PATH omgevingsvariabele, zodat de volgende keer wanneer dezelfde targets worden tegengekomen, pkg de binaire bestanden in de cache kan gebruiken.

Zodra alle binaire bestanden zijn gedownload, genereert pkg de uitvoerbare bestanden in de huidige directory. De bestandsnaam en extensie van deze bestanden wordt bepaald door pkg en ziet er normaal uit als <package>-<target>.<ext> waarbij package de name waarde is in de package.json.

Het naamgevingsschema en de uitvoerdirectory kunnen we echter regelen met de --output of --out-path optie waarden. We gaan --output gebruiken om de uitvoermap en de naam van het uitvoerbare bestand op te geven.

$ pkg --output build/web .

Het bovenstaande commando genereert de volgende bestanden in build map.

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

Nu kunt u dubbelklikken op een van deze bestanden (volgens uw machine) en het zal een webpagina openen in de standaard systeem browser die de formule een drivers.

(http://127.0.0.1:52254/)

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.