Как изменить оболочку модуля 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});'
  ];