如何从 node.js 应用程序制作 exe 文件?

我写了一个节点应用程序,运行方式如下:

node.exe app.js inputArg

有没有什么方法可以把这个打包成。自己玩吗?所以我可以这么做吗?

App.exe inputArg

我有一些方法可以通过使用批处理文件来伪造它,所以我可以这样做:

App.bat inputArg

但是这要求我在该文件夹中具有所有的依赖项和节点,这是不理想的。

233872 次浏览

默认情况下,Windows 将 .js文件与微软的独立 JS 运行时引擎 Windows Script Host相关联。如果在命令提示符下键入 Script.js(或在资源管理器中双击 .js文件) ,则脚本由 wscript.exe执行。

这可能是 在全球范围内解决局部问题,但是您可以用 node.exe代替 合伙人 .js文件,这样在命令提示符下键入 Script.js或双击/拖动项到脚本上将用 Node 启动它们。

当然,如果你像我一样把 .js文件和编辑器关联起来,双击它们可以打开你最喜欢的文本编辑器,那么这个建议就没什么用了。您也可以将 添加右击菜单项的“ Execute with Node”转换为 .js文件,尽管这种替代方法不能解决您的命令行需求。


最简单的解决方案可能是只使用一个批处理文件,您不必在脚本所在的文件夹中保存 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 # bootstrapper 应用程序将立即退出,让 Node 负责控制台窗口。

由于这可能是相对广泛的兴趣,我继续前进,并作出了这个 可以在 GitHub 上找到,包括 已编译的 exe,如果进入面包车与陌生人是你的事情。

这里有一些替代品,既有免费的也有商业的。我没有使用其中任何一种,但理论上它们应该是有效的:

大多数情况下,需要将批处理文件保留为主可执行文件,然后绑定 node.exe 和脚本。

根据脚本的不同,您还可以选择将其移植到 JSDB,该选项通过简单地将资源附加到 创建可执行文件的简单方法来支持 创建可执行文件的简单方法

第三种类似的解决方案是将节点保存在类似于 C:\utils的地方,并将该文件夹添加到您的 PATH环境变量。然后你就可以创造。在那个目录下运行 node + 你喜欢的脚本的 bat 文件-我得到了咖啡脚本的 coffee工作在窗口这种方式。此设置可以通过批处理文件、 vb 脚本或安装程序自动完成。

厌倦了从命令提示符开始,然后我跑过这个也。稍微有点进步。什么 Josh3736。这将使用一个 XML 文件来获取一些设置。例如,到 Node.exe的路径以及在默认 app.js 中启动的文件。还有您在 app.js (或 server.js 或其他名称)中指定的加载环境(生产环境、开发环境等)。本质上,它添加了 NODE_ENV={0},其中{0}是 app.js 中配置的名称,作为您的 var。可以通过修改 config.xml 中的“ mode”元素来实现这一点。您可以在这里获取该项目 = = > Github。注意,在 Post Build 事件中,您可以修改复制路径,使其自动复制到 config.xml 上,并将可执行文件复制到 Nodejs目录,这只是为了保存一个步骤。否则将这些内容编辑掉,否则构建将抛出警告。

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);
}

既然这个问题已经得到了回答,另一个解决方案已经启动。

Https://github.com/appjs/appjs

在撰写本文时,这是通过编译成可执行文件的精简的 Chromium 包来打包 node.js 应用程序的最终解决方案。

编辑: AppJS 不再处于活动状态,但是它本身建议使用一个名为桌面 shell 的 fork。

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

我确实发现这些解决方案中的任何一个都符合我的要求,所以我自己制作了一个名为 node2exe 的节点版本来实现这一点。https://github.com/areve/node2exe有售

还没试过,不过 Nexe 看起来可以这么做:

Https://github.com/crcn/nexe

这里有很多好的答案,但它们并不都像 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)

