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

出于testing目的,我需要更改Node.js Module包装器。

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

在我find的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或属性来改变脚本包装?

通过查找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()调用,例如,如果在module.js require("./module2.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上testing。

你可以用你自己的方法来重载, require 。 例如

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

你所要做的就是实现openTheModuleIndexFile函数,并且wrapTheModule是你的包装函数。

(不要忘了module_name可以存在的是node_modules这个目录,父目录或子目录,它甚至可以只是一个JS文件名)

我敢肯定,你需要做相同的黑客,但最终,它应该工作。

您不能更改节点应用程序中的包装器,而不覆盖requirefunction。 但是您可以将节点源分叉(复制)到您的计算机,更改一行并编译(构build)它。

这就是为什么他喜欢开源:)

所有你需要做的就是改变一行代码,如果src / node.js文件

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

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