覆盖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程级别修改它?
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) } })