Bagaimana cara membuat file exe dari aplikasi node.js?


123

Saya memiliki aplikasi node yang saya tulis, yang saya jalankan sebagai berikut:

node.exe app.js inputArg

Apakah ada cara agar saya dapat memaketkannya menjadi .exe dengan sendirinya? Jadi saya bisa melakukan sesuatu seperti ini?

App.exe inputArg

Saya punya beberapa cara untuk memalsukan ini dengan menggunakan file batch, jadi saya bisa melakukan ini:

App.bat inputArg

Tetapi ini mengharuskan saya memiliki semua dependensi dan node di folder itu, yang tidak ideal.




Daftar alat yang bagus ada di sini: stackoverflow.com/a/12486874/32679
GrGr

1
Saya pikir siapa pun yang menambahkan jawaban di sini benar-benar perlu mempertimbangkan apakah itu sudah dilakukan. Pertanyaan ini menjadi tumpukan link ke berbagai produk open source dengan berbagai kualitas / aktivitas.
Liam

Jawaban:


35

Ada beberapa alternatif, gratis dan komersial. Saya belum pernah menggunakan salah satu dari mereka tetapi secara teori mereka harus bekerja:

Sebagian besar akan meminta Anda untuk menyimpan file batch sebagai file utama yang dapat dieksekusi, dan kemudian menggabungkan node.exe dan skrip Anda.

Bergantung pada skrip Anda, Anda juga memiliki opsi untuk mem- port-nya ke JSDB , yang mendukung cara mudah untuk membuat file yang dapat dieksekusi hanya dengan menambahkan sumber daya ke dalamnya.

Solusi kuasi ketiga adalah menyimpan node di suatu tempat seperti C:\utilsdan menambahkan folder ini ke PATHvariabel lingkungan Anda . Kemudian Anda dapat membuat file .bat di direktori itu yang menjalankan node + skrip pilihan Anda - Saya mendapat coffeescript yang coffeebekerja di windows dengan cara ini. Setup ini dapat diotomatiskan dengan file batch, vb script atau installer.


Ini terlihat bagus dan terlihat seperti mereka bisa melakukan apa yang saya inginkan. Saya akan mencobanya dan kembali kepada Anda.
Aishwar

2
Saya mencoba konverter "Advanced" Batch To EXE, dan bekerja dengan sangat baik. Anda dapat mengemas dependensi ke dalam file EXE. Terima kasih untuk bantuannya.
Aishwar

1
@Aishwar, tetapi Anda tidak dapat memaketkan folder node_modules, jadi Anda tidak dapat melakukan apa pun di dalamnya ...
Clint

Bagaimana jika Anda zip / rar node_modules, dan mengekstrak ke direktori temp saat aplikasi berjalan? Bisa jadi agak lambat, jika Anda memiliki banyak modul.
Jarrod Mosen

55

Solusi yang saya gunakan adalah node-webkit Roger Wang .

Ini adalah cara yang fantastis untuk mengemas aplikasi nodejs dan mendistribusikannya, bahkan memberi Anda opsi untuk "memaketkan" seluruh aplikasi sebagai satu yang dapat dieksekusi. Ini mendukung windows, mac dan linux.

Berikut adalah beberapa dokumen tentang berbagai opsi untuk menerapkan aplikasi node-webkit, tetapi secara singkat, Anda melakukan hal berikut:

  1. Zip up semua file Anda, dengan package.json di root
  2. Ubah ekstensi dari .zip menjadi .nw
  3. salin / b nw.exe + app.nw app.exe

Hanya sebagai catatan tambahan - Saya telah mengirimkan beberapa kotak produksi / menginstal aplikasi cd menggunakan ini, dan ini bekerja dengan baik. Aplikasi yang sama berjalan di windows, mac, linux, dan melalui web.

Pembaruan: nama proyek telah berubah menjadi 'nw.js' dan ditempatkan dengan benar di sini: nw.js


1
Baru mencobanya, bekerja dengan baik! Dan itu didukung oleh orang-orang di Intel.
Timo Huovinen

Ini harus menjadi jawaban yang benar dan terkini untuk hari ini. Lihat juga cheatsheet webkit node di sini: gist.github.com/LeCoupa/80eca2716a2b13c37cce Termasuk hal-hal yang sangat berguna seperti cara mengkompilasi JS (atau setidaknya mengolah kode byte tergantung pada seberapa kuno Anda ingin menjadi tentang kata "menyusun").
Erik Reppen

