Skip to content

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

bash
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:

bash
NODE_ENV=production node app.js

Beispielsweise können Sie dies in einer Express-Anwendung verwenden, um verschiedene Fehlerbehandlungsroutinen pro Umgebung festzulegen:

javascript
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:

javascript
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.