Singleton-Muster in Nodejs - wird es benötigt?
Ich kam vor kurzem in dieser Artikel auf, wie man ein singleton in Node.js. Ich kenne die Dokumentation von require
Staaten:
Module zwischengespeichert werden, nachdem Sie das erste mal geladen sind. Mehrere Aufrufe von require('foo') kann nicht die Ursache der Modul-code mehrfach ausgeführt wird.
So scheint es, dass jedes benötigte Modul kann leicht sein verwendet eine ohne singleton das singleton-boilerplate-code.
Frage:
Nicht den oben genannten Artikel bieten einen rund-Lösung zum erstellen einer singleton?
InformationsquelleAutor der Frage mkoryak | 2012-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das hat grundsätzlich zu tun mit nodejs-caching. Schlicht und einfach.
https://nodejs.org/api/modules.html#modules_caching
(v 6.3.1)
So, in einfachen Worten.
Wenn Sie möchten, eine Singleton; ein Objekt exportieren.
Wenn Sie nicht möchten, dass ein Singleton; eine Funktion exportieren, (und machen Sachen Rendite/stuff/was auch immer in dieser Funktion).
InformationsquelleAutor der Antwort Karl Morrison
Alle der oben genannten ist zu kompliziert. Es gibt eine Schule des Denkens, die sagt, design patterns zeigen Defizite der aktuellen Sprache.
Sprachen mit Prototyp-basierte OOP (classless) benötigen Sie nicht, ein singleton-Muster überhaupt. Erstellen Sie einfach eine einzelne(ton) Objekt on-the-fly und dann verwenden Sie es.
Als Module in Knoten, ja, Sie werden standardmäßig zwischengespeichert, aber es kann gezwickt werden, wenn Sie zum Beispiel möchten, heißen-laden der Modul ändert.
Aber ja, wenn Sie möchten, verwenden Sie freigegebene Objekt alle über, indem es in ein Modul exportiert wird, in Ordnung. Nur nicht verkomplizieren, es mit dem "singleton-pattern", keine Notwendigkeit für Sie, in JavaScript.
InformationsquelleAutor der Antwort
Einem singleton in node.js (oder im browser JS, für diese Angelegenheit), ist völlig unnötig.
Da Module zwischengespeichert werden und stateful, das Beispiel auf dem link, den Sie könnte leicht umgeschrieben werden, viel mehr einfach:
InformationsquelleAutor der Antwort Paul Armstrong
Suche ein wenig weiter bei der Modul-Caching Vorbehalte in den Modulen docs:
So, je nachdem, wo Sie sind, wenn Sie wollen, dass ein Modul, das es möglich ist, zu einer anderen Instanz des Moduls.
Klingt Module sind nicht eine einfache Lösung zum erstellen von singletons.
Edit: Oder vielleicht haben Sie sind. Wie @mkoryak, ich kann nicht kommen mit einem Fall, wo eine einzelne Datei zu lösen, um einen anderen Dateinamen (ohne symlinks). Aber (wie @JohnnyHK Kommentare), mehrere Kopien einer Datei in verschiedenen
node_modules
Verzeichnisse werden jeweils geladen und separat gespeichert.InformationsquelleAutor der Antwort mike
Keine. Beim Node-Modul caching fehlschlägt, wird das singleton-pattern fehl. Ich veränderte Sie das Beispiel ausführen, sinnvoll auf OSX:
Dieser gibt die Ausgabe der Autor erwartet:
Aber eine kleine änderung Niederlagen Zwischenspeichern. Auf OSX, dies zu tun:
Oder unter Linux:
Ändern Sie dann die
sg2
erfordern Zeile:Und bamdem singleton ist besiegt:
Ich weiß nicht, von einem akzeptablen Weg, dies zu umgehen. Wenn Sie wirklich das Gefühl die Notwendigkeit, etwas zu machen, singleton-und sind in Ordnung mit der Verschmutzung der globalen namespace (und die vielen Probleme, die sich ergeben können), können Sie den Autor
getInstance()
undexports
Linien:Sagte, ich habe nie in eine situation in einem Produktionssystem, wo ich brauchte, um zu tun etwas wie dieses. Ich habe auch nie das Bedürfnis verspürt, verwenden Sie das singleton-pattern in Javascript.
InformationsquelleAutor der Antwort Allen Luce
Sie brauchen nichts besonderes zu tun, ein singleton in js den code in der Artikel könnte genauso gut sein:
Außerhalb node.js (zum Beispiel im browser js), müssen Sie den wrapper-Funktion, manuell (es erfolgt automatisch in node.js):
InformationsquelleAutor der Antwort Esailija
Singletons sind gut in JS, die Sie gerade brauchen auch nicht so ausführlich.
In Knoten wenn Sie ein singleton, zum Beispiel die Verwendung der gleichen ORM/DB-Instanz über verschiedene Dateien in Ihre server-layer, Sie kann Sachen die Referenz in einer globalen variable.
Schreiben Sie einfach ein Modul, welches die Globale var, falls es nicht existiert, dann liefert eine Referenz auf das.
@allen-luce hatte Recht mit seiner Fußnote code-Beispiel kopiert hier:
aber es ist wichtig zu beachten, dass mit der
new
Schlüsselwort ist nicht erforderlich. Alle alten Objekt -, Funktions -, iife, etc. funktionieren wird - es gibt keine OOP-voodoo, was hier passiert.bonus-Punkte, wenn Sie eine Schließung einige obj innerhalb einer Funktion zurückgibt, die einen Verweis auf Sie, und machen Sie, dass die Funktion eine Globale - dann auch die Umwidmung von der globalen variable nicht Klamotten die Instanzen bereits erstellt - das ist zwar fragwürdig nützlich.
InformationsquelleAutor der Antwort Adam Tolley
Die einzige Antwort, die hier verwendet ES6-Klassen
benötigen diese singleton mit:
Einzige problem hier ist, dass Sie nicht übergeben Parameter an den Konstruktor der Klasse, aber das kann umgangen werden, indem manuell aufrufen einer
init
Methode.InformationsquelleAutor der Antwort danday74
Es einfach zu halten.
foo.js
Dann nur
InformationsquelleAutor der Antwort Eat at Joes