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


123

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

node.exe app.js inputArg

有什么办法可以将其本身打包为.exe?所以我可以做这样的事情吗?

App.exe inputArg

我可以通过使用批处理文件来伪造此方法,因此可以执行以下操作:

App.bat inputArg

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




一个很好的工具列表在这里:stackoverflow.com/a/12486874/32679
GrGr 2013年

1
我认为在这里添加答案的任何人都确实需要考虑是否已经完成。这个问题正在变成一堆链接,这些链接指向质量/活动变化的各种开源产品。
利亚姆'18

Answers:


35

有一些选择,包括免费和商业。我没有使用过它们,但理论上它们应该可以工作:

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

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

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


这些看起来不错,看起来他们可以完成我希望他们做的事情。我会试一试,然后再回覆您。
艾什瓦尔(Aishwar)2011年

2
我尝试了“高级”批处理EXE转换器,它的工作原理很吸引人。您可以将依赖项打包到EXE文件中。谢谢您的帮助。
艾什瓦尔(Aishwar)2011年

1
@Aishwar,但您无法捆绑node_modules文件夹,因此您无法在其中进行任何高级操作……
Clint

如果您zip / rar node_modules,并在应用程序运行时解压缩到临时目录,该怎么办?但是,如果您有很多模块,可能会变慢。
Jarrod Mosen 2014年

55

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

这是打包nodejs应用程序并分发它们的一种绝妙方法,它甚至为您提供了将整个应用程序“捆绑”为单个可执行文件的选项。它支持Windows,Mac和Linux。

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

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

就像一个补充说明-我已经使用此工具交付了多个生产盒/安装cd应用程序,并且效果很好。同一应用程序可在Windows,Mac,Linux和Web上运行。

更新:项目名称已更改为“ nw.js”,并且位于以下位置:nw.js


1
刚刚尝试过,效果很好!它得到了英特尔公司员工的支持。
Timo Huovinen 2014年

到目前为止,这应该是正确且最新的答案。另请参见此处的节点Webkit 备忘单gist.github.com/LeCoupa/80eca2716a2b13c37cce 包括其他非常有用的内容,例如如何编译JS(或至少压缩为字节码,具体取决于您想要使用的字样是多么老式。 “编译”)。
Erik Reppen 2015年

我喜欢这个答案,但是仍然不能创建独立的exe。根据Github上的Intelnw.js的说法,您仍然需要在同一文件夹中至少有两个其他文件:nw.pak和icudt.dll。如何创建独立的exe?
杰夫·贝克

@JeffBaker,如果您稍微看一下github上的文档,您会看到以下内容:github.com/nwjs/nw.js/wiki/…如果您不想包含其他文件,则可以执行此操作。
Clayton Gulick

chrome.com也将@wlayjs和Nw.js捆绑在一起。developer.chrome.com/apps/migration#native
Pacerier,

29

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

  1. Pkg会将您的项目编译为本机代码,它们还包括资产和一个nodejs安装(系统无需安装nodejs即可执行.exe)。您的源代码将不包括在内。生成的可执行文件仅Windows(.exe)。现在支持所有平台。现在,它需要商业产品的许可证。完全开源。
  2. Electron.atom.io虽然不会压缩并为您生成.exe,但是它可以用于分发nodejs应用程序,因为它们提供了一种分发应用程序的方式。好处是电子是多平台的(Windows,mac osx,linux),缺点是您的源代码将被包括在内,即使它们很难提供一种在asar存档中分发您的应用程序的方式。它不会防弹,但仍然比您的原始资料更好。

2
请更新:EncloseJS现在支持Linux和OSX。
00000000000000000000016年

编辑评论!@ 000000000000000000000
索奇

EncloseJS是必经之路。我现在要尝试一下!感谢您添加答案!+1 :)
tftd

我无法安装EncloseJS。它显示错误代码为ELIFECYCLE,没有任何有用的错误消息。
Elmue '18年

2
EncloseJS不再维护。继承人似乎是zeit / pkg(npmjs.com/package/pkg
Lucas Gonze

21

默认情况下,Windows将.js文件与Microsoft的独立JS运行时引擎Windows Script Host关联。如果在命令提示符下键入script.js(或.js在Explorer中双击一个文件),则脚本由执行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文件(如果您喜欢与陌生人接触)。


如您所述,这不能以理想的方式解决我的问题。但是+1是有趣的读物
Aishwar,

@Aishwar,我添加了一个简单的应用程序,它将为您启动Node。查看修改。
josh3736 2011年

@ josh3736您的exe仍然要求您在同一文件夹中有node.exe吗?
里卡多·托马西

@RicardoTomasi,不。假定Node已安装在系统的Program Files目录中(安装程序将其放置在该目录中)。
josh3736 2011年

@ josh3736这是一个有趣的解决方案。我喜欢您所做的事情,但愿我可以再次+1 :)。但这仍然不是理想的,因为它要求用户在标准路径中安装node.js。
艾什瓦(Aishwar)2011年

20

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

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

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

pkg exampleApp.js

我有一些使用NodeJS套接字服务器的复杂代码,我尝试了其他应用程序,除了zeit / pkg之外,其他应用程序均未正确创建。


