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

IT技术 javascript windows node.js exe
2021-01-23 23:32:19

我有一个我编写的节点应用程序,我按如下方式运行:

node.exe app.js inputArg

有什么方法可以将它自己打包成 .exe 吗?所以我可以做这样的事情吗?

App.exe inputArg

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

App.bat inputArg

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

6个回答

我使用的解决方案是 Roger Wang 的node-webkit

这是打包和分发 nodejs 应用程序的绝佳方式,它甚至让您可以选择将整个应用程序“捆绑”为单个可执行文件。它支持windows、mac和linux。

以下是有关部署 node-webkit 应用程序的各种选项的一些文档,但简而言之,您可以执行以下操作:

  1. 压缩所有文件,在根目录中包含 package.json
  2. 将扩展名从 .zip 更改为 .nw
  3. 复制 /b nw.exe+app.nw app.exe

就像附加说明一样 - 我已经使用它运送了几个生产盒/安装 cd 应用程序,并且它运行良好。同一个应用程序可以在 windows、mac、linux 和网络上运行。

更新:项目名称已更改为“nw.js”并正确位于此处:nw.js

@JeffBaker 如果你稍微往下看一下 github 上的文档,你可以看到这个:github.com/nwjs/nw.js/wiki/...如果你不想包含额外的文件,你可以这样做。
2021-03-21 23:32:19
我喜欢这个答案,但是这仍然不会创建独立的 exe。根据IntelGithub 上的 nw.js 的说法,您仍然需要在同一文件夹中至少有两个其他文件:nw.pak 和 icudt.dll。你如何创建一个独立的exe?
2021-03-25 23:32:19
不确定这在 2019 年是否仍然是一个好方法。听起来它会捆绑在大型 WebKit 库中,这对于 HTML GUI 应用程序很好,但对于控制台应用程序则不必要。
2021-03-27 23:32:19
截至今天,这应该是正确和最新的答案。另请参阅此处的节点 webkit备忘单gist.github.com/LeCoupa/80eca2716a2b13c37cce 包括其他非常有用的内容,例如如何编译 JS(或至少压缩为字节码,具体取决于您想成为这个词的老式程度) “编译”)。
2021-03-28 23:32:19
刚刚试了一下,效果很好!它得到了英特尔员工的支持。
2021-04-04 23:32:19

有一些替代方案,包括免费的和商业的。我没有使用过它们中的任何一个,但理论上它们应该可以工作:

大多数将要求您将批处理文件保留为主可执行文件,然后捆绑 node.exe 和您的脚本。

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

第三个准解决方案是将节点保留在某个地方C:\utils并将此文件夹添加到您的PATH环境变量中。然后你可以在那个运行节点的目录中创建 .bat 文件+你喜欢的脚本 - 我让咖啡脚本coffee在 Windows 上以这种方式工作。可以使用批处理文件、vb 脚本或安装程序自动执行此设置。

我尝试了“高级”批处理转 EXE 转换器,它的效果非常棒。您可以将依赖项打包到 EXE 文件中。谢谢您的帮助。
2021-03-12 23:32:19
@Aishwar,但是您不能捆绑 node_modules 文件夹,因此您无法在其中执行任何高级操作...
2021-03-25 23:32:19
如果您压缩/rar node_modules,并在应用程序运行时解压缩到临时目录怎么办?不过,如果你有很多module,可能会有点慢。
2021-03-31 23:32:19
这些看起来不错,看起来他们可以做我想让他们做的事情。我会试一试,然后给你回复。
2021-04-07 23:32:19

对于任何遇到这个问题的人,现在有两个项目可以从您的节点项目中创建 exe,PkgElectron.atom.io,它们略有不同:

  1. Pkg会将您的项目编译为本机代码,它们还包括资产和 NodeJS 安装(系统不需要安装 NodeJS 来运行可执行文件)。您的源代码将不包括在内。生成的可执行文件仅适用于 Windows ( .exe )。现在支持所有平台。它现在需要商业产品的许可证。完全开源。
  2. Electron.atom.io虽然它不会压缩并为您生成可执行文件,但它可以用于分发 NodeJS 应用程序,因为它们提供了一种分发应用程序的方法好处是电子是多平台的(Windows、macOS、Linux),缺点是您的源代码将被包含在内,即使它们提供了一种在asar存档中分发您的应用程序的方法它不会是防弹的,但它仍然比你的源代码更好。
编辑评论!@000000000000000000000
2021-03-19 23:32:19
EncloseJS 是要走的路。我现在就去试试!感谢您添加您的答案!+1 :)
2021-03-28 23:32:19
我无法安装 EncloseJS。它说 Err code ELIFECYCLE 没有任何有用的错误消息。
2021-04-05 23:32:19
请更新:EncloseJS 现在支持 Linux 和 OS X。
2021-04-07 23:32:19
不再维护 EncloseJS。继承人似乎是 zeit/pkg ( npmjs.com/package/pkg )
2021-04-08 23:32:19

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

它非常易于使用(比 Nexe 多得多,仅作为示例),您只需全局安装即可: npm install -g pkg

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

pkg exampleApp.js

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

我试图将 Appium 安装压缩到一个 Exe 文件中,但 zeit/pkg 完全失败。从磁盘上的 310MB 产生一个 18MB 的小 Exe 文件,这显然根本不起作用。
2021-03-12 23:32:19

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

这可能是通过全局设置解决本地问题,但您可以将文件与之关联 ,以便在命令提示符下键入script.js或双击/拖动项目到脚本上,将使用 Node 启动它们。.jsnode.exe

当然,如果——像我一样——你已经将.js文件与一个编辑器相关联,以便双击它们打开你最喜欢的文本编辑器,这个建议不会有多大用处。您还可以.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# 引导程序应用程序将立即退出,让 Node 负责控制台窗口。

由于这可能是相对广泛的兴趣,我继续在 GitHub 上提供了它,包括编译的 exe,如果你喜欢和陌生人一起上货车的话。

@Aishwar,我添加了一个简单的应用程序,可以为您启动 Node。查看编辑。
2021-03-11 23:32:19
@josh3736 这是一个有趣的解决方案。我喜欢你所做的,我希望我能再次 +1 :)。但这仍然不理想,因为它要求用户在标准路径中安装 node.js。
2021-03-13 23:32:19
@josh3736 你的 exe 是否仍然要求你在同一个文件夹中有 node.exe?
2021-03-20 23:32:19
正如您所提到的,这并不能以理想的方式解决我的问题。但是对于有趣的阅读+1
2021-03-21 23:32:19
@RicardoTomasi,不。它假设 Node 安装在您系统的 Program Files 目录中(安装程序放置它的位置)。
2021-03-24 23:32:19