如何将Node.js应用程序部署为单个可执行文件?

146
假设我已经编写了一个 Node.js 应用程序,现在我想要分发它。当然,我希望让用户使用起来更方便,因此我不希望他安装 Node.js,运行 `npm install`,然后手动键入 `node app.js`。
我更希望的是单个可执行文件,例如在 Windows 上的 `.exe` 文件。
我该如何解决这个问题?
我知道有这个线程,但这只针对 Windows。我怎样才能以跨平台的方式实现这一点?有什么好的做法吗?...?
最完美的解决方案是一个“编译器”,我可以把源文件夹给它。源文件夹包括应用程序本身在各种 `.js` 文件中、 `node_modules` 文件夹和一些元数据,例如 `package.json`。输出应该是各种平台的二进制文件,例如 Windows、OS X 和 Linux。
哦,还有很重要的一点:我不想对源代码进行任何更改,因此调用相对路径的 `require` 仍然应该有效,即使这个相对路径现在在打包的应用程序内部。
有什么好的想法吗?
PS:我不希望用户独立安装 Node.js,它也应该被包含在可执行文件内部。

1
这是一个Web应用程序吗?(意思是它有基于Web的用户界面),还是一个简单的命令行应用程序,执行其他操作?如果需要生成某种类型的浏览器,则我认为这会变得更加困难。 - Alex Wayne
7
有多少个Node.js社区成员使用这种方式部署到Unix操作系统:零。你确定传统的方法,如tar存档、deb或rpm对你来说不可接受吗?你是在创造一个没有真正存在的问题吗? - Peter Lyons
1
@ Alex Wayne:这是一个服务器端应用程序,因此无需启动浏览器。 - Golo Roden
2
此外,我的问题包括是否有一个工具可以用于创建任何平台的解决方案,因此即使是自动为Windows创建.exe文件和.deb文件的工具也很棒;-) - Golo Roden
@PeterLyons 我觉得很难相信。我也可以证明它。 - oxygen
7个回答

69

同时,我已经找到了(对我来说)完美的解决方案:nexe。它可以从一个包括所有模块的Node.js应用程序创建单个可执行文件。

这是最接近理想解决方案的下一个最佳选择。


13
根据文档,nexe 支持 Windows 系统了 :) - Lea Rosema
1
我打包了我的NodeJS应用程序,但是出现了以下错误: Error: ENOENT, no such file or directory '..../release/types/mime.types' 我查看了发布文件夹,types/mime.types文件夹从未被创建。有人有什么想法吗? - Gang Su
1
作为nexe的现任维护者,本地模块已经在进行中了,可以放心,很快就会实现! - Jared Allard
1
太好了,感谢您的更新 :-) - Golo Roden
7
缺乏对原生模块的支持是一个相当大的障碍。此外,最新版本的nexe很难处理动态路径,而这在大多数流行的npm包中非常常见。 - ruffrey
显示剩余3条评论

32

首先,我们要讨论如何为工作坊、演示等打包一个Node.js应用程序,在这种情况下,拥有一个“只需运行”而无需终端用户关心安装和依赖项的应用程序非常方便。

您可以尝试以下设置:

  1. 获取您的应用程序源代码
  2. 通过package.json使用npm install将所有依赖项安装到本地node_modules目录。在涉及二进制依赖项的情况下,重要的是在每个要支持的平台上分别执行此步骤。
  3. 将Node.js二进制文件 - Windows上的node.exe,OS X/Linux上(可能)的/usr/local/bin/node - 复制到您项目的根文件夹中。在OS X/Linux上,您可以使用which node查找Node.js二进制文件的位置。
对于Windows:
创建一个自解压归档文件,7zip_extra 支持在解压后立即执行命令的方式,请参见:http://www.msfn.org/board/topic/39048-how-to-make-a-7-zip-switchless-installer/对于OS X/Linux:
您可以使用像 makeselfunzipsfx 这样的工具(我不知道是否默认情况下已经编译了 CHEAP_SFX_AUTORUN 定义)。
这些工具将把归档文件提取到临时目录中,执行给定的命令(例如 node app.js),并在完成后删除所有文件。

