Cum se creează un fișier executabil (.exe) din cod JavaScript (folosind Node.js)

Crearea unui fișier executabil

Pentru acest demo, vom folosi pkg instrumentul de linie de comandă. Sunteți liberi să alegeți nexe sau altul la alegere, dar eu consider că pkg este mai ușor de utilizat. Mai întâi de toate, trebuie să instalăm pkg la nivel global folosind comanda npm. De asemenea, îl puteți instala local pentru a utiliza interfața CLI în mod programatic.

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

După ce pachetul este instalat la nivel global, veți obține comanda pkg pentru a crea executabile. Comanda pkg are nevoie de un fișier de intrare care este un program JavaScript de intrare care va rula atunci când utilizatorul va face dublu clic pe fișierul executabil generat. Alte opțiuni ale liniei de comandă controlează modul în care este generat fișierul executabil.

File de intrare

Calea fișierului de intrare este furnizată prin intermediul argumentului <input>, cum ar fi comanda $ pkg server.js în cazul nostru, care este o cale de fișier local. Dar putem, de asemenea, să furnizăm calea către package.json, iar comanda pkg va utiliza proprietatea bin a package.json pentru a localiza calea fișierului JavaScript de intrare. Dacă este furnizată calea unui director, atunci comanda pkg caută fișierul package.json din acel director folosește proprietatea bin a acestuia.

Assets

Assets sunt resurse statice, cum ar fi fișierele .html, .js, .css, .png, .json care trebuie incluse în executabil. Pentru a instrui pkg să includă astfel de fișiere în executabil, trebuie să furnizăm aceste căi de acces la fișiere prin intermediul proprietății pkg.assets din package.json. Valoarea acesteia este un model glob sau o matrice de modele glob.

💡 În acest caz, package.json ar trebui să fie calea de intrare, astfel încât pkg să poată alege assets care sunt necesare pentru a fi incluse în executabil.

Când este creat un executabil, pkg va include fișierul JavaScript de intrare împreună cu activele statice într-un singur fișier executabil. Aici lucrurile se complică puțin. Deoarece toate fișierele proiectului sunt acum împachetate într-un singur fișier, căile relative ale fișierelor își pierd semnificația și la fel și structura dosarelor.

Dar în timpul execuției (când executabilul rulează), aceste fișiere sunt organizate într-un sistem de fișiere virtual numit sistem de fișiere instantaneu. De obicei, aceste fișiere în timpul execuției au prefixul /snapshot/ (sau C:\snapshot\ în Windows) în calea lor ca și cum ar fi localizate în interiorul directorului /snapshot al sistemului.

Dar puteți localiza în siguranță un fișier activ în executabil (în timpul execuției) folosind metoda path.join și variabila __dirname pentru a construi o cale relativă, cum ar fi path.join( __dirname, './www/main.js' ). Calea va funcționa foarte bine ca și cum ați avea o cale de directoare reală într-un sistem de fișiere real. Pentru a afla mai multe despre sistemul de fișiere snapshot, citiți această documentație.

💡 Atenție. În timpul procesului de compilare, pkg se uită la declarațiile require() din cod și include automat aceste fișiere ca active statice. Prin urmare, este posibil să nu fie nevoie să specificați aceste fișiere ca active statice în package.json. Cu toate acestea, există unele avertismente, după cum se explică aici.

Targets

Potem genera un fișier executabil pentru un sistem specific utilizând steagul de linie de comandă --targets. Valoarea acestui indicator un șir de caractere în formatul <node>-<platform>-<arch>. Ar putea fi, de asemenea, o listă separată prin virgulă de acest model pentru a viza mai multe arhitecturi de sistem. De asemenea, ați putea utiliza câmpul pkg.targets din package.json pentru a specifica aceste valori.

Valoarea node este o versiune majoră țintă a nodului. Valoarea platform este numele sistemului de operare țintă și ar putea fi unul dintre aceste freebsd, linux, alpine, macos, win. Valoarea arch este arhitectura procesorului țintă și ar putea fi una dintre aceste x64, x86, armv6, armv7.

Am putea omite una dintre aceste valori din specificația țintă. În acest caz, pkg utilizează valoarea sa din configurația curentă a sistemului. Putem folosi 'host' ca valoare pentru --targets, caz în care toate aceste valori sunt obținute din configurația curentă a sistemului.

Output

Vom încerca să creăm fișiere executabile pentru sistemele de operare macOS și Windows, în special pentru arhitectura procesorului x64. Deoarece punctul nostru de intrare este server.js, vom folosi proprietatea bin a package.json pentru a indica calea fișierului său. De asemenea, vom menționa toate căile de fișier din interiorul node_modules și src ca active statice, deoarece server.js al nostru depinde de acesta. Având în vedere toate aceste cerințe, package.json al nostru arată ca mai jos.

(sursa: gist.github.com)

Pentru a genera fișierele executabile binare, trebuie să executăm comanda pkg ., deoarece dorim ca pkg să utilizeze fișierul package.json din directorul curent pentru a localiza fișierul de intrare, activele și țintele. Am putea, de asemenea, să folosim comanda pkg package.json care, de asemenea, face același lucru.

După ce această comandă este executată, pkg descarcă fișierele binare Node.js corespunzătoare pe baza valorilor targets și le stochează într-un director specificat de variabila de mediu PKG_CACHE_PATH, astfel încât data viitoare când se întâlnesc aceleași ținte, pkg ar putea folosi fișierele binare stocate în memoria cache.

După ce toate fișierele binare sunt descărcate, pkg generează fișierele executabile în directorul curent. Numele de fișier și extensia acestor fișiere este decisă de pkg și în mod normal arată ca <package>-<target>.<ext> unde package este valoarea name din package.json.

Cu toate acestea, putem controla schema de denumire și directorul de ieșire folosind valorile opțiunilor --output sau --out-path. Vom folosi indicatorul --output pentru a specifica directorul de ieșire și numele fișierului executabil.

$ pkg --output build/web .

Comanda de mai sus generează următoarele fișiere în interiorul directorului build.

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

Acum puteți face dublu clic pe oricare dintre aceste fișiere (conform mașinii dvs.) și se va deschide o pagină web în browserul implicit al sistemului care va afișa driverele din formula unu.

(http://127.0.0.1:52254/)

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.