Как изменить оболочку модуля Node.js?
Для целей тестирования мне нужно изменить обертку Node.js Module
.
(function (exports, require, module, __filename, __dirname, process, global) {
debugger;
});
Играя с Module
, я нашел
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];
}
Можно ли подключиться к Module.wraper
или свойству для изменения обертки script?
Ответы
Ответ 1
Вы отлично поработали, найдя функцию Module.wrap
. Как просто переписать его?
Представьте, что у вас есть два файла: main.js
и module.js
. В main.js
вы перезаписываете функцию Module.wrap
для console.log('debug');
каждый раз, когда требуется модуль. Тогда вам потребуется module.js
, в котором содержится приветственное сообщение мира.
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!");
Выполнение node main.js
приводит к:
debug
Hello world from module.js!
Это также работает с вложенными вызовами require()
, например, если вы require("./module2.js")
в module.js
:
module.js
:
console.log("Hello world from module.js!");
require("./module2.js");
module2.js
:
console.log("Hello world from module2.js!");
В этом случае node main.js
выдает:
debug
Hello world from module.js!
debug
Hello world from module2.js!
Протестировано на Node.js 4.3.0 и 6.1.0.
Ответ 2
Вы можете переопределить, require
своим методом. Например
require = function(module_name) {
var js = openTheModuleIndexFile(module_name)
var wrapped = wrapTheModule(js)
eval(wrapped)
}
Все, что вам нужно сделать, это реализовать функцию openTheModuleIndexFile
и wrapTheModule
, которая будет работать с вашей упаковкой.
(Не забывайте, что module_name
может существовать node_modules
этого каталога, родительского каталога или дочернего каталога, это даже может быть просто имя файла JS)
Я уверен, вам нужно сделать такие же хаки, но в итоге он должен работать.
Ответ 3
Вы не можете изменить оболочку внутри приложения node, не переопределяя требуемую функцию. , но вы можете преобразовать (скопировать) node источник на свой компьютер, изменить одну строку и скомпилировать (построить).
Вот почему он любит open-source:)
Все, что вам нужно сделать, это изменить одну строку кода, если файл src/ node.js
здесь:
https://github.com/nodejs/node/blob/master/src/node.js#L990
NativeModule.wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];