Ich werde hier meinen Hut in den Ring werfen, weil keine dieser Antworten alle kritischen Komponenten anspricht, die so ziemlich jedes System benötigt. Überlegungen:
- Öffentliche Konfiguration (die vom Frontend gesehen werden kann) vs. private Konfiguration (Guy Mograbi hat diese richtig verstanden). Und sicherstellen, dass diese getrennt gehalten werden.
- Geheimnisse wie Schlüssel
- Standardeinstellungen für umgebungsspezifische Überschreibungen
- Frontend-Bundles
So mache ich meine Konfiguration:
config.default.private.js
- In der Versionskontrolle sind dies Standardkonfigurationsoptionen, die nur von Ihrem Backend angezeigt werden.
config.default.public.js
- In der Versionskontrolle sind dies Standardkonfigurationsoptionen, die vom Backend und Frontend angezeigt werden
config.dev.private.js
- Wenn Sie andere private Standardeinstellungen für dev benötigen.
config.dev.public.js
- Wenn Sie unterschiedliche öffentliche Standardeinstellungen für dev benötigen.
config.private.js
- Nicht in der Versionskontrolle, dies sind umgebungsspezifische Optionen, die überschrieben werden config.default.private.js
config.public.js
- Nicht in der Versionskontrolle, dies sind umgebungsspezifische Optionen, die überschrieben werden config.default.public.js
keys/
- Ein Ordner, in dem jede Datei ein anderes Geheimnis speichert. Dies steht auch nicht unter Versionskontrolle (Schlüssel sollten niemals unter Versionskontrolle stehen).
Ich verwende einfache alte Javascript-Dateien für die Konfiguration, damit ich die volle Leistung der Javascript-Sprache nutzen kann (einschließlich Kommentaren und der Möglichkeit, beispielsweise die Standard-Konfigurationsdatei in die umgebungsspezifische Datei zu laden, damit sie dann überschrieben werden können). Wenn Sie Umgebungsvariablen verwenden möchten, können Sie diese in diese Konfigurationsdateien laden (obwohl ich aus dem gleichen Grund, aus dem ich die Verwendung von JSON-Dateien nicht empfehle, die Verwendung von Env-Variablen ablehne - Sie haben nicht die Fähigkeit einer Programmiersprache zum Erstellen Ihre Konfiguration).
Der Grund, warum sich jeder Schlüssel in einer separaten Datei befindet, liegt im Installationsprogramm. Auf diese Weise können Sie ein Installationsprogramm einrichten, das Schlüssel auf dem Computer erstellt und im Schlüsselordner speichert. Ohne dies kann Ihr Installationsprogramm fehlschlagen, wenn Sie Ihre Konfigurationsdatei laden, die nicht auf Ihre Schlüssel zugreifen kann. Auf diese Weise können Sie das Verzeichnis durchlaufen und alle Schlüsseldateien laden, die sich in diesem Ordner befinden, ohne sich Gedanken darüber machen zu müssen, was in einer bestimmten Version Ihres Codes vorhanden ist und was nicht.
Da Sie wahrscheinlich Schlüssel in Ihrer privaten Konfiguration geladen haben, möchten Sie Ihre private Konfiguration definitiv nicht in einen Frontend-Code laden. Während es wahrscheinlich strikt idealer ist, Ihre Frontend-Codebasis vollständig von Ihrem Backend zu trennen, ist PITA häufig eine ausreichend große Barriere, um zu verhindern, dass Benutzer dies tun, also private oder öffentliche Konfiguration. Ich tue jedoch zwei Dinge, um zu verhindern, dass private Konfigurationen in das Frontend geladen werden:
- Ich habe einen Komponententest, der sicherstellt, dass meine Frontend-Bundles keinen der geheimen Schlüssel enthalten, die ich in der privaten Konfiguration habe.
- Ich habe meinen Frontend-Code in einem anderen Ordner als meinen Backend-Code und zwei verschiedene Dateien mit dem Namen "config.js" - eine für jedes Ende. Für das Backend lädt config.js die private Konfiguration, für das Frontend lädt es die öffentliche Konfiguration. Dann benötigen Sie immer nur ('config') und machen sich keine Sorgen darüber, woher es kommt.
Eine letzte Sache: Ihre Konfiguration sollte über eine völlig separate Datei in den Browser geladen werden als jeder andere Frontend-Code. Wenn Sie Ihren Frontend-Code bündeln, sollte die öffentliche Konfiguration als vollständig separates Bundle erstellt werden. Andernfalls ist Ihre Konfiguration nicht mehr wirklich konfiguriert - sie ist nur ein Teil Ihres Codes. Die Konfiguration muss auf verschiedenen Computern unterschiedlich sein können.