style body javascript node.js require

javascript - body - title css



Anular la funciĆ³n requerida (4)

¿Es posible anular la función de require global , afectándola a nivel de process ?

Por lo que sé, la función require se proporciona como argumento en la función que envuelve los scripts NodeJS:

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

¿Hay alguna forma de modificar la función require ?

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

Esto probablemente afectará solo al script donde se encuentra.

¿Cómo podemos modificarlo a nivel de proceso?


Aquí hay una respuesta ES6 nativa mucho más segura basada en @orourkedd que actúa como un detector de eventos en todas las llamadas que requieren, puede parecer que su reemplazo requiere, pero si te acercas a él, dice lo siguiente: require = require y atrapa las llamadas pero devuelve el original comportamiento. Este es solo uno de los millones de usos de Proxy() que me ha sido muy útil, por ejemplo, en Typescript para mapear tsconfig "rutas" con el nodo del módulo real que se resolverá.

Me atrevería a decir que esto no es un "parche de mono", ya que está en un nivel más bajo del idioma.

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


Esta es la solución que encontré. Si hay alguna solución mejor, estoy abierto a verla.

req-modifier.js un script llamado 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; };

Luego, desde los archivos que quiero modificar la función require , hago:

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

La limitación es que tengo que llamar cada vez que la función req-modifier .



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