什么: NodeJS应用程序可以作为二进制文件分发吗?即。您将.js应用程序通过V8编译成其本机二进制文件,并将二进制文件分发给客户端?(如果您完全可以访问NodeJS服务器).还是把代码缩小了呢?
原因:我们为客户端构建服务器端应用程序,这些应用程序通常要托管在客户机的服务器上。分发源代码意味着客户可以很容易地窃取我们的解决方案并停止支付许可费用。这就为我们的应用程序提供了一种简单的逆向工程或重用的可能性,而无需我们的意识。
发布于 2012-02-23 20:27:23
是的,您可以创建二进制格式。V8允许您预编译JavaScript.请注意,这可能会对节点核心所做的假设产生一系列奇怪的副作用。
分发源代码意味着客户可以很容易地窃取我们的解决方案并停止支付许可费用。
仅仅因为你分发二进制文件并不能保护你免受盗窃罪的侵害。他们仍然可以窃取二进制代码或者拆解它。这是通过默默无闻的保护,根本就不是保护。
最好是给他们一个瘦的客户端应用程序,与您的服务器对话,并保持您的服务器代码安全,不泄露它。
发布于 2012-09-28 12:40:53
是的,可以使用这个分支(基于0.8.18),并且您在‘deps/ v8 /src/over-snshot.js’中放入的任何js代码都将提前编译成机器代码,并作为正常内置对象初始化的一部分嵌入到v8中。您需要为打算部署产品的每个平台构建nodejs。
快照代码在v8初始化过程中运行得很早,您不能访问“模块体”中的内置对象。您可以做的是将所有代码放入全局初始化函数中,以便稍后调用。例如:
// 'this' points to the same as the object referenced by
// 'global' in normal nodejs code.
// at this point it has nothing defined in it, so in order to use
// global objects a reference to it is needed.
var global = this;
global.initialize = function() {
// You have to define all global objects you use in your code here;
var Array = global.Array;
var RegExp = global.RegExp;
var Date = global.Date;
// See ECMAScript v5 standard global objects for more
// Also define nodejs global objects:
var console = global.console;
var process = global.process;
// Your code goes embedded here
};此外,这假设您的整个代码都定义在一个文件中,所以如果您的项目使用nodejs模块系统(Require),您需要编写一个脚本,将所有文件组合在一起,并将每个文件封装在一个闭包中,从而使您的代码以为它是一个普通的nodejs模块。可能每个模块闭包都会公开一个require函数,这个函数必须决定什么时候委托给标准的'global.require‘或者返回来自您的其他嵌入模块的导出。看看javascript模块系统是如何为思想而实现的(requirejs就是一个很好的例子)。
这将使您的代码更难调试,因为您不会看到本机代码的堆栈跟踪。
更新:
即使使用v8快照,代码也会嵌入到node.js二进制文件中,因为v8更喜欢延迟编译。有关详细信息,请参阅这。
发布于 2019-08-21 13:17:49
在发布之前,我们一直在使用pkg创建Node.js应用程序的二进制版本。
为了增加许可证密钥检查,我们使用了隐翅
https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js
https://stackoverflow.com/questions/9413123
复制相似问题