Saya suka jawaban ini, namun ini tetap tidak membuat exe mandiri. Menurut Intel dan nw.js di Github, Anda masih harus memiliki setidaknya dua file lain di folder yang sama: nw.pak dan icudt.dll. Bagaimana Anda membuat exe yang berdiri sendiri?
Jeff Baker

@JeffBaker jika Anda melihat sedikit ke bawah pada dokumen di github, Anda dapat melihat ini: github.com/nwjs/nw.js/wiki/… yang dapat Anda lakukan jika Anda tidak ingin menyertakan file tambahan.
Clayton Gulick

@Clayton, Nw.js juga didukung oleh chrome.com. developer.chrome.com/apps/migration#native
Pacerier

29

Bagi siapa pun yang tersandung pada pertanyaan ini, sekarang ada dua proyek yang membuat exe dari proyek node Anda, Pkg dan Electron.atom.io , mereka sedikit berbeda:

  1. Pkg akan mengkompilasi proyek Anda ke kode asli, mereka juga menyertakan aset DAN instalasi nodejs (sistem tidak perlu menginstal nodejs untuk mengeksekusi .exe). Kode sumber Anda tidak akan disertakan. Eksekusi yang dihasilkan adalah HANYA Windows (.exe). Semua platform didukung sekarang. Sekarang membutuhkan lisensi untuk produk komersial. Sepenuhnya open source.
  2. Electron.atom.io meskipun tidak akan memadatkan dan menghasilkan .exe untuk Anda, itu DAPAT digunakan untuk mendistribusikan aplikasi nodejs karena mereka menawarkan cara untuk mendistribusikan aplikasi . Manfaatnya adalah bahwa electron bersifat multi-platform (windows, mac osx, linux), kekurangannya adalah kode sumber Anda AKAN disertakan, meskipun mereka menawarkan cara untuk mendistribusikan aplikasi Anda di dalam arsip asar . Ini tidak akan antipeluru tetapi masih lebih baik daripada sumber Anda secara sederhana.

2
Harap perbarui: EncloseJS TIDAK mendukung Linux dan OS X sekarang.
000000000000000000000

Komentar diedit! @ 000000000000000000000
sokie

EncloseJS adalah cara untuk pergi. Saya akan mencobanya sekarang! Terima kasih telah menambahkan jawaban Anda! +1 :)
tftd

Saya tidak dapat menginstal EncloseJS. Ia mengatakan kode Err ELIFECYCLE tanpa pesan kesalahan berguna.
Elmue

2
EncloseJS tidak lagi dipertahankan. Ahli waris tampaknya zeit / pkg ( npmjs.com/package/pkg )
Lucas Gonze

21

Secara default, Windows mengasosiasikan .jsfile dengan Windows Script Host , mesin runtime JS mandiri Microsoft. Jika Anda mengetik script.js pada prompt perintah (atau mengklik dua kali .jsfile di Explorer), skrip akan dijalankan oleh wscript.exe.

Ini mungkin memecahkan masalah lokal dengan pengaturan global , tetapi Anda dapat mengasosiasikan .js file dengan node.exesebagai gantinya, sehingga mengetik script.js pada prompt perintah atau mengklik dua kali / menyeret item ke skrip akan meluncurkannya dengan Node.

Tentu saja, jika — seperti saya — Anda telah mengaitkan .jsfile dengan editor sehingga mengklik dua kali file tersebut membuka editor teks favorit Anda, saran ini tidak akan banyak membantu. Anda juga dapat menambahkan entri menu klik kanan dari "Execute with Node" ke .jsfile, meskipun alternatif ini tidak menyelesaikan kebutuhan baris perintah Anda.


Solusi paling sederhana mungkin dengan hanya menggunakan file batch - Anda tidak perlu memiliki salinan Node di folder tempat skrip Anda berada. Cukup referensikan Node yang dapat dieksekusi sepenuhnya:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Alternatif lain adalah aplikasi C # yang sangat sederhana ini yang akan memulai Node menggunakan nama filenya sendiri + .jssebagai skrip untuk dijalankan, dan meneruskan argumen baris perintah apa pun.

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Jadi jika Anda memberi nama EXE yang dihasilkan "app.exe", Anda dapat mengetik app arg1 ...dan Node akan dimulai dengan baris perintah "app.js" arg1 .... Perhatikan aplikasi bootstrapper C # akan segera keluar, meninggalkan Node yang bertanggung jawab atas jendela konsol.

