Derzeit mache ich das:
foo.js
const FOO = 5;
module.exports = {
FOO: FOO
};
Und mit bar.js
:
var foo = require('foo');
foo.FOO; // 5
Gibt es einen besseren Weg, dies zu tun? Es ist unangenehm, die Konstante im Exportobjekt zu deklarieren.
javascript
node.js
Turm
quelle
quelle
exports
. Was ist daran unangenehm?export const FOO = 5;
.module.exports={FOO:5};
?Antworten:
Sie können es explizit mit in den globalen Bereich exportieren
global.FOO = 5
. Dann müssen Sie nur noch die Datei benötigen und nicht einmal Ihren Rückgabewert speichern.Aber das solltest du wirklich nicht tun. Es ist eine gute Sache, die Dinge richtig eingekapselt zu halten. Sie haben bereits die richtige Idee, machen Sie also weiter, was Sie tun.
quelle
Meiner Meinung nach
Object.freeze
ermöglicht die Verwendung einen trockeneren und deklarativeren Stil. Mein bevorzugtes Muster ist:./lib/constants.js
./lib/some-module.js
Veraltete Leistungswarnung
Das folgende Problem wurde im Januar 2014 in Version 8 behoben und ist für die meisten Entwickler nicht mehr relevant:
Beachten Sie, dass sowohl die Einstellung false als auch die Verwendung von Object.freeze in Version 8 - https://bugs.chromium.org/p/v8/issues/detail?id=1858 und http://jsperf.com - einen massiven Leistungsverlust zur Folge haben / Performance-Frozen-Objekt
quelle
Technisch gesehen
const
ist nicht Teil der ECMAScript-Spezifikation. Mithilfe des von Ihnen notierten Musters "CommonJS-Modul" können Sie den Wert dieser "Konstante" ändern, da es sich jetzt nur noch um eine Objekteigenschaft handelt. (Ich bin mir nicht sicher, ob dadurch Änderungen an anderen Skripten kaskadiert werden, für die dasselbe Modul erforderlich ist, aber es ist möglich.)Um eine reelle Konstante zu erhalten , dass Sie können auch teilen Besuche
Object.create
,Object.defineProperty
undObject.defineProperties
. Wenn Sie festlegenwritable: false
, kann der Wert in Ihrer "Konstante" nicht geändert werden. :) :)Es ist ein wenig ausführlich (aber auch das kann mit ein wenig JS geändert werden), aber Sie sollten es für Ihr Konstantenmodul nur einmal tun müssen. Mit diesen Methoden wird standardmäßig jedes Attribut verwendet, das Sie weglassen
false
. (im Gegensatz zum Definieren von Eigenschaften über die Zuweisung, bei der standardmäßig alle Attribute verwendet werdentrue
)Also, hypothetisch, könnte man einfach eingestellt
value
undenumerable
, Weglassenwritable
undconfigurable
da sie auf dem Standard würdenfalse
, habe ich sie nur für Klarheit enthalten.Update - Ich habe ein neues Modul ( Knotenkonstanten ) mit Hilfsfunktionen für diesen Anwendungsfall erstellt.
constants.js - Gut
constants.js - Besser
script.js
quelle
Object.defineProperty()
.false
In diesem Zusammenhang werden alle nicht angegebenen Eigenschaften angenommen .ES6 Weg.
Export in foo.js.
Import in bar.js
quelle
const
In istbar.js
, das die Unveränderlichkeit der destrukturierten Variablen erzwingt, nicht dasconst
Infoo.js
. Das heißt, kann man verwenden ,let {FOO} =
inbar.js
und mutieren die „Konstante“ Variable. AFAIK, um die Unveränderlichkeit der Exporte durchzusetzen, benötigt man noch entweder ES-Module oderObject.freeze
.FOO
innen ändernfoo.js
.Ich fand die von Dominic vorgeschlagene Lösung die beste, aber es fehlt immer noch eine Funktion der "const" -Deklaration. Wenn Sie eine Konstante in JS mit dem Schlüsselwort "const" deklarieren, wird das Vorhandensein der Konstante zur Analysezeit und nicht zur Laufzeit überprüft. Wenn Sie also den Namen der Konstante irgendwo später in Ihrem Code falsch geschrieben haben, wird eine Fehlermeldung angezeigt, wenn Sie versuchen, Ihr Programm node.js zu starten. Welches ist eine weitaus bessere Rechtschreibfehlerprüfung.
Wenn Sie die Konstante mit der Funktion define () definieren, wie von Dominic vorgeschlagen, wird kein Fehler angezeigt, wenn Sie die Konstante falsch geschrieben haben, und der Wert der falsch geschriebenen Konstante ist undefiniert (was zum Debuggen von Kopfschmerzen führen kann).
Aber ich denke, das ist das Beste, was wir bekommen können.
Außerdem gibt es hier eine Art Verbesserung der Dominic-Funktion in constans.js:
Auf diese Weise können Sie die Funktion define () in anderen Modulen verwenden und Konstanten sowohl innerhalb des Moduls constants.js als auch innerhalb Ihres Moduls definieren, von dem aus Sie die Funktion aufgerufen haben. Das Deklarieren von Modulkonstanten kann dann auf zwei Arten erfolgen (in script.js).
Zuerst:
Zweite:
Wenn Sie möchten, dass die Funktion define () nur vom Konstantenmodul aufgerufen wird (um das globale Objekt nicht aufzublähen), definieren Sie sie wie folgt in constants.js:
und benutze es so in script.js:
quelle
Aus früheren Projekterfahrungen ist dies ein guter Weg:
In den constants.js:
Verwenden Sie es in main.js (oder app.js usw.) wie folgt:
quelle
Ich denke, das
const
löst das Problem für die meisten Leute, die nach dieser Antwort suchen. Wenn Sie wirklich eine unveränderliche Konstante benötigen, schauen Sie sich die anderen Antworten an. Um alles organisiert zu halten, speichere ich alle Konstanten in einem Ordner und benötige dann den gesamten Ordner.src / main.js Datei
src / consts_folder / index.js
Ps. hier das
deal
undnote
wird die erste Ebene auf der main.js seinsrc / consts_folder / note.js
Ps.
obj
wird die zweite Ebene auf der main.js seinsrc / consts_folder / deal.js
Ps.
str
wird die zweite Ebene auf der main.js seinEndergebnis in der Datei main.js:
console.log(constants.deal);
Ausgabe:console.log(constants.note);
Ausgabe:quelle
import
undexport
(wahrscheinlich brauche ich ab 2018 so etwas wie babel, um import zu verwenden)types.js
myApp.js
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
quelle
Alternativ können Sie Ihre "konstanten" Werte in einem lokalen Objekt gruppieren und eine Funktion exportieren, die einen flachen Klon dieses Objekts zurückgibt.
Dann spielt es keine Rolle, ob jemand FOO neu zuweist, da dies nur die lokale Kopie betrifft.
quelle
Da Node.js die CommonJS-Muster verwendet, können Sie Variablen nur zwischen Modulen mit
module.exports
oder durch Festlegen einer globalen Variablen wie im Browser freigeben, aber anstatt das von Ihnen verwendete Fenster zu verwendenglobal.your_var = value;
.quelle
Am Ende habe ich ein eingefrorenes Objekt mit anonymen Getter-Funktionen exportiert und nicht die Konstanten selbst. Dies verringert das Risiko böser Fehler, die aufgrund eines einfachen Tippfehlers des const-Namens auftreten, da bei einem Tippfehler ein Laufzeitfehler ausgelöst wird. Hier ist ein vollständiges Beispiel, das auch ES6-Symbole für die Konstanten verwendet, um die Eindeutigkeit sicherzustellen, sowie ES6-Pfeilfunktionen. Würde mich über Feedback freuen, wenn etwas in diesem Ansatz problematisch erscheint.
quelle
Ich empfehle es mit Webpack (vorausgesetzt, Sie verwenden Webpack).
Das Definieren von Konstanten ist so einfach wie das Festlegen der Webpack-Konfigurationsdatei:
Auf diese Weise definieren Sie sie außerhalb Ihrer Quelle und sie sind in allen Ihren Dateien verfügbar.
quelle
Ich denke nicht, dass es eine gute Praxis ist, aus Modulen in den GLOBAL-Bereich einzudringen, aber in Szenarien, in denen die Implementierung unbedingt erforderlich sein könnte:
Es muss die Auswirkung dieser Ressource berücksichtigt werden. Ohne die richtige Benennung dieser Konstanten ist das Risiko, bereits definierte globale Variablen zu überschreiben, etwas Reales.
quelle