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

标签 javascript node.js node-modules

出于测试目的,我需要更改 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];
}

是否可以 Hook 到 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.jsrequire("./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 上测试。

关于javascript - 如何更改 Node.js 模块包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35211056/

相关文章:

typescript 找不到本地链接的模块?

javascript - DataTables CDN 后备表达式

javascript - 立即设置TimeOut

node.js - this.emit 不工作但 self.emit 工作。为什么?

jquery - 如何制作以Flipkart或Amazon相同的方式加载的Web应用程序?

javascript - nginx 路由是否覆盖了最后/之后的内容

javascript - 尝试在多个页面的下拉菜单中保留用户选择

javascript - 使用两种模式

laravel - 应用程序 js 在将分支与 master (laravel+vue) merge 时发生 merge 冲突

node.js - 如何找出NPX运行的文件?