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("erfordert " + 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 "Hallo Welt" gedruckt werden.

Ich weiß, das sieht nach einer schlechten Idee aus, aber ich habe tatsächlich einen legitimen Grund dafür. ;)


Das Problem bei diesem Code ist, dass er versucht, x/hello.js zu laden, nicht y/hello.js — Ich möchte, dass es genauso funktioniert wie das standardmäßige require.

1voto

Lime Punkte 13142

Sie könnten das sicherlich tun. Es würde erfolgreich verhindern, dass das globale require.paths-Array geändert wird, was zur Laufzeit Probleme verursachen kann, und sollte keine Probleme mit zukünftigen Versionen haben.

Sie sollten in der Lage sein, einfach ein Modell einzurichten, 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("Erwarte " + 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 rate davon ab, aber wenn Sie wirklich listig sein wollen, könnten Sie die require-Funktion überschreiben.

var require = xrequire;

Ich würde auf jeden Fall dies ausführlich in Ihrem Modul dokumentieren, wenn Sie diese Funktionalität requiren möchten, aber es funktioniert definitiv.

BEARBEITEN:

Nun, Sie könnten überprüfen, ob die Datei vorhanden ist, und im Falle eines Fehlers zu require zurückfallen.

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

Ich denke, Sie könnten versuchen, process.cwd am Anfang des Dateipfads hinzuzufügen, um zu erzwingen, dass zuerst im richtigen Verzeichnis gesucht wird. Ehrlich gesagt würde dies die meisten Entwickler verwirren. Ich würde empfehlen, einfach einen Namensraum für Ihre App zu definieren und eine spezielle require-Funktion zu erstellen, die nur die speziellen Funktionen dieses namensgegebenen Apps abruft.

0voto

Sean McMillan Punkte 9808

Die CommonJs-Modulspezifikation erfordert, dass require als require benannt wird und mit einem String-Literal 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 es kann bei einer anderen Implementierung oder bei einem Upgrade fehlschlagen.

Bearbeitung: Das oben Genannte stammt aus meiner Erinnerung, als ich etwas über CommonJS-Module gelernt habe - Es scheint nicht in der Spezifikation so 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