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, damit Node.js in einer Produktionskonfiguration funktioniert. Einige Bibliotheken im npm-Registry erkennen jedoch die Verwendung der NODE_ENV
-Variable und setzen sie standardmäßig auf die Einstellung development
. Führen Sie Ihr Node.js immer mit gesetzter NODE_ENV=production
aus.
Eine beliebte Methode zur Konfiguration Ihrer Anwendung ist die Verwendung der Twelve-Factor-Methodologie.
NODE_ENV in Express
Im äußerst beliebten Express-Framework stellt das Setzen von NODE_ENV auf Produktion im Allgemeinen sicher, dass:
- die Protokollierung auf ein Minimum beschränkt wird
- mehr Caching-Ebenen stattfinden, um die Leistung zu optimieren
Dies geschieht normalerweise durch Ausführen des Befehls
export NODE_ENV=production
in der Shell, aber es ist besser, dies in Ihre Shell-Konfigurationsdatei (z. B. .bash_profile
mit der Bash-Shell) einzutragen, da die Einstellung sonst im Falle eines Systemneustarts nicht erhalten bleibt.
Sie können die Umgebungsvariable auch anwenden, indem Sie sie dem Initialisierungsbefehl Ihrer Anwendung voranstellen:
NODE_ENV=production node app.js
In einer Express-App können Sie dies beispielsweise 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());
}
Beispielsweise wird Pug, die von Express.js verwendete Template-Bibliothek, im Debug-Modus kompiliert, 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 Konvention, die in externen Bibliotheken weit verbreitet ist, aber nicht in Node.js selbst.
Warum wird NODE_ENV als Anti-Pattern betrachtet?
Eine Umgebung ist eine digitale Plattform oder ein System, in dem Ingenieure Softwareprodukte erstellen, testen, bereitstellen und verwalten können. Konventionell gibt es vier Stufen 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') {
// ...
}
Auch wenn dies harmlos erscheinen mag, macht es die Produktions- und Staging-Umgebungen unterschiedlich und somit zuverlässige Tests unmöglich. Beispielsweise könnte ein Test und damit eine Funktionalität Ihres Produkts bestanden werden, wenn NODE_ENV
auf development
gesetzt ist, aber fehlschlagen, wenn NODE_ENV
auf production
gesetzt ist. Daher wird das Setzen von NODE_ENV
auf etwas anderes als production
als Anti-Pattern betrachtet.