Karena ini mungkin minat yang relatif luas, saya melanjutkan dan membuatnya tersedia di GitHub , termasuk exe yang dikompilasi jika masuk ke van dengan orang asing adalah hal Anda.


Seperti yang Anda sebutkan, ini tidak menyelesaikan masalah saya dengan cara yang ideal. Tapi +1 untuk bacaan yang menarik
Aishwar

@Aishwar, saya telah menambahkan aplikasi sederhana yang akan meluncurkan Node untuk Anda. Lihat hasil edit.
josh3736

@ josh3736 apakah exe Anda masih mengharuskan Anda memiliki node.exe di folder yang sama?
Ricardo Tomasi

@RicardoTomasi, tidak. Ini mengasumsikan Node diinstal di direktori Program Files sistem Anda (tempat penginstal meletakkannya).
josh3736

@ josh3736 Ini adalah solusi yang menarik. Saya suka apa yang telah Anda lakukan, saya harap saya dapat memberi +1 lagi :). Tetapi ini masih tidak ideal, karena mengharuskan pengguna untuk menginstal node.js dan di jalur standar.
Aishwar

20

Alat terbaik yang saya tahu adalah alat NodeJS : zeit / pkg

Sangat mudah digunakan (lebih dari Nexe, hanya sebagai contoh), Anda dapat menginstalnya secara global: npm install -g pkg

untuk membuat file yang dapat dieksekusi untuk macOS, Linux dan Windows:

pkg exampleApp.js

Saya memiliki sedikit kode rumit yang menggunakan server soket NodeJS, saya mencoba aplikasi yang berbeda, tidak ada yang membuatnya dengan benar, kecuali zeit / pkg .


Saya mencoba memadatkan instalasi Appium ke dalam file Exe dan zeit / pkg gagal sepenuhnya. Dari 310MB pada disk menghasilkan file Exe kecil sebesar 18MB yang jelas-jelas tidak berfungsi sama sekali.
Elmue


12

Karena pertanyaan ini telah dijawab, solusi lain telah diluncurkan.

https://github.com/appjs/appjs

Pada saat penulisan ini, ini adalah solusi akhir semua untuk aplikasi node.js pengemasan melalui paket chromium dipreteli yang dikompilasi menjadi executable.

Sunting: AppJS tidak lagi aktif, tetapi itu sendiri menyarankan garpu yang disebut deskshell.

https://github.com/sihorton/appjs-deskshell/


1
Sepertinya tautan rusak.
starbeamrainbowlabs

1
Proyek ini sudah tidak aktif. Lihat node-webkit untuk alternatif seperti yang disebutkan oleh Clayton Gulick.
Kukks

Appjs sendiri menyarankan garpu aktif yang disebut deskshell github.com/sihorton/appjs-deskshell
bitfed

11

Ada banyak jawaban bagus di sini, tapi tidak semudah JXcore .

Setelah Anda menginstal JXcore di windows, yang harus Anda lakukan adalah menjalankan:

jx package app.js "myAppName" -native

Ini akan menghasilkan file .exe yang dapat Anda distribusikan dan dapat dijalankan tanpa dependensi eksternal apa pun (Anda bahkan tidak membutuhkan JXcore atau Node.js pada sistem).

Berikut dokumentasi tentang fungsionalitas itu: http://jxcore.com/packaging-code-protection/#cat-74

Sunting 2018

Proyek itu sekarang sudah mati tetapi masih dihosting di sini: https://github.com/jxcore/jxcore-release (terima kasih @Elmue)


1
Terima kasih sobat. Bisakah saya membuat linux dapat dieksekusi dari Windows?
Sasivarnan

1
Sejauh yang saya tahu, tidak, Anda tidak bisa. Saya pikir JXCore mengambil beberapa file dari OS untuk membuatnya dapat dieksekusi, dan itu tidak mengemas file-file itu, jadi jika Anda ingin membuat Linux dapat dieksekusi, Anda harus menjalankan perintah ini di Linux.
Nepoxx


