如何更改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.js
和module.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});' ];