Hur man skapar en körbar fil (.exe) från JavaScript-kod (med Node.js)

Skapa en körbar fil

För den här demonstrationen kommer vi att använda pkg kommandoradsverktyg. Det står dig fritt att välja nexe eller något annat valfritt men jag tycker att pkg är lättare att använda. Först och främst måste vi installera pkg globalt med hjälp av kommandot npm. Du kan också installera det lokalt för att använda CLI-gränssnittet programmatiskt.

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

När paketet är globalt installerat får du kommandot pkg för att skapa körbara filer. Kommandot pkg behöver en inmatningsfil som är ett inmatat JavaScript-program som kommer att köras när användaren dubbelklickar på den genererade körbara filen. Andra kommandoradsalternativ styr hur den körbara filen genereras.

Inträdesfil

Inträdesfilens sökväg tillhandahålls genom <input>argumentet, såsom $ pkg server.jskommandot i vårt fall som är en lokal filväg. Men vi kan också ange sökvägen till package.json och kommandot pkg kommer att använda bin-egenskapen för package.json för att hitta sökvägen till den ingående JavaScript-filen. Om en katalogsökväg anges letar kommandot pkg efter package.json-filen i den katalogen och använder dess bin-egenskap.

Assets

Assets är statiska resurser som .html, .js, .css, .png, .json-filer som ska ingå i den körbara filen. För att instruera pkg att inkludera sådana filer i den körbara filen måste vi ange dessa filvägar genom pkg.assets-egenskapen i package.json. Värdet är ett globmönster eller en array av globmönster.

💡 I det här fallet bör package.json vara inmatningssökvägen så att pkg kan välja assets som behöver inkluderas i den körbara filen.

När en körbar fil skapas kommer pkg att inkludera den inmatade JavaScript-filen tillsammans med statiska tillgångar i en enda körbar fil. Det är här som saker och ting blir lite komplicerade. Eftersom alla projektfiler nu är packade i en enda fil förlorar de relativa filvägarna sin betydelse och det gör även mappstrukturen.

Men vid körning (när den körbara filen körs) organiseras dessa filer i ett virtuellt filsystem som kallas för ett snapshot-filsystem. Vanligtvis har dessa filer vid körning /snapshot/ (eller C:\snapshot\ i Windows) prefix i sin sökväg som om de ligger i /snapshot-katalogen i systemet.

Men du kan säkert hitta en tillgångsfil i den körbara filen (vid körning) med hjälp av path.join-metoden och __dirname-variabeln för att konstruera en relativ sökväg som path.join( __dirname, './www/main.js' ). Sökvägen kommer att fungera precis som om du har en riktig katalogsökväg i ett riktigt filsystem. Om du vill veta mer om snapshot-filsystemet kan du läsa den här dokumentationen.

💡 Se upp. Under kompileringsprocessen tittar pkgrequire()-angivelserna i koden och inkluderar automatiskt dessa filer som statiska tillgångar. Därför kanske du inte behöver ange sådana filer som statiska tillgångar i package.json. Det finns dock några förbehåll som förklaras här.

Mål

Vi kan generera en körbar fil för ett specifikt system med hjälp av kommandoradsflaggan --targets. Värdet för denna flagga en sträng i formatet <node>-<platform>-<arch>. Det kan också vara en kommaseparerad lista med detta mönster för att rikta in sig på flera systemarkitekturer. Du kan också använda pkg.targets-fältet i package.json för att ange dessa värden.

Värdet node är ett mål för huvudversionen av noden. Värdet platform är namnet på måloperativsystemet och kan vara något av följande freebsd, linux, alpine, macos, win. Värdet arch är målprocessorarkitekturen och det kan vara ett av dessa x64, x86, armv6, armv7.

Vi kan utelämna ett av dessa värden från målspecifikationen. I så fall använder pkg sitt värde från den aktuella systemkonfigurationen. Vi kan använda 'host' som värde för --targets i vilket fall alla dessa värden erhålls från den aktuella systemkonfigurationen.

Output

Vi kommer att försöka skapa körbara filer för operativsystemen macOS och Windows, särskilt för x64 processorarkitektur. Eftersom vår ingångspunkt är server.js kommer vi att använda bin-egenskapen för package.json för att ange dess filsökväg. Vi kommer också att nämna alla filvägar inom node_modules och src som statiska tillgångar eftersom vår server.js är beroende av den. Med tanke på alla dessa krav ser vår package.json ut som nedan.

(source: gist.github.com)

För att generera de binära körbara filerna måste vi köra kommandot pkg . eftersom vi vill att pkg ska använda package.json-filen från den aktuella katalogen för att hitta inmatningsfilen, tillgångar och mål. Vi kan också använda kommandot pkg package.json som också gör samma sak.

När det här kommandot körs laddar pkg ner lämpliga binära Node.js-filer baserat på targets-värdena och cachelagrar dem i en katalog som specificeras av miljövariabeln PKG_CACHE_PATH, så att pkg kan använda de cachelagrade binära filerna nästa gång när samma mål påträffas.

När alla binära filer har laddats ner genererar pkg de körbara filerna i den aktuella katalogen. Filnamnet och tillägget för dessa filer bestäms av pkg och ser normalt ut som <package>-<target>.<ext> där package är name-värdet i package.json.

Hur som helst kan vi styra namngivningsschemat och utdatakatalogen med hjälp av optionsvärdena --output eller --out-path. Vi kommer att använda flaggan --output för att ange utdatakatalogen och namnet på den körbara filen.

$ pkg --output build/web .

Kommandot ovan genererar följande filer i katalogen build.

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

Nu kan du dubbelklicka på någon av dessa filer (enligt din maskin) och det kommer att öppna en webbsida i systemets standardwebbläsare som visar formel en drivrutiner.

(http://127.0.0.1:52254/)

.

Lämna ett svar

Din e-postadress kommer inte publiceras.