什么: NodeJS 应用程序可以作为二进制分发吗?IE。你通过 V8 将 .js 应用程序编译成它的原生二进制文件,然后将二进制文件分发给客户端?(如果您可以完全访问 NodeJS 服务器)...或者正在缩小代码,您可以做什么?
原因:我们在 NodeJS 中为客户端构建服务器端应用程序,这些应用程序通常必须托管在客户端的服务器上。分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用。这开辟了在我们不知情的情况下轻松逆向工程或重用我们的应用程序的可能性。
什么: NodeJS 应用程序可以作为二进制分发吗?IE。你通过 V8 将 .js 应用程序编译成它的原生二进制文件,然后将二进制文件分发给客户端?(如果您可以完全访问 NodeJS 服务器)...或者正在缩小代码,您可以做什么?
原因:我们在 NodeJS 中为客户端构建服务器端应用程序,这些应用程序通常必须托管在客户端的服务器上。分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用。这开辟了在我们不知情的情况下轻松逆向工程或重用我们的应用程序的可能性。
是的,这是可能的,使用此分支(基于 0.8.18)并且您放入“deps/v8/src/extra-snapshot.js”中的任何 js 代码都将被提前编译为机器代码并嵌入到 v8 中作为正常内置对象初始化的一部分。您需要为要部署产品的每个平台构建 nodejs。
快照代码在 v8 初始化的早期运行,您无法访问“module主体”中的内置对象。您可以做的是将所有代码放在一个全局初始化函数中,以便稍后调用。前任:
// '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 module系统(需要),您需要编写一个脚本,将所有文件合并为一个并将每个文件包装在一个闭包中,这将欺骗您代码认为它是一个普通的 nodejs module。可能每个module闭包都会暴露一个 require 函数,这个函数必须决定何时委托给标准的“global.require”或从其他嵌入式module返回导出。看看 javascript module系统是如何为想法实现的(requirejs 就是一个很好的例子)。
这将使您的代码更难调试,因为您不会看到本机代码的堆栈跟踪。
更新:
即使使用 v8 快照,代码也会嵌入到 node.js 二进制文件中,因为 v8 更喜欢延迟编译。有关更多信息,请参阅此内容。
是的,您可以创建二进制格式。V8 允许您预编译 JavaScript。请注意,这可能会对节点核心所做的假设产生一系列奇怪的副作用。
分发源代码意味着客户可以轻松窃取我们的解决方案并停止支付许可费用。
仅仅因为您分发二进制文件并不能保护您免遭盗窃。他们仍然可以窃取二进制代码或反汇编它。这是通过默默无闻的保护,而这根本不是保护。
最好给他们一个瘦客户端应用程序,它可以与您的服务器通信,并通过不泄露来确保您的服务器代码安全。
我们一直在使用 pkg 在分发之前创建我们的 Node.js 应用程序的二进制版本。
为了添加许可证密钥检查,我们使用Cryptlex:
https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js
我目前正在调查同样的事情,我期待在nexe号称能够“创造一个单一的可执行文件从你的Node.js应用程序”的。
还不能告诉你它是否有好处,但认为它已经值得分享了。
V8 在内部生成本地机器代码并执行它。看这里:https : //github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178。此功能用于EncloseJS。EncloseJS 解析您的 node.js 项目的源代码,捆绑依赖项,并生成可执行的二进制文件。源代码不包含在二进制文件中 - 仅包含已编译的机器代码。