对于任何偶然发现这个问题的人来说,现在有两个项目在节点项目之外创建前任,PkgElectron.atom.io,它们稍有不同:

  1. Pkg 将把您的项目编译成本机代码,它们还包括资产和 NodeJS 安装(系统不需要安装 NodeJS 来运行可执行文件)。您的源代码将不包括在内。现在支持所有平台。 现在它需要商业产品的许可证。完全开源。
  2. Electron.atom.io 虽然它不会压缩并为你生成一个可执行文件,但它可以用来分发 NodeJS 应用程序,因为它们提供了一种到 分发应用程序的方式。好处是电子是多平台的(Windows,macOS,Linux) ,缺点是你的源代码将被包括在内,即使他们提供了一种方式来分发你的应用程序内的 Asar归档。虽然不是刀枪不入,但总比你的消息来源要好。

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

disclose实际上使 Node.js 项目和 Node.js 解释器具有以下特征,

  1. 没有图形用户界面,纯 CLI。
  2. 没有运行时依赖项
  3. 同时支持 Windows 和 Unix
  4. 第一次缓慢运行(提取到缓存目录) ,然后永远快速运行

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

我制作了一个名为 node-compiler的新项目,将 Node.js 项目编译成一个单独的可执行文件。

它优于 disclose,因为它不会第一次运行得很慢,因为您的源代码是与 Node.js 解释器一起编译的,就像标准的 Node.js 库一样。

此外,它在运行时将文件和目录请求透明地重定向到内存,而不是重定向到文件系统。这样就不需要源代码来运行已编译的产品。

工作原理: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

