重写 require 函数
Override the require function
是否可以覆盖全局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);
};
})();
这可能只影响它所在的脚本。
我们如何在流程级别修改它?
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
实际上所说的)。
这是一个更安全的本机 ES6 答案,基于 @orourkedd 在所有需求调用上充当事件侦听器,它可能看起来像它的替换 require,但如果你仔细观察,它实际上是在说: require = require
并捕获对它的调用,但返回原始行为。这只是数百万次使用Proxy()
之一,这对我来说非常方便,例如在 Typescript 中用于将 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)
}
})
这是我找到的解决方法。如果有更好的解决方案,我愿意看到它。
我创建了一个名为 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
函数。
相关文章:
- 从require()'d文件访问函数
- 为什么我不能在 node.js(浏览器化)的 require() 函数中使用变量作为参数
- “require”关键字在节点红色函数节点中不起作用
- 在Require.js中,如果Require()是一个函数,那么Require.config()是如何存在的
- require.js+backbone.js:如何构造具有初始化函数的模块
- Durandal-Weyland优化没有't处理require函数
- Node.js,TypeError:xxx不是函数,在require'd文件
- dojo中的require()和define()函数的主要区别是什么?我们什么时候使用它们
- Grunt Browserify-require.resolve不是函数
- TypeError: require(..) 不是一个函数
- 嵌套依赖主干.js具有 require.js 主干的视图.js导致视图作为对象而不是函数加载
- Require.js - 设置回调函数的返回值
- 重写 require 函数
- 是否可以在客户端代码中使用 Require 函数
- Requirejs:等待模块内部的require函数
- Gruntfile.js带有“require”函数和传递参数
- 使用 require() 在包含的 JavaScript 中使用函数
- 如何在 require.js 中定义函数并加载它
- TypeError:require(..)不是节点js中的函数
- 在javascript中使我自己的函数require