有没有一种方法可以编译node.js的源文件?

86

有没有一种方法可以编译Node.js应用程序?


5
这似乎是重复的资源池的一部分:https://dev59.com/uW025IYBdhLWcg3wOzE9,https://dev59.com/d1vUa4cB1Zd3GeqPvqUK,https://dev59.com/Xmsz5IYBdhLWcg3wADMm,https://dev59.com/n2oy5IYBdhLWcg3wEJ9n,https://dev59.com/S2HVa4cB1Zd3GeqPoJWp,https://dev59.com/ZWYr5IYBdhLWcg3wytLe。 - Mogsdad
2
这里有一份不错的工具列表:https://dev59.com/dWw15IYBdhLWcg3wFH3f#12486874 - GrGr
Deno 已经内置了这个功能,所以从零开始启动一个项目时,使用 Deno 可能是一个不错的选择,而不是 node.js。 - Martin Braun
7个回答

75

可能我来得有些晚了,但您可以使用“nexe”模块将Node.js和您的脚本编译为一个可执行文件:https://github.com/crcn/nexe

编辑2021:Nexe的最新版本发布于2017年,开发似乎已经放缓,因此这些日子还应该考虑来自Vercel的更广泛使用的替代品:pkg


8
注:此仅适用于Linux/Mac,不适用于Windows。 - starbeamrainbowlabs
@Metal3d 这是一种非常新颖的做法,谢谢。 - That Realty Programmer Guy
1
@Metal3d,哇!我希望它支持Windows!!! - Edwin Yip
6
现在它已经支持Windows,但是它依赖于Python,而大多数Windows用户默认没有安装Python。 - Henrik Karlsson
6
只有用于编译Windows机器需要安装Python和Visual Studio。客户端机器(运行“已编译”Node.js脚本的机器)不需要这些依赖项。 - Haz
显示剩余5条评论

18

45
通过编译JavaScript源代码,你将得到一些形式的二进制或字节码(例如),这很好,如果你不想透露你的源代码。明白了吗? - Mahdi
3
把某物转化为二进制并不能防止人们对其进行反向工程,这并不困难。 - Sven Slootweg
3
当然,你可以雇佣一名开发人员来编写相同的代码,但最好是雇佣一名黑客将大量的CPU指令集反向工程成合理的JavaScript源代码。 - Mahdi
2
@Mahdi,防止他人未经许可使用您的代码的保护主要是法律性质的,而不是技术性质的。实践中通过编译混淆可能不会带来任何好处,反而几乎肯定会给“合法”用户带来不便。换句话说:不要这样做。 - Sven Slootweg
54
编译代码除了混淆还有更好的理由。如果你想分发你的程序,给别人一个二进制文件比告诉他们安装 node 更容易。 - stevendesu
显示剩余3条评论

15

EncloseJS.

您可以获得一个完全功能的二进制文件,而无需源代码。

本地模块也受到支持。(必须放置在相同的文件夹中)

JavaScript 代码在编译时使用 V8 内部编译器转换为本地代码。因此,在执行二进制文件时不需要源代码,并且它们不会被打包。

只有基于客户端机器的信息才能生成完美优化的本地代码。没有这些信息,EncloseJS 只能生成“未优化”的代码。它的运行速度约比 NodeJS 慢2倍。

此外,node.js 运行时代码与您的代码一起放在可执行文件中,以支持应用程序在运行时的 node API。

使用案例:

  • 制作应用程序的商业版本,无需提供源代码。
  • 制作应用程序的演示/评估/试用版本,无需提供源代码。
  • 制作一种自解压缩归档文件或安装程序。
  • 使用node-thrust制作闭源GUI应用程序。
  • 部署已编译应用程序时无需安装node和npm。
  • 无需通过npm install下载数百个文件来部署您的应用程序。将其部署为单独的独立文件。
  • 将资产放置在可执行文件中,使其更加便携。
  • 测试您的应用程序是否与新的node版本兼容,无需安装它。

