3 Stimmen

Benutzerdefinierte `require` Methode in CommonJS (speziell Node)

Ist es möglich, eine benutzerdefinierte require-Methode in einem Modul zu definieren, die in einem anderen Modul aufgerufen werden kann?

Zum Beispiel in x/x.js

exports.xrequire = function(path) {
   console.log("require " + path);
   require(path);
};

In y/hello.js

console.log("Hallo, Welt!");

Und dann in y/y.js

var xrequire = require("../x/x.js").xrequire;
xrequire("hello.js");

Wenn y.js ausgeführt wird, sollte "Hello World" gedruckt werden.

Ich weiß, dass dies wie eine schlechte Idee erscheint, aber ich habe einen legitimen Grund, es zu tun. ;)


Das Problem bei diesem Code ist, dass versucht wird, x/hello.js zu laden, nicht y/hello.js - ich möchte, dass es genauso funktioniert wie das Standard-require.

1voto

Lime Punkte 13142

Sie könnten dies sicherlich tun. Dadurch würden Sie erfolgreich vermeiden, das globale require.paths-Array zu verändern, was zur Laufzeit Probleme verursachen kann, und sollten keine Probleme mit zukünftigen Veröffentlichungen haben.

Sie sollten einfach ein Modell einrichten können, das Sie einfach in Ihre aktuelle App requiren. Laut Ihrem Beispiel sollte x.js Folgendes enthalten.

var relative = 'y/';
exports.xrequire = function(path) {
   console.log("requiring " + relative + path);
   return require(relative+path);
};

Dann können Sie erfolgreich Ihr benutzerdefiniertes require verwenden.

var xrequire = require('x.js'),
    hello = xrequire('hello.js');

ICh würde dies nicht empfehlen, aber wenn Sie wirklich hinterlistig sein möchten, könnten Sie die require-Funktion überschreiben.

var require = xrequire;

Ich würde dies auf jeden Fall gründlich dokumentieren, wenn Sie vorhaben, diese Funktionalität zu requiren :D, aber es funktioniert definitiv.

ÄNDERUNG:

Nun, Sie könnten überprüfen, ob die Datei vorhanden ist und auf require zurückfallen, wenn sie nicht existiert.

var relative = 'y/';
exports.xrequire = function(path) {
   var ret;
   try{
     ret = require(relative+path);
     console.log("requiring " + relative + path);
   }catch(e){
     console.log("requiring " + path);
     ret = require(path);
   }
   return ret;
};

Ich denke, Sie könnten versuchen, process.cwd am Anfang des require-Pfads hinzuzufügen, um zuerst im richtigen Verzeichnis zu suchen. Um ehrlich zu sein, würde dies die meisten Entwickler verwirren. Ich würde empfehlen, einfach einen Namespace für Ihre App zu definieren und eine spezielle require-Funktion zu erstellen, die nur die speziellen Funktionen dieser namensspezifischen Apps abruft.

0voto

Sean McMillan Punkte 9808

Die CommonJs-Module-Spezifikation erfordert, dass require als require benannt wird und mit einem Stringliteral aufgerufen wird, um Build-Tools das Vorladen von Modulen zu ermöglichen.

Eine spezifische Implementierung kann es Ihnen ermöglichen, das zu tun, was Sie wollen, aber sie kann auf einer anderen Implementierung oder bei einem Upgrade fehlschlagen.

Bearbeitung: Das oben Gesagte stammt aus meiner Erinnerung, als ich über CommonJS-Module gelernt habe - es scheint jedoch nicht so in der Spezifikation definiert zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X