与同类项目比较,

  • Pkg (https://github.com/zeit/pkg) : Pkg 被砍。* API 是动态的,以便访问包中的文件,而 Node.js Compiler 不使用它们,而是通过 libsquash 在更深层次上工作。Pkg 使用 JSON 存储包内文件,而 Node.js Compiler 使用更为复杂和广泛使用的 SquashFS 作为其数据结构。

  • EncloseJS (http://enclosejs.com/) : EncloseJS 将对包内文件的访问限制为只能访问5个 fs。* API 的,而 Node.js 编译器支持所有 fs。* 空气污染指数。EncloseJS 是专有许可证,使用时收费,而 Node.js Compiler 是 MIT 许可证,用户可以免费使用和修改它。

  • Nexe (https://github.com/nexe/nexe) : Nexe 不支持动态需求,因为它使用了 Browserify,而 Node.js Compiler 支持所有类型的需求,其中包括 requ.Resoly。

  • Asar (https://github.com/electron/asar) : Asar 使用 JSON 存储文件信息,而 Node.js Compiler 使用 SquashFS。Asar 将代码归档和可执行文件分开,而 Node.js Compiler 将所有 JavaScript 源代码与 Node.js 虚拟机链接在一起,并生成一个可执行文件作为最终产品。

  • AppImage (http://appimage.org/) : AppImage 只支持带有支持 SquashFS 的内核的 Linux,而 Node.js Compiler 支持 Linux、 macOS 和 Windows 的所有三种平台,同时不需要内核的任何特殊功能要求。

我推荐你使用 BoxedApp。这是一个商业产品,工作非常好。它适用于任何 NodeJS 应用程序。最终用户将只得到一个 EXE 文件为您的应用程序。不需要安装。

例如,在 Electron 中,最终用户需要安装/解压应用程序,他将看到代码的所有源文件。

BoxedAppIt 打包了 NodeJS 应用程序所需的所有文件和依赖项。 它支持压缩,并且编译后的文件可以在 WindowsXP + 上工作

当您使用它时,一定要将 Node.EXE 添加到已编译的应用程序中。选择支持 WindowsXP 的节点版本(如果需要)

该程序支持命令行参数,所以打包后,您可以

c:\myApp argument1

您可以在节点代码中获得参数:

process.argv[1]

有时您的应用程序有文件依赖项,所以在 BoxedApp 中,您可以添加任何文件夹和文件作为依赖项,例如,您可以插入设置文件。

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

更多信息:

注意: 通常我会推荐开源/自由软件,但在这种情况下,我没有找到任何可以完成工作的东西。

有一个名为 Nodebob的开源构建工具项目。 我假设工作平台窗口,

  1. 只需克隆或下载项目
  2. 将您的所有 node-webkit 项目文件复制到 app 文件夹中。
  3. 运行 build.bat 脚本。

您将在发布文件夹中找到可执行文件。

可能还有许多其他选择,但据我所知,有一个项目正在 GitHub https://github.com/zeit/pkg上积极开发。你可以玩它。 还有一个在 https://github.com/nexe/nexe,但不在积极开发中。

这几天我一直在探索这个话题,下面是我的发现。可供选择的方案分为两类:

如果你想构建一个桌面应用程序,最好的选择是:

1-NW.js: 允许您直接从 DOM 调用所有 Node.js 模块,并支持使用所有 Web 技术编写应用程序的新方法。

2-电子: 使用 JavaScript、 HTML 和 CSS 构建跨平台桌面应用程序

下面是他们之间的一个很好的比较: NW.js 与电子比较。我认为 NW.JS 更好,它还提供了一个编译 JS 文件的应用程序。还有一些独立的可执行文件和安装程序构建器,比如 英格玛虚拟盒子。它们都包含一个服务器应用程序不需要的内嵌版本的 Chrome。

如果你想打包一个服务器应用程序,这些是最好的选择:

Node-Editor : 专为 Node.js 设计的提前(AOT)编译器,可以正常工作。

Nexe : 从 node.js 应用程序中创建一个可执行文件

在这一类中,我认为支持动态需求和本地节点模块的节点编译器更好。它非常容易使用,输出开始时为25 MB。可以在节点编译器页中读取与其他解决方案的完整比较。我没有读过很多关于 Nexe 的文章,但是现在,Node Compiler 似乎没有使用 V8快照功能将 js 文件编译成二进制格式,但是它计划在版本2中使用。它还将拥有内置的安装程序构建器。

尝试使用 nexe,它会从您的 node.js 应用程序中创建一个单独的可执行文件

Https://github.com/nexe/nexe

我所知道的最好的工具是 NodeJS 工具: Zeit/pkg

它非常容易使用(比 Nexe 要容易得多,举个例子) ,你可以全局安装: npm install -g pkg

为 macOS、 Linux 和 Windows 创建可执行文件:

pkg exampleApp.js

我有一些使用 NodeJS 套接字服务器的复杂代码,我尝试了不同的应用程序,没有一个正确地创建它,除了 Zeit/pkg

我使用了以下技术:

  1. @ vercel/ncc (这确保我们将所有必要的依赖绑定到单个文件中)
  2. Pkg (用于创建 exe 文件)

让我们这样做:

  1. Npm i-g@vercel/ncc

  2. Ncc 编译应用程序 ts-o dist (我的条目文件是 app.ts,输出在 dist 文件夹中,请确保运行在 Package.json 和 app.ts 居住于 的文件夹中,在运行以上文件夹后,您可能会在文件夹 dist 中看到 index.js 文件)

  3. Npm install-g pkg (安装 pkg)

  4. Pkg 索引 (请确保您在上面的 dist 文件夹中)

注意: 您还需要 python 和 pip (可能 easy _ install 或 debian 上的 dpkg)才能实现此功能。

使用 Nodeenv创建一个节点虚拟环境(使用 python -m pip install nodeenv安装)(使用 python -m nodeenv envname创建)

创建一个. bat 文件,使用节点虚拟环境的 exe 文件(存储在 ./envname/Scripts/node.exe中)启动代码, 然后使用一些 bat 到 exe 转换器(http://www.battoexeconverter.com/) idk 然后分发除 bat 文件之外的所有文件,使用 exe 转换后的文件,而不是使用某个程序将它们安装到安装程序中。这就对了。

您可以使用 NVM 或官方节点安装程序代替 nodeenv。

目前,我认为方法是 Deno

这才是

deno compile mainProgram.js

现有的节点项目可能需要某种类型的转换,至少对于需求语句 (将节点项目转换为 deno)是如此

做到这一点的一种方法是将代码作为 NPM 模块发布,并使用 "bin": "app.js"1向 NPM 提供 package.json 中的 bin 文件

对于安装 CLI 的用户,他们必须安装节点并运行 npm i -g [packageName](- g 表示全局)

这个答案非常简单,但是有要求安装节点的缺点。

如果你希望你的应用程序实际上是一个没有节点或 NPM 帮助的可执行程序,我会推荐 下一个