如何更改 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.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()
调用,例如,如果您 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 上测试。
出于测试目的,我需要更改 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.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()
调用,例如,如果您 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 上测试。