globalrequire
関数をオーバーライドして、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 はこれを overriding Module._load
(これは real require
が実際に呼び出すもの )です。
@orourkeddに基づくはるかに安全なネイティブES6の回答は、すべてのrequire呼び出しでイベントリスナーのように機能します。これは、replaceのrequireのように見えるかもしれませんが、実際に言うと、_require = require
_でトラップ呼び出しをトラップしますが、元の動作に戻ります。これは、私にとって本当に便利なProxy()
の数百万の使用法の1つにすぎません。たとえば、TypeScriptで実際のモジュールノードを使用してtsconfig "paths"をマッピングすると解決します。
言語の下位レベルにあるため、これは「モンキーパッチ」ではない、とまで言ってみます。
_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
関数を呼び出すたびに呼び出す必要があることです。