如何更改 Node.js 模块包装器?

How to change the Node.js module wrapper?

出于测试目的,我需要更改 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 或 属性 以更改脚本包装?

您可以用自己的方法覆盖 require。例如

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

您所要做的就是实现 openTheModuleIndexFile 函数,以及 wrapTheModule 您的包装函数。

(别忘了module_name可以是本目录、父目录、子目录的node_modules,甚至可以只是一个JS文件名)

我敢肯定,您需要进行相同的修改,但最终应该会奏效。

如果不覆盖 require 函数,则无法更改节点应用程序内的包装器。 但是您可以将节点源 fork(复制)到您的计算机,更改一行并编译(构建)它。

这就是他喜欢开源的原因:)

你只需要改一行代码 if src/node.js file

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

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

您找到了 Module.wrap 函数,做得很好。简单地覆盖它怎么样?

假设您有两个文件,main.jsmodule.js。在 main.js 中,您覆盖 Module.wrap 函数以便在每次需要模块时 console.log('debug');。然后你需要 module.js,其中包含一条 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!");

执行 node main.js 结果:

debug
Hello world from module.js!

这也适用于嵌套的 require() 调用,例如,如果您 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!");

在这种情况下 node main.js 产生:

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

在 Node.js 4.3.0 和 6.1.0 上测试。