2
这种打包方式是否符合Node.js许可证的法律要求? - Pacerier

15

不是重复了多次,但是你所描述的解决方案听起来很像Node-Webkit

从Git页面上可以看到:

node-webkit是一个基于Chromium和node.js的应用程序运行时。您可以使用node-webkit在HTML和JavaScript中编写本机应用程序。它还可以让您直接从DOM调用Node.js模块,并通过所有Web技术实现编写本机应用程序的新方法。

这些说明具体描述了创建单文件应用程序供用户执行的步骤,此部分描述了外部依赖项。

我不确定它是否完全符合要求,但看起来非常接近。

希望有所帮助!


2
Node-Webkit 真的棒极了,特别是用于演示 Node.js 解决方案,你在一个地方就可以得到所需的一切。 - Ewald
2
Electron框架也很不错。但nwjs和Electron都专注于UI为中心的应用程序。打包服务器应用程序可能是可行的,但这不是一个典型的用例。在我的经验中,隐藏UI并从CLI运行需要额外的工作。 - ruffrey
根据Node.js许可证,Nodewebkit打包是否合法? - Pacerier
1
@Pacerier 我相信是这样的,但我不是法律专家。话虽如此,Electron已经真正超越了它,我相信GitHub的律师们一定确保了它的合规性。 - Jason Nichols

8

1
jxcore不再被积极开发:http://www.nubisa.com/nubisa-halting-active-development-on-jxcore-platform/ - superEb
或者,您可以使用EncloseJS:http://enclosejs.com/ - 000000000000000000000
@000000000000000000000 EncloseJS已经被弃用。Igor建议用户改用zeit/pkg代替:https://github.com/zeit/pkg - DARKGuy
我尝试使用zeit/pkg将Appium安装压缩成一个Exe文件,但它完全失败了。310MB的磁盘空间被压缩到18MB的Exe文件中,显然无法正常工作。 - Elmue

7
除了nexe之外,可以使用browserify将所有依赖项捆绑成一个单独的.js文件。这不会捆绑实际的node可执行文件,只处理javascript部分。它也无法处理本地模块。纯node编译的命令行选项是browserify --output bundle.js --bare --dg false input.js

我这样使用它: browserify --bare input.js > output.js - Elmer

7

创建安装程序需要执行多个步骤,具体步骤因操作系统而异。例如:

  • 在Mac OS X上,您需要创建一个.pkg,可以在这里找到如何操作的说明。
  • 在Ubuntu Linux上,您需要创建一个.deb,可以在这里找到如何操作的说明。
  • 在Microsoft Windows上,您需要创建一个.exe.msi,可以使用innosetup安装程序,在这里找到如何操作的说明。

这里的链接有些微妙地损坏了。如果删除“blog.”前缀,它们就可以正常工作。例如:http://coolaj86.com/articles/how-to-create-an-innosetup-installer.html - Wyck
@Wyck 注意并修复。 - coolaj86

-1

你可以创建一个 git 仓库,并将 node git 仓库设置为依赖项的链接。然后任何克隆该仓库的用户也可以安装 node。

#git submodule [--quiet] add [-b branch] [-f|--force]
git submodule add /var/Node-repo.git common

你可以轻松地将一个脚本打包起来,自动克隆你托管在某个地方的 git 仓库,并从那个脚本文件中“安装”。
#!/bin/sh
#clone git repo
git clone your-repo.git

2
但这只会给您源代码库,而不是二进制文件。用户仍然需要编译Node.js,前提是所有必要的依赖项已经存在(这在Windows / OS X“开箱即用”的安装中并不是这种情况)。 - Frederic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接