44 Stimmen

Gibt es eine Möglichkeit, "erfordern" eine JS-Datei nur einmal in nodejs?

Ich habe gerade angefangen, mit Nodejs zu arbeiten. Ich frage mich, ob es eine Möglichkeit gibt, "erfordern" eine Datei nur einmal in einer app. Ich verwende ein Klassen-Framework für immer klassische OOPS in meinem JS-Projekt. Jede "Klasse" ist in ihrer eigenen JS-Datei enthalten. Ich möchte das Klassen-Framework in jeder Datei "erfordern", so dass sie unabhängig funktionieren können, aber der Init-Code des Frameworks soll nur einmal ausgeführt werden.

Ich kann ein Flag verwenden, um dies selbst zu implementieren, aber eine integrierte Möglichkeit wäre schön. Die Suche nach "require once" führt mich zu allen PHP-bezogenen Fragen.

117voto

timoxley Punkte 5026

require ist immer "einmalig erforderlich". Nachdem Sie require das erste Mal, require verwendet einen Cache und gibt immer das gleiche Objekt zurück.

Jeder ausführbare Code, der sich im Modul befindet, wird nur einmal ausgeführt.

Wenn Sie jedoch möchten, dass der Initialisierungscode mehrmals ausgeführt wird, können Sie diesen Code einfach in eine exportierte Methode einfügen.

edit: Lesen Sie den Abschnitt 'Caching' in http://nodejs.org/docs/latest/api/modules.html#modules

8voto

Larry Lawless Punkte 603

Wenn Sie wirklich wollen, dass der Top-Level-Code in Ihrem Modul (Code, der nicht in Methoden oder Funktionen in Ihrem Modul enthalten ist) mehr als einmal ausgeführt wird, können Sie das Modulobjekt löschen, das im require.cache-Objekt wie folgt zwischengespeichert wird:

delete require.cache[require.resolve('./mymodule.js')];

Tun Sie dies, bevor Sie das Modul zum zweiten Mal benötigen.

In den meisten Fällen möchten Sie wahrscheinlich nur den Code der obersten Ebene des Moduls einmal ausführen und bei jeder anderen Verwendung des Moduls nur auf das zugreifen, was das Modul exportiert.

var myMod = require("./mymodule.js"); //the first time you require the
                                      //mymodule.js module the top level code gets
                                      //run and you get the module value returned.

var myMod = require("./mymodule.js"); //the second time you require the mymodule.js
                                      //module you will only get the module value
                                      //returned. Obviously the second time you
                                      //require the module it will be in another
                                      //file than the first one you did it in.

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