javascript - 如何將 node.js 應用程式製作成 exe 檔案?
我有一個我寫的 Node 應用程式,我是這樣運行它的:
node.exe app.js inputArg有沒有辦法把這個單獨打包成 .exe?這樣我就可以直接這樣做嗎?
App.exe inputArg我有辦法透過使用批次檔來偽造這個,所以我可以這樣做:
App.bat inputArg但這需要我在那個資料夾中擁有所有依賴項和 node,這並不理想。
答案#1
我使用的解決方案是 Roger Wang 的 node-webkit。
這是一個將 nodejs 應用程式打包和分發的絕佳方式,它甚至提供了將整個應用程式作為單一可執行檔「打包」的選項。它支援 Windows、Mac 和 Linux。
這裡有一些關於部署 node-webkit 應用程式的各種選項的文件,但簡而言之,你需要做以下幾點:
- 將所有檔案壓縮,根目錄中有一個 package.json
- 將副檔名從 .zip 改為 .nw
- copy /b nw.exe+app.nw app.exe
作為附加說明——我已經使用這個發佈了好幾個生產版本的盒裝/安裝光碟應用程式,而且效果非常好。同一個應用程式可以在 Windows、Mac、Linux 以及網路上運行。
更新:專案名稱已更改為 'nw.js',並且正確位置在這裡:nw.js
答案#2
有一些替代方案,包括免費和商業的。我沒有使用過它們,但理論上應該可行:
- Iexpress(原生 Windows 工具)
- 快速批次檔編譯器(商業版)
- BoxedApp 打包器
- 「進階」批次轉 EXE 轉換器(免費軟體)
大多數情況下,將要求你保留批次檔作為主要可執行檔,然後再打包 node.exe 和你的腳本。
根據你的腳本,你也可以選擇將它移植到 JSDB,它支持一種簡單的方法來創建可執行文件,只需將資源附加到它上面即可。
第三個準解決方案是將 node 放在像 C:\utils 這樣的地方,並將此資料夾加入你的 PATH 環境變數。然後你可以在該目錄中建立 .bat 檔案來執行 node 加上你偏好的腳本——我就是用這種方式讓 coffeescript 的 coffee 在 Windows 上運行。這個設置可以用批次檔、VB 腳本或安裝程式自動化。
答案#3
對於任何偶然看到這個問題的人,現在有兩個項目可以將你的 Node 項目轉換成可執行文件,分別是 Pkg 和 Electron.atom.io,它們之間略有不同:
- Pkg 會將你的專案編譯成原生程式碼,它們還包含資源檔案以及 NodeJS 安裝(系統不需要安裝 NodeJS 就能運行可執行檔)。你的原始程式碼不會被包含。
生成的可執行檔僅限 Windows(.exe)。現在支持所有平台。目前商業產品需要授權。完全開源。 - Electron.atom.io 雖然它不會為你壓縮並生成可執行檔,但它可以用來分發 NodeJS 應用程式,因為他們提供了一種分發應用程式的方法。好處是 Electron 是多平台的(Windows、macOS、Linux),缺點是你的原始碼仍然會被包含,儘管他們提供了一種將你的應用程式分發在 asar 檔案中的方法。它不會是萬無一失的,但仍然比直接暴露原始碼要好。
答案#4
我所知道的最好工具是 NodeJS 工具:vercel/pkg
使用起來非常簡單(比 Nexe 容易得多,只是舉個例子),你可以直接全局安裝:npm install -g pkg
為 macOS、Linux 和 Windows 創建可執行檔:
pkg exampleApp.js我有一段比較複雜的程式碼,它使用了 NodeJS 的 socket 伺服器,我嘗試了不同的應用程式,但沒有一個能正確地建立它,除了 zeit/pkg。
答案#5
預設情況下,Windows 將 .js 文件與 Windows Script Host(微軟的獨立 JS 執行引擎)關聯。如果你在命令提示字元中輸入 script.js(或在檔案總管中雙擊 .js 文件),腳本將由 wscript.exe 執行。
這可能是用全局設置來解決本地問題,但你可以將 .js 文件與 node.exe 關聯,這樣在命令提示符下輸入 script.js 或雙擊/拖動項目到腳本上都會用 Node 啟動它們。
當然,如果——像我一樣——你已經將 .js 檔案與某個編輯器關聯,以致於雙擊它們會打開你最喜歡的文字編輯器,這個建議就沒有太大作用。你也可以為 .js 檔案新增一個右鍵選單項目「用 Node 執行」,雖然這個替代方案無法解決你對命令列的需求。
最簡單的解決方案可能只是使用批次檔——你不必在腳本所在的資料夾中放一份 Node。只需絕對參考 Node 可執行檔即可:
"C:\Program Files (x86)\nodejs\node.exe" app.js %*
另一個替代方案是這個非常簡單的 C# 應用程式,它將使用自身的檔名加上 .js 作為要執行的腳本來啟動 Node,並傳遞任何命令列參數。
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);
}
}
所以如果你將生成的 EXE 命名為 "app.exe",你可以輸入 app arg1 ...,Node 將以命令列 "app.js" arg1 ... 啟動。請注意,C# 啟動程式應用程式會立即退出,將控制台窗口交給 Node 管理。
由於這可能具有相對廣泛的興趣,我已經在 GitHub 上提供了這個,包括編譯好的 exe,如果你喜歡和陌生人一起進入廂型車的話。
答案#6
還沒試過,但看起來 nexe 可以做到這個:
https://github.com/crcn/nexe
答案#7
既然這個問題已經被回答,另一個解決方案已經被推出。
https://github.com/appjs/appjs
在撰寫本文時,這是將 node.js 應用程序通過編譯成可執行文件的精簡版 Chromium 套件打包的最終解決方案。
編輯:AppJS 不再活躍,但它自己建議了一個名為 deskshell 的分支。
https://github.com/sihorton/appjs-deskshell/
答案#8
這裡有很多不錯的答案,但它們並不都是像 JXcore 那樣直接明瞭。
一旦你在 Windows 上安裝了 JXcore,你所要做的就是運行:
jx package app.js "myAppName" -native
這將產生一個 .exe 檔案,你可以分發,並且可以在沒有任何外部依賴的情況下執行(系統上甚至不需要 JXcore 或 Node.js)。
這是有關該功能的文件:http://jxcore.com/packaging-code-protection/#cat-74
編輯 2018
那個專案現在已經停止了,但仍然託管在這裡:https://github.com/jxcore/jxcore-release(感謝 @Elmue)
答案#9
我正在使用以下技術:
- @vercel/ncc(這確保我們將所有必要的依賴打包到單一文件中)
- pkg(用來製作 exe 檔案)
讓我們做以下:
npm i -g @vercel/ncc
ncc build app.ts -o dist(我的入口文件是 app.ts,輸出在 dist 資料夾,確保你在 package.json 和 app.ts 所在的資料夾 執行,執行上述命令後,你可能會在 dist 資料夾中看到 index.js 文件)
npm install -g pkg(安裝 pkg)
pkg index.js(確保你在上層的 dist 資料夾中)
