2011-11-07 54 views
11

我正在检查是否可以分发node.js应用程序封闭源代码。不是客户端JavaScript文件,而是服务器端文件作为商业产品。我认为代码混淆/丑化不会提供真正的隐私。也许像打包/编译源代码到二进制文件可以帮助。这可能吗?node.js代码保护

+2

node.js很难与v8耦合。这意味着您需要在运行时使用v8来解释您的源代码。我认为不可能做闭源。 – Raynos

+0

Raynos是正确的,并且由于编译开销,这会降低应用程序的速度。 – alessioalex

+0

是的,看看[这里](http://stackoverflow.com/a/12640211/304141)预编译你的代码的方法。 –

回答

5

我做了一些关于NodeJS和v8代码的搜索。

首先对存储库的NodeJS我发现,其中源代码首先被装载上的src/node.cc执行,线1128:

Local<Value> ExecuteString(Handle<String> source, Handle<Value> filename) 

哪个首先编译串,(后来执行),采用:

Local<v8::Script> script = v8::Script::Compile(source, filename); 

以看看V8源代码在DEPS/V8 /包含/ v8.h,线639,编译函数返回:

Compiled script object, bound to the context that was active 
    when this function was called. When run it will always use this 
    context. 

我不确定脚本绑定到上下文的含义是什么,但我认为它不仅仅是一个二进制对象,您可以保存并传输到另一台机器,而无需传输整个上下文。

编辑:深入研究v8.h,还有一个ScriptData类,它预编译脚本以使编译速度更快,并且可以与Script类一起使用,但Script类仍需要加载脚本时的原始来源。 (也许在打印错误时,它知道错误的来源。)

总之,我认为没有太多的工作是不可能的。

2

有一个很好的方法可以尝试 - 重新编译NodeJS源代码。

打开的NodeJS src文件夹(nodejs-v0.xxx/lib/module.js),你会发现这一点:

// Native extension for .js 
Module._extensions['.js'] = function(module, filename) { 
    var content = NativeModule.require('fs').readFileSync(filename, 'utf8'); 
    module._compile(stripBOM(content), filename); 
}; 

添加新的扩展,以适合您的需求。例如:

// Native extension for .jse (encrypted js) 
Module._extensions['.jse'] = function (module, filename) { 
    var content = stripBOM(NativeModule.require('fs').readFileSync(filename, 'utf8')).split('').reverse().join(''); 
    module._compile(content, filename); 
}; 

然后重新编译的NodeJS,并加密你的代码,并重新命名xxx.js你的代码文件扩展名xxx.jse。

2

已知V8在内部编译JavaScript并执行它。 EncloseJS使用此功能使编译的可执行文件脱离node.js项目。 EncloseJS是node/io.js的编译器 - 它为您提供与传统编译器相同的隐私。

+0

因为你是EncloseJS的作者,所以你可能想给你的答案增加一个免责声明。不过,有趣的解决方案 – svimre