網站搜尋

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 應用程式的各種選項的文件,但簡而言之,你需要做以下幾點:

  1. 將所有檔案壓縮,根目錄中有一個 package.json
  2. 將副檔名從 .zip 改為 .nw
  3. 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,它們之間略有不同:

  1. Pkg 會將你的專案編譯成原生程式碼,它們還包含資源檔案以及 NodeJS 安裝(系統不需要安裝 NodeJS 就能運行可執行檔)。你的原始程式碼不會被包含。生成的可執行檔僅限 Windows(.exe)。現在支持所有平台。目前商業產品需要授權。完全開源。
  2. 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

我正在使用以下技術:

  1. @vercel/ncc(這確保我們將所有必要的依賴打包到單一文件中)
  2. pkg(用來製作 exe 檔案)

讓我們做以下:

  1. npm i -g @vercel/ncc

  2. ncc build app.ts -o dist(我的入口文件是 app.ts,輸出在 dist 資料夾,確保你在 package.json 和 app.ts 所在的資料夾 執行,執行上述命令後,你可能會在 dist 資料夾中看到 index.js 文件)

  3. npm install -g pkg(安裝 pkg)

  4. pkg index.js(確保你在上層的 dist 資料夾中)