2011-11-07 16 views
11

Estaba comprobando si es posible distribuir un node.js aplicación de código cerrado. No son los archivos Javascript del lado del cliente sino los archivos del lado del servidor como un producto comercial. Supongo que la ofuscación/uglificación del código no proporcionará una privacidad real. Tal vez algo como empaquetar/compilar el código fuente en binario podría ayudar. es posible?node.js código de protección

+2

node.js está acoplado a v8. Esto significa que necesita usar v8 para interpretar su código fuente en tiempo de ejecución. No creo que sea posible hacer una fuente cerrada. – Raynos

+0

Raynos tiene razón, y además de eso ralentizaría la aplicación, debido a la sobrecarga de compilación. – alessioalex

+0

Sí, mira [aquí] (http://stackoverflow.com/a/12640211/304141) para una forma de precompilar tu código. –

Respuesta

5

Hice algo de búsqueda alrededor del código NodeJS y v8.

Primera de repositorio NodeJS He encontrado que el código fuente se carga por primera vez que se ejecuta en src/node.cc, línea 1128:

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

que primero se compila la cadena, (y más tarde se ejecuta), usando:

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

Echando un vistazo al código fuente v8 en deps/V8/include/v8.h, línea 639, el compilador devuelve la función:

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

No estoy seguro de lo que implica la secuencia de comandos vinculada al contexto, pero podría argumentar que no es solo un objeto binario que puede guardar y transferir a otra máquina sin tener que transferir todo el contexto.

EDITAR: Si examinamos más detalladamente v8.h, también hay una clase ScriptData, que compila previamente una secuencia de comandos para agilizar la compilación, y que se puede usar con la clase Script, pero la clase Script todavía requiere la fuente original cuando carga el script (Tal vez para cuando se imprimen errores, se sabe dónde está el origen del error.)

En resumen, no creo que sea posible sin mucho trabajo.

2

Hay un buen método que puedes probar: recompila el código fuente de NodeJS.

Abrir la carpeta src nodejs (nodejs-v0.xxx/lib/module.js), se encuentra este:

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

Añadir nueva extensión a la habitación sus necesidades. Por ejemplo:

// 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); 
}; 

vuelva a compilar nodejs, y cifrar su código y cambiar el nombre de su código de extensión del archivo de xxx.js a xxx.jse.

2

Se sabe que V8 compila JavaScript internamente y lo ejecuta. EncloseJS usa esta característica para hacer un ejecutable compilado del proyecto node.js. EncloseJS es un compilador para node/io.js - le da la misma privacidad que el compilador clásico.

+0

Es posible que desee agregar un descargo de responsabilidad a su respuesta, ya que usted es el autor de EncloseJS. Sin embargo, una solución interesante. – svimre

Cuestiones relacionadas