我试图将Appium安装压缩到一个Exe文件中,而zeit / pkg完全失败。从磁盘上的310MB产生了一个18MB的小型Exe文件,显然该文件根本不起作用。
Elmue '18年


12

既然已经回答了这个问题,便推出了另一种解决方案。

https://github.com/appjs/appjs

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

编辑:AppJS不再处于活动状态,但其本身建议使用一个称为Deskshell的叉子。

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


1
似乎是一个断开的链接。
starbeamrainbowlabs 2013年

1
该项目不再有效。有关Clayton Gulick提到的替代方法,请参见node-webkit。
Kukks 2014年

Appjs本身建议使用一个名为deskshell的活动叉子github.com/sihorton/appjs-deskshell
2014年

11

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


1
谢了哥们。我可以从Windows制作linux可执行文件吗?
Sasivarnan

1
据我所知,不,你不能。我认为JXCore从OS抓取一些文件来制作可执行文件,并且它不打包那些文件,因此,如果要制作Linux可执行文件,则必须在Linux上运行此命令。
Nepoxx


1
这里的所有链接均已消失。这有效:github.com/jxcore/jxcore-release
Elmue '18

7

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

disclose 本质上是从您的Node.js项目和Node.js解释器中提取出具有以下特征的自解压exe,

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

尝试node-compilerhttps : //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动态地攻击了fs。* API,以便访问打包文件,而Node.js编译器则将它们保留下来,而是通过libsquash在更深层次上工作。Pkg使用JSON存储打包文件,而Node.js Compiler使用更为复杂和广泛使用的SquashFS作为其数据结构。

  • EncloseJS(http://enclosejs.com/):EncloseJS将对打包文件的访问限制为仅五个fs。* API,而Node.js Compiler支持所有fs。* API。EncloseJS是专有许可的,使用时收费,而Node.js Compiler是MIT许可的,用户既可以自由使用它,也可以自由修改它。

  • Nexe(https://github.com/nexe/nexe):Nexe由于使用browserify而不支持动态require,而Node.js Compiler支持包括require.resolve在内的各种需求。

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

  • AppImage(http://appimage.org/):AppImage仅支持具有支持SquashFS内核的Linux,而Node.js编译器支持Linux,macOS和Windows的所有三个平台,同时对该内核没有任何特殊功能的要求。


@StéphaneLaurent签出node-compiler,它绝对支持在exe中使用命令行参数。
潘敏琦

最新提交时间为2017年8月30日(2年之前)。停产了吗?!
Thach Lockevn

4

我建议您使用BoxedApp。这是一种效果很好的商业产品。它适用于任何NodeJS应用程序。最终用户将仅为您的应用获取一个EXE文件。无需安装。

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

BoxedApp它将打包您的NodeJS应用所需的所有文件和依赖项。它支持压缩,并且编译后的文件可在Windows XP +上运行

使用它时,请确保将Node.EXE添加到已编译的应用程序中。选择支持Windows XP的节点版本(如果需要)

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

c:\myApp argument1

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

process.argv[1]

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

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

更多信息:

请注意:通常我建议您使用开源/免费软件,但是在这种情况下,我没有发现任何可以完成工作的东西。


1
它还支持良好的代码保护,因为数据保存在RAM中,而不保存在硬盘中
z0r1fan


3

我一直在探索这个主题几天,这就是我所发现的。选项分为两类:

如果要构建桌面应用程序,最好的选择是:

1- NW.js:使您可以直接从DOM调用所有Node.js模块,并提供一种使用所有Web技术编写应用程序的新方式。

2- Electron:使用JavaScript,HTML和CSS构建跨平台的桌面应用程序

这是它们之间的一个很好的比较:NW.js和Electron Compare。我认为NW.js更好,它还提供了一个用于编译JS文件的应用程序。还有一些独立的可执行文件和安装程序构建器,例如Enigma Virtual Box。它们都包含Chrome的嵌入式版本,这对于服务器应用程序是不必要的。

如果要打包服务器应用程序,则以下是最佳选择:

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

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

在此类别中,我认为节点编译器更好,它支持动态需求和本机节点模块。它非常易于使用,输出从25MB开始。您可以在Node Compiler页面中阅读与其他解决方案的完整比较。我对Nexe的了解不多,但目前看来,Node Compiler并未使用V8快照功能将js文件编译为二进制格式,但已计划在版本2中使用。它还将具有内置的安装程序生成器。


2
Electron没有理由为OP的问题提供有效的建议;它是一个完全不同的Node框架。
progyammer

很棒的比较!
Vlad19年


1

厌倦了从命令提示符处开始赢得胜利,然后我也遇到了这个问题。版本略有改善。关于josh3736。这使用XML文件来获取一些设置。例如Node.exe,默认app.js中的路径以及要启动的文件。也是您在app.js(或server.js或您所谓的名称)中指定的要加载(生产,开发等)的环境。本质上,它NODE_ENV={0}在app.js中添加{0}是您的配置名称,作为您的变量。您可以通过修改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);
        }


0

有一个名为nodebob的开源构建工具项目。我认为工作平台窗口是

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.