javascript - parameter - npm
¿Cómo cambiar la envoltura del módulo Node.js? (3)
Has hecho un gran trabajo al encontrar la función Module.wrap
. ¿Qué tal simplemente sobrescribirlo?
Imagina que tienes dos archivos, main.js
y module.js
. En main.js
sobrescribes la función Module.wrap
para console.log(''debug'');
Cada vez que se requiere un módulo. Entonces necesitas module.js
, que contiene un mensaje de hello world.
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!");
La ejecución del node main.js
da node main.js
resultado:
debug Hello world from module.js!
Esto también funciona con llamadas de require()
anidadas, por ejemplo, si require("./module2.js")
en module.js
:
module.js
:
console.log("Hello world from module.js!");
require("./module2.js");
module2.js
:
console.log("Hello world from module2.js!");
En este caso el node main.js
produce:
debug Hello world from module.js! debug Hello world from module2.js!
Probado en Node.js 4.3.0 y 6.1.0.
Para propósitos de prueba, necesito cambiar la envoltura del Module
Node.js.
(function (exports, require, module, __filename, __dirname, process, global) {
debugger;
});
Jugado con el Module
que encontré
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];
}
¿Es posible enganchar en Module.wraper
o propiedad para cambiar el Module.wraper
script?
No puede cambiar el envoltorio dentro de la aplicación de nodo, sin anular la función requerida. pero puede bifurcar (copiar) la fuente del nodo a su computadora, cambiar una línea y compilarla (construirla).
Por eso le encanta el código abierto :)
Todo lo que tiene que hacer es cambiar una línea de código si el archivo src / node.js
Aquí: https://github.com/nodejs/node/blob/master/src/node.js#L990
NativeModule.wrapper = [
''(function (exports, require, module, __filename, __dirname) { '',
''/n});''
];
Puede anular, el require
por su propio método. Por ejemplo
require = function(module_name) {
var js = openTheModuleIndexFile(module_name)
var wrapped = wrapTheModule(js)
eval(wrapped)
}
Todo lo que tiene que hacer es implementar la función openTheModuleIndexFile
, y wrapTheModule
que es su función de wrapTheModule
.
(No olvide que el nombre de module_name
puede existir en los module_name
de este directorio, directorio principal o directivo secundario, incluso puede ser solo un nombre de archivo JS)
Estoy seguro, necesitas hacer los mismos hacks, pero al final, debería funcionar.