1
Semua tautan di sini sudah mati. Ini bekerja: github.com/jxcore/jxcore-release
Elmue

7

Coba disclose: https://github.com/pmq20/disclose

disclose pada dasarnya membuat exe self-extracting dari proyek Node.js Anda dan interpreter Node.js dengan karakteristik berikut,

  1. Tidak ada GUI. CLI murni.
  2. Tidak ada ketergantungan run-time
  3. Mendukung Windows dan Unix
  4. Berjalan lambat untuk pertama kalinya (mengekstrak ke dir cache), lalu berpuasa selamanya

Coba node-compiler: https://github.com/pmq20/node-compiler

Saya telah membuat proyek baru yang dipanggil node-compileruntuk mengkompilasi proyek Node.js Anda menjadi satu yang dapat dieksekusi.

Itu lebih baik dari disclose tidak pernah berjalan lambat untuk pertama kalinya, karena kode sumber Anda dikompilasi bersama dengan interpreter Node.js, sama seperti pustaka Node.js standar.

Selain itu, ini mengalihkan permintaan file dan direktori secara transparan ke memori alih-alih ke sistem file saat runtime. Sehingga tidak diperlukan kode sumber untuk menjalankan produk yang dikompilasi.

Cara kerjanya: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

Membandingkan dengan Proyek Sejenis,

  • pkg ( https://github.com/zeit/pkg ): Pkg diretas fs. * API secara dinamis untuk mengakses file dalam paket, sedangkan Node.js Compiler membiarkannya dan bekerja pada level yang lebih dalam melalui libsquash. Pkg menggunakan JSON untuk menyimpan file dalam paket sementara Node.js Compiler menggunakan SquashFS yang lebih canggih dan banyak digunakan sebagai struktur datanya.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS membatasi akses ke file dalam paket hanya untuk lima fs. * API, sedangkan Node.js Compiler mendukung semua fs. * API. EncloseJS adalah lisensi kepemilikan dan mengenakan biaya ketika digunakan sementara Node.js Compiler berlisensi MIT dan pengguna bebas untuk menggunakannya dan bebas untuk memodifikasinya.

  • Nexe ( https://github.com/nexe/nexe ): Nexe tidak mendukung kebutuhan dinamis karena penggunaan browserify, sedangkan Node.js Compiler mendukung semua jenis kebutuhan termasuk require.resolve.

  • asar ( https://github.com/electron/asar ): Asar menggunakan JSON untuk menyimpan informasi file sementara Node.js Compiler menggunakan SquashFS. Asar menyimpan arsip kode dan executable terpisah sementara Node.js Compiler menautkan semua kode sumber JavaScript bersama dengan mesin virtual Node.js dan menghasilkan satu yang dapat dieksekusi sebagai produk akhir.

  • AppImage ( http://appimage.org/ ): AppImage hanya mendukung Linux dengan kernel yang mendukung SquashFS, sedangkan Node.js Compiler mendukung ketiga platform Linux, macOS dan Windows, sementara itu tanpa persyaratan fitur khusus dari kernel.


@ StéphaneLaurent Periksa node-compiler, ini pasti mendukung penggunaan argumen baris perintah dengan exe.
Minqi Pan

Terakhir dilakukan pada 30 Agustus 2017 (2 tahun yang lalu). Dihentikan ?!
Thach Lockevn

4

Saya merekomendasikan Anda BoxedApp untuk itu. Ini adalah produk komersial yang bekerja dengan sangat baik. Ini berfungsi untuk aplikasi NodeJS apa pun. Pengguna akhir hanya akan mendapatkan satu file EXE untuk aplikasi Anda. Tidak perlu instalasi.

Di Electron, misalnya, pengguna akhir perlu menginstal / membuka kompresi aplikasi Anda, dan dia akan melihat semua file sumber kode Anda.

BoxedApp Ini mengemas semua file dan dependensi yang dibutuhkan aplikasi NodeJS Anda. Ini mendukung kompresi, dan file yang dikompilasi berfungsi pada Windows XP +

Saat Anda menggunakannya, pastikan untuk menambahkan Node.EXE ke aplikasi yang dikompilasi. Pilih versi node yang mendukung Windows XP (Jika Anda membutuhkan ini)

Program ini mendukung argumen baris perintah, Jadi setelah paket, Anda bisa melakukannya

c:\myApp argument1

Dan Anda bisa mendapatkan argumen dalam kode node Anda:

process.argv[1]

Terkadang aplikasi Anda memiliki dependensi file, jadi di BoxedApp Anda dapat menambahkan folder dan file apa pun sebagai dependensi, misalnya, Anda dapat memasukkan file pengaturan.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Info lebih lanjut:

Sekadar catatan: biasanya saya merekomendasikan tentang perangkat lunak open-source / gratis, tetapi dalam kasus ini saya tidak menemukan apa pun yang menyelesaikan pekerjaan.


1
Ini juga mendukung perlindungan kode yang baik karena data disimpan di dalam RAM tetapi tidak di Hard Drive
z0r1fan


3

Saya telah menjelajahi topik ini selama beberapa hari dan inilah yang saya temukan. Opsi terbagi dalam dua kategori:

Jika Anda ingin membangun aplikasi desktop, opsi terbaiknya adalah:

1- NW.js : memungkinkan Anda memanggil semua modul Node.js langsung dari DOM dan memungkinkan cara baru menulis aplikasi dengan semua teknologi Web.

2- Electron : Buat aplikasi desktop lintas platform dengan JavaScript, HTML, dan CSS

Berikut adalah perbandingan yang bagus di antara mereka: NW.js & Electron Compared . Menurut saya NW.js lebih baik dan juga menyediakan aplikasi untuk mengkompilasi file JS. Ada juga beberapa pembuat yang dapat dijalankan dan penginstal mandiri seperti Enigma Virtual Box . Keduanya berisi versi Chrome tertanam yang tidak diperlukan untuk aplikasi server.

jika Anda ingin mengemas aplikasi server, ini adalah opsi terbaik:

node-compiler : Ahead-of-time (AOT) Compiler dirancang untuk Node.js, yang berfungsi.

Nexe : buat satu yang dapat dieksekusi dari aplikasi node.js Anda

Dalam kategori ini, saya percaya node-compiler lebih baik yang mendukung kebutuhan dinamis dan modul node asli. Sangat mudah digunakan dan keluarannya dimulai dari 25MB. Anda dapat membaca perbandingan lengkap dengan solusi lain di halaman Node Compiler. Saya tidak banyak membaca tentang Nexe, tetapi untuk saat ini, tampaknya Node Compiler tidak mengkompilasi file js ke format biner menggunakan fitur snapshot V8 tetapi direncanakan untuk versi 2. Ini juga akan memiliki built-in installer builder.


2
Electrontidak dibenarkan untuk menjadi saran yang valid untuk masalah OP; ini adalah kerangka kerja Node yang berbeda.
progyammer

Perbandingan yang bagus!
Vlad


1

Bosan memulai menang dari command prompt lalu saya berlari melintasi ini juga. Ver. atas apa josh3736 . Ini menggunakan file XML untuk mengambil beberapa pengaturan. Misalnya jalur ke Node.exeserta file untuk memulai di app.js. default Juga lingkungan yang akan dimuat (produksi, dev, dll.) Yang telah Anda tentukan di app.js (atau server.js atau apa pun namanya). Pada dasarnya ini menambahkan di NODE_ENV={0}mana {0} adalah nama konfigurasi Anda di app.js sebagai var untuk Anda. Anda melakukan ini dengan memodifikasi elemen "mode" di config.xml. Anda dapat mengambil proyek di sini ==> direktori github . Catatan dalam acara Post Build, Anda dapat mengubah jalur salin untuk menyalin otomatis ke config.xml dan file yang dapat dieksekusi keNodejs , hanya untuk menyimpan satu langkah. Jika tidak, edit ini atau build Anda akan memberi peringatan.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }


0

Ada proyek alat membangun sumber terbuka yang disebut nodebob . Saya berasumsi bahwa jendela platform kerja,

  1. cukup klon atau unduh proyek
  2. salin semua file proyek node-webkit milik Anda ke dalam folder aplikasi.
  3. jalankan skrip build.bat.

Anda akan menemukan file yang dapat dieksekusi di dalam folder rilis.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.