2016-02-04 13 views
14

Per motivi di test, devo cambiare il wrapper Node.js Module.Come modificare il wrapper del modulo Node.js?

(function (exports, require, module, __filename, __dirname, process, global) { 
    debugger; 
}); 

giocato con Module ho trovato

var Module = require("module") 
Module.wrapper 
-> ["(function (exports, require, module, __filename, __dirname, process, global) { ", " 
});"] 

Module.wrap 
-> function(script) { 
    return NativeModule.wrapper[0] + script + NativeModule.wrapper[1]; 
} 

E 'possibile collegare in Module.wraper o proprietà per modificare l'involucro sceneggiatura?

risposta

12

Hai svolto un ottimo lavoro trovando la funzione Module.wrap. Che ne dici di sovrascriverlo semplicemente?

Immaginate di avere due file, main.js e module.js. In main.js si sovrascrive la funzione Module.wrap al fine di console.log('debug'); ogni volta che è richiesto un modulo. Quindi è necessario module.js, che contiene un messaggio mondiale Hello.

main.js:

var Module = require("module"); 

(function(moduleWrapCopy) { 
    Module.wrap = function(script) { 
    script = "console.log('debug');" + script 
    return moduleWrapCopy(script); // Call original wrapper function 
    }; 
}(Module.wrap)); // Pass original function to IIFE 

require("./module.js"); 

module.js:

console.log("Hello world from module.js!"); 

Esecuzione node main.js risultati in:

debug 
Hello world from module.js! 

Questo funziona anche con nidificati require() chiamate, ad esempio se si require("./module2.js") in module.js:

module.js:

console.log("Hello world from module.js!"); 

require("./module2.js"); 

module2.js:

console.log("Hello world from module2.js!"); 

In questo caso node main.js produce:

debug 
Hello world from module.js! 
debug 
Hello world from module2.js! 

Testato su Node.js 4.3.0 e 6.1.0.

3

È possibile eseguire l'override, il require con il proprio metodo. Per esempio

require = function(module_name) { 
    var js = openTheModuleIndexFile(module_name) 
    var wrapped = wrapTheModule(js) 
    eval(wrapped) 
} 

Tutto quello che dovete fare è quello di implementare la funzione openTheModuleIndexFile e wrapTheModule che la vostra funzione di avvolgimento.

(Non dimenticare il module_name può essere esiste è node_modules di questa directory, directory padre, o directery bambino, è ancora in grado di essere solo un nome di file JS)

ne sono sicuro, è necessario fare stessi hack, ma alla fine, dovrebbe funzionare.

+0

Grazie, ma sfortunatamente, eval non è un'opzione. –

0

Non è possibile modificare il wrapper all'interno dell'app nodo, senza sovrascrivere la funzione di richiesta. ma è possibile inserire (copiare) la sorgente del nodo sul computer, modificare una riga & compilare (compilare).

questo il motivo per cui amo open-source :)

Tutto quello che dovete fare è cambiare una riga di codice, se src/node.js file di

qui: https://github.com/nodejs/node/blob/master/src/node.js#L990

NativeModule.wrapper = [ 
    '(function (exports, require, module, __filename, __dirname) { ', 
    '\n});' 
    ]; 
Problemi correlati