【问题标题】:How to change the Node.js module wrapper?如何更改 Node.js 模块包装器?
【发布时间】:2016-05-14 15:46:33
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js node-modules


    【解决方案1】:

    找到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 上测试。

    【讨论】:

      【解决方案2】:

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

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

      您所要做的就是实现openTheModuleIndexFile 函数和您的包装函数wrapTheModule

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

      我敢肯定,你需要做同样的修改,但最终,它应该可以工作。

      【讨论】:

      • 谢谢,但不幸的是 eval 不是一个选项。
      【解决方案3】:

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

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

      如果 src/node.js 文件,你只需修改一行代码

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        相关资源
        最近更新 更多