Namespaces in node.js mit require

8

Ich spiele herum und lerne über Gelübde mit einem persönlichen Projekt. Dies ist eine kleine clientseitige Bibliothek mit Tests in Gelübden. Daher muss ich eine Datei erstellen und testen, die wie folgt geschrieben ist:

%Vor%

In meinem Test (basierend auf science.js , d3 usw.) erfordert dieses Modul Folgendes:

%Vor%

Ich fuhr fort, einen "Modul nicht definierten Fehler" zu bekommen, wenn ich versuche, die Tests auszuführen, also ging ich zu einem repl und rannte:

%Vor%

und es kam zurück:

%Vor%

Ich realisiere, dass ich etwas tun könnte wie:

%Vor%

Aber ich habe das Gefühl, dass ich ein Problem damit verursache, besonders weil die Bibliotheken, auf denen ich dieses Projekt aufbaue, es in dem von mir beschriebenen Format machen.

Ich möchte, dass sich mein Projekt ähnlich verhält wie das, auf dem ich es aufbaue, wo:

%Vor%

erstellt eine Variable in diesem Namespace:

%Vor%

Ich habe das in einer Vielzahl von Bibliotheken gesehen, und ich folge dem Format und dem Gedankenprozess zum T, glaube aber, dass ich etwas über Verhaltensweisen vermisse, von denen ich nichts weiß.

    
Miles McCrocklin 22.07.2012, 16:40
quelle

1 Antwort

16

Es ist kein Problem, es so zu erstellen. Module definieren, was sie im Objekt module.exports zurückgeben. Übrigens brauchen Sie eigentlich keine selbstausführenden Funktionen (SEF), es gibt kein globales Leck wie in Browsern: -)

Beispiele

module1.js:

%Vor%

main.js:

%Vor%

Sobald Sie verstanden haben, wie das funktioniert, können Sie die Versionsnummer einfach exportieren, wenn Sie möchten:

module1.js:

%Vor%

main.js:

%Vor%

Oder wenn Sie etwas Logik wollen, können Sie Ihre module1.js Datei einfach so erweitern:

%Vor%

Oder, wie es bei vielen Modulen der Fall ist, wenn Sie einige Utility-Funktionen exportieren (und andere "privat" halten möchten), können Sie das folgendermaßen tun:

%Vor%

Also, in main.js:

%Vor%

Ihr Spezialfall

Über Ihren speziellen Fall würde ich nicht empfehlen, es so zu machen, wie sie es tun.

Wenn Sie hier nachschauen: Ссылка

Sie sehen, dass sie nicht das Schlüsselwort var verwenden. Sie erstellen also eine globale Variable .

Deshalb können sie darauf zugreifen, wenn sie require das Modul, das die globale Variable definiert, haben.

Und übrigens, das Argument exports ist in ihrem Fall nutzlos. Es ist sogar irreführend, da es tatsächlich das global -Objekt ist (Äquivalent von window in Browsern), nicht das module.exports -Objekt ( this in Funktionen ist das globale Objekt, es wäre undefined im strikten Modus waren aktiviert).

Fazit

Tu es nicht so, wie sie es tun, es ist eine schlechte Idee. Globale Variablen sind eine schlechte Idee, es ist besser, die Philosophie des Knotens zu verwenden und das erforderliche Modul in einer Variablen zu speichern, die Sie wiederverwenden.

Wenn Sie ein Objekt haben wollen, das Sie auf der Client-Seite verwenden und in node.js testen können, ist hier ein Weg:

yourModule.js:

%Vor%

Was kann man hier verkürzen, um die global Variable zu vermeiden:

%Vor%

So können Sie es auf der Client-Seite so verwenden:

%Vor%

Und auf der Serverseite:

%Vor%

Nur FYI, .. bedeutet "übergeordnetes Verzeichnis". Dies ist der relative Pfad, wo das Modul abgerufen werden soll. Wenn sich die Datei im selben Verzeichnis befindet, verwenden Sie . .

    
Florian Margaine 22.07.2012, 17:04
quelle

Tags und Links