Node.js, der Unterschied zwischen Entwicklung und Produktion
Es gibt keinen Unterschied zwischen Entwicklung und Produktion in Node.js
, d.h. es gibt keine spezifischen Einstellungen, die Sie anwenden müssen, um Node.js in einer Produktionskonfiguration zum Laufen zu bringen. Einige Bibliotheken im npm-Register erkennen jedoch die Verwendung der NODE_ENV
-Variablen und setzen sie standardmäßig auf die Einstellung development
. Führen Sie Ihr Node.js immer mit der Einstellung NODE_ENV=production
aus.
Eine gängige Methode zur Konfiguration Ihrer Anwendung ist die Verwendung der Zwölf-Faktoren-Methodologie.
NODE_ENV in Express
Im weit verbreiteten express Framework sorgt das Setzen von NODE_ENV auf Produktion im Allgemeinen dafür, dass:
- Die Protokollierung auf ein minimales, wesentliches Niveau beschränkt wird
- Mehr Caching-Ebenen zur Optimierung der Leistung stattfinden
Dies geschieht in der Regel durch Ausführen des Befehls
export NODE_ENV=production
in der Shell, aber es ist besser, ihn in Ihre Shell-Konfigurationsdatei (z. B. .bash_profile
mit der Bash-Shell) einzutragen, da die Einstellung sonst bei einem Systemneustart nicht erhalten bleibt.
Sie können die Umgebungsvariable auch anwenden, indem Sie sie dem Initialisierungsbefehl Ihrer Anwendung voranstellen:
NODE_ENV=production node app.js
Beispielsweise können Sie dies in einer Express-Anwendung verwenden, um verschiedene Fehlerbehandlungsroutinen pro Umgebung festzulegen:
if (process.env.NODE_ENV === 'development') {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
app.use(express.errorHandler());
}
Zum Beispiel kompiliert Pug, die von Express.js verwendete Templating-Bibliothek, im Debug-Modus, wenn NODE_ENV
nicht auf production
gesetzt ist. Express-Ansichten werden im Entwicklungsmodus bei jeder Anfrage kompiliert, während sie in der Produktion zwischengespeichert werden. Es gibt noch viele weitere Beispiele.
Diese Umgebungsvariable ist eine in externen Bibliotheken weit verbreitete Konvention, jedoch nicht innerhalb von Node.js selbst.
Warum wird NODE_ENV als Antipattern betrachtet?
Eine Umgebung ist eine digitale Plattform oder ein System, in dem Entwickler Softwareprodukte erstellen, testen, bereitstellen und verwalten können. Konventionell gibt es vier Phasen oder Arten von Umgebungen, in denen unsere Anwendung ausgeführt wird:
- Entwicklung
- Staging
- Produktion
- Test
Das grundlegende Problem von NODE_ENV
rührt daher, dass Entwickler Optimierungen und Softwareverhalten mit der Umgebung kombinieren, in der ihre Software ausgeführt wird. Das Ergebnis ist Code wie der folgende:
if (process.env.NODE_ENV === 'development') {
// ...
}
if (process.env.NODE_ENV === 'staging') {
// ...
}
if (process.env.NODE_ENV === 'production') {
// ...
}
if (process.env.NODE_ENV === 'testing') {
// ...
}
Obwohl dies harmlos erscheinen mag, unterscheidet es die Produktions- und Staging-Umgebungen, was zuverlässige Tests unmöglich macht. Beispielsweise könnte ein Test und damit eine Funktionalität Ihres Produkts bestehen, wenn NODE_ENV
auf development
gesetzt ist, aber fehlschlagen, wenn NODE_ENV
auf production
gesetzt wird. Daher wird das Setzen von NODE_ENV
auf etwas anderes als production
als Antipattern betrachtet.