2011-11-07 142 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