免费供非商业使用。但真的很不错。 - Metal3d
8
这是一个封闭源代码的应用程序。俄罗斯的僵尸网络欢迎使用您的应用。 - papercowboy
4
这是个好主意,但我进行了一些计算基准测试,不幸的是使用 Enclose 的代码比使用 Node 慢了大约 5 倍,所以我认为这样做没有意义,除非性能有所提升。在 Win8.1 上使用 -x 标志和 Node 5(64位 exe)进行了测试。 - grizzly
3
如果你没有许可证(每月9美元),你的程序将会添加一个糟糕的输出信息,告诉你去购买许可证! - alexandre1985
是的,它对非商业用户免费,但不值得信任。我不理解“有限连接”的术语... - Firas Abd Alrahman

10

5
您可以使用Closure编译器来编译您的JavaScript。
您还可以使用CoffeeScript将您的CoffeeScript编译为JavaScript。
编译的目的是什么?
将任意非阻塞JavaScript编译成C听起来非常令人生畏。
实际上,通过编译成C或ASM并不能获得太多速度提升。如果想要获得速度提升,请将计算卸载到一个C程序中,并通过子进程进行处理。

11
OP可能希望将一个node.js应用程序编译成本地代码。 - onteria_
我想要的是闭包,或者更可能是 JSLint。 - jcolebrand
你会注意到我没有推荐它,我只是指出了 OP 可能在寻找什么。大多数开发人员认为代码验证器就是编译器。他们想知道代码是否有效,而不是运行时是否有错误(这是一个潜在的额外好处)。如果猫记得语句结束的规则并决定使用大量分号(对于新手来说更好),以及更多注释,我会很高兴的。 - jcolebrand
@raynos Closure 编译器是您推荐用于编译 Node.js 代码以进行混淆的工具吗? - Luc
@Luc 闭包编译器很好,这是我使用的编译器。还有其他的像YUI压缩器和uglify。它们之间不应该有太大的区别。 - Raynos
显示剩余2条评论

0

现在这可能包含了你不需要的内容(而且在非图形环境下的命令行应用程序可能无法工作,我不知道),但是有nw.js。 它是Blink(即Chromium/Webkit)+ io.js(即Node.js)。

您可以使用node-webkit-builder为Linux、OS X和Windows构建本机可执行二进制文件。

如果您想要一个GUI,那就是一个巨大的加分项。您可以使用Web技术构建一个GUI。 如果不需要GUI,请在package.json中指定"node-main"(可能还需要"window": {"show": false},尽管只有一个node-main而没有main也可以)

我没有尝试过以这种方式使用它,只是抛出一个可能性。我可以说,对于非图形化的Node.js应用程序,这肯定不是一个理想的解决方案。


-6

JavaScript并没有像Java/C那样的编译器(你可以将其与PHP等语言进行比较)。如果你想编写编译代码,你应该阅读关于addons的部分并学习C语言。虽然这相当复杂,但我认为你不需要这样做,而是直接编写JavaScript即可。


15
这并非完全有效。有一些工具可以将JavaScript转换成字节码。也有一些工具可以将代码“编译”成闭包,这通常是:a)更加紧凑,b)遵循作用域的概念,c)针对执行做了优化(编译器开发人员通常都是天才)。因此...确实存在编译器,只是与VS的DevEnv.exe不同而已。 - jcolebrand
4
你是否可以在Node.js中使用JavaScript字节码?大多数情况下,编译器将源语言编译成另一种语言,通常具有二进制形式(来自http://en.wikipedia.org/wiki/Compiler)。你提到的工具仍然会以JavaScript的形式返回一个经过优化的版本,但仍然是JavaScript。我想知道你是否真的可以称之为编译器? - Alfred
是的,实际上我正在寻找插件的替代方案,不过还是谢谢。 - Mark
1
@Marco,不用谢:P。希望你成功了。 - Alfred

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