覆盖require函数

是否有可能重写全局 require函数,影响它在process级别?

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

 (function (..., require, __dirname) { // something like this // The wrapped code })(...); 

有没有办法修改require函数?

 (function () { var _require = require; require = function () { console.log("..."); _require.apply(this, arguments); }; })(); 

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

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

       

网上收集的解决方案 "覆盖require函数"

 var Module = require('module'); var originalRequire = Module.prototype.require; Module.prototype.require = function(){ //do your thing here return originalRequire.apply(this, arguments); }; 

mock-require通过覆盖Module._load (这是实际require实际调用的 )来Module._load这一点。

这是我find的解决方法。 如果有更好的解决scheme,我很乐意看到它。

我创build了一个名为req-modifier.js的脚本:

 module.exports = function (_args) { var _require = _args[1]; function newRequire () { console.log("Require is called"); return _require.apply(this, arguments); } newRequire.__proto__ = _require; _args[1] = newRequire; }; 

然后从文件中我要修改require函数,我这样做:

 require("./req-modifier")(arguments); var foo = require("./foo"); 

限制是我必须每次调用req-modifier函数。

这是一个更安全的原生ES6答案基于@orourkedd这就像所有需要调用的事件监听器,它可能看起来像它的替代要求,但如果你仔细观察其实际上说: require = require和陷阱调用,但返回原行为。 这只是Proxy()的数百万次使用中的一个,这对我来说非常方便,例如在Typescript中,将tsconfig“path”与真实模块节点进行映射将解决。

我甚至可以说,这不是“猴子修补”,因为它在语言的低级别。

 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) } })