我有一个Node.js应用程序,它需要通过以下命令运行:
node.exe app.js inputArg
是否有办法将其打包成独立的 .exe 文件呢?这样我就可以像这样运行:
App.exe inputArg
我也可以通过使用批处理文件来模拟这个过程,例如:
App.bat inputArg
但这需要在同一文件夹中安装所有依赖项和 Node.js,这并不理想。
我有一个Node.js应用程序,它需要通过以下命令运行:
node.exe app.js inputArg
是否有办法将其打包成独立的 .exe 文件呢?这样我就可以像这样运行:
App.exe inputArg
我也可以通过使用批处理文件来模拟这个过程,例如:
App.bat inputArg
但这需要在同一文件夹中安装所有依赖项和 Node.js,这并不理想。
有几种免费和商业化的替代品可供选择,我没有使用过其中任何一个,但理论上它们应该可以工作:
大多数工具都需要您将批处理文件保留为主要可执行文件,然后捆绑node.exe和您的脚本。
取决于您的脚本,您还可以选择将它移植到JSDB,它支持一种通过简单附加资源创建可执行文件的简便方法。
第三种准解决方案是将node保留在类似C:\ utils
的位置,并将此文件夹添加到PATH
环境变量中。然后,您可以在该目录中创建运行node和首选脚本的.bat文件 - 我以这种方式在Windows上运行coffeescript的coffee
。此设置可以使用批处理文件、vb脚本或安装程序自动化。
对于那些偶然发现这个问题的人,现在有两个项目可以将你的Node项目生成exe文件, Pkg 和 Electron.atom.io,它们略有不同:
1. Pkg会将您的项目编译为本机代码,同时包含资源和NodeJS安装(系统不需要安装NodeJS来运行可执行文件)。您的源代码将不会被包括在内。我知道的最好工具是 NodeJS 工具: vercel/pkg
它非常容易使用(比如 Nexe 简单得多),你只需全局安装:
npm install -g pkg
来创建适用于 macOS、Linux 和 Windows 的可执行文件:
pkg exampleApp.js
我有一些复杂的代码,使用了 NodeJS socket 服务器,我尝试了不同的应用程序,除了 zeit/pkg 都无法正确创建它。
默认情况下,Windows将.js
文件与Windows Script Host相关联,这是微软独立的JS运行时引擎。如果您在命令提示符处键入script.js(或在资源管理器中双击一个.js
文件),则会由wscript.exe
执行脚本。
这可能是使用全局设置解决本地问题, 但您也可以将.js
文件与node.exe
关联,这样在命令提示符处键入script.js或双击/拖动项目到脚本上都将使用Node启动它们。
当然,如果(像我一样)您将.js
文件与编辑器相关联,以便双击打开您喜欢的文本编辑器,则此建议不会有太大作用。您还可以添加右键菜单项“使用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);
}
}
app arg1 ...
,Node将使用命令行"app.js" arg1 ...
启动。请注意,C#引导程序应用程序将立即退出,使Node负责控制台窗口。自从这个问题被解决后,又推出了另一个解决方案。
https://github.com/appjs/appjs
在撰写本文时,这是将node.js应用程序打包为可执行文件的终极解决方案,它通过编译成可执行文件的精简版chromium包来实现。
编辑: AppJS已不再更新,但它本身建议使用名为deskshell的分支。
这里有很多好的答案,但并不都像 JXcore 这样简单明了。
在 Windows 上安装 JXcore 后,您只需要运行以下命令:
jx package app.js "myAppName" -native
我使用了以下技术:
让我们执行以下步骤:
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文件夹中运行命令)
disclose
: https://github.com/pmq20/disclose
disclose
实际上是将您的Node.js项目和Node.js解释器制作成一个自解压exe文件,具有以下特点:
node-compiler
: https://github.com/pmq20/node-compiler
我创建了一个名为node-compiler
的新项目,将您的Node.js项目编译为一个单独的可执行文件。disclose
更好,因为它不会在第一次运行时运行缓慢,因为您的源代码与Node.js解释器一起编译,就像标准的Node.js库一样。pkg (https://github.com/zeit/pkg):Pkg通过动态地黑掉fs.* API来访问包内文件,而Node.js编译器则不会这样做,它通过libsquash在更深层次上工作。Pkg使用JSON存储包内文件,而Node.js编译器则使用更复杂和广泛使用的SquashFS作为数据结构。
EncloseJS (http://enclosejs.com/):EncloseJS仅支持五个fs.* API来访问包内文件,而Node.js编译器支持所有fs.* API。EncloseJS是专有许可证并且需要付费使用,而Node.js编译器是MIT许可证,用户可以自由使用和修改。
Nexe (https://github.com/nexe/nexe):Nexe由于使用browserify,不支持动态require,而Node.js编译器支持各种类型的require,包括require.resolve。
asar (https://github.com/electron/asar):Asar使用JSON存储文件信息,而Node.js编译器使用SquashFS。Asar将代码归档和可执行文件分开,而Node.js编译器将所有JavaScript源代码与Node.js虚拟机链接在一起,并生成单个可执行文件作为最终产品。
AppImage (http://appimage.org/):AppImage仅支持具有支持SquashFS的内核的Linux,而Node.js编译器支持Linux、macOS和Windows三个平台,同时不需要内核的任何特殊功能要求。