覆盖require函数

Ion*_*zău 22 javascript require node.js

是否有可能覆盖全局 require函数,从而影响它的process级别?

据我所知,该require函数在包装NodeJS脚本的函数中作为参数提供:

(function (..., require, __dirname) { // something like this
   // The wrapped code
})(...);
Run Code Online (Sandbox Code Playgroud)

有没有办法修改require功能?

(function () {
    var _require = require;
    require = function () {
        console.log("...");
        _require.apply(this, arguments);
    };
})();
Run Code Online (Sandbox Code Playgroud)

这可能只会影响它所在的​​脚本.

我们如何在流程级别修改它?

oro*_*edd 59

var Module = require('module');
var originalRequire = Module.prototype.require;

Module.prototype.require = function(){
  //do your thing here
  return originalRequire.apply(this, arguments);
};
Run Code Online (Sandbox Code Playgroud)


小智 5

这是基于@orourkedd一个更安全的本地ES6答案,就像一个事件监听器都需要调用,它看起来像它的更换要求,但如果你仔细看它实际上是在说:require = require和陷阱调用,但返回原来的行为。这仅仅是数以百万计的用途之一Proxy(),其一直是我非常方便,例如,在打字稿映射tsconfig“路径”与真正的模块节点将解决。

我可以说这不是“猴子补丁”,因为它是该语言的较低级别。

var Module = require('module');
Module.prototype.require = new Proxy(Module.prototype.require,{
    apply(target, thisArg, argumentsList){

        let name = argumentsList[0];

        /*do stuff to ANY module here*/

        if(/MyModule/g.test(name)){
            /*do stuff to MY module*/
            name = "resolveAnotherName"
        }

        return Reflect.apply(target, thisArg, argumentsList)
    }
})
Run Code Online (Sandbox Code Playgroud)