10 Tipps für Node.js Applikationen (Best Practices)

18.6.2017

Blog Artikel Bild - 10 Tipps für Node.js Applikationen (Best Practices)

Seit dem letzten Node.js Artikel in diesem Blog ist schon etwas Zeit vergangen und seither erfreut sich Node.js immer größerer Beliebtheit u.a. auch im Enterprise Umfeld.
In diesem Artikel habe ich einmal 10 Tipps für Node.js Applikationen zusammengestellt.
Dieser Artikel beruht auf eigenen Erfahrungen und erhebt keinen Anspruch auf Vollständigkeit.

Starte ein neues Node.js Projekt immer mit npm init

Der npm init Befehl erzeugt eine valide leere package.json Datei im aktuellen Verzeichnis. Die package.json Datei ist für jedes Projekt sehr wichtig, denn hierdrin werden u.a. die npm Module mit ihren Versionen hinterlegt.

npm Module (richtig) installieren

In einigen Projekten ist es wichtig, dass immer eine bestimmte Version eines npm Modules installiert ist. Häufig werden npm Module jedoch nur mit dem Befehl npm install ... --save anstelle von npm install ... --save --save-exact installiert.

Der Befehl npm install ... --save bewirkt, dass das npm Modul ... in der package.json vor der Versionsnummer ein ^ erhält. Wenn jemand anderes dieses npm Modul für das Projekt installiert, kann es passieren, dass er eine andere Version erhält, als die die ursprünglich einmal installiert worden ist. Der Befehl npm install ... --save --save-exact hingegen führt dazu, dass die Version in der package.json auf die aktuelle Version festgesetzt wird.

Applikations-Überwachung ist wichtig

Node.js Applikationen laufen als eigener Prozess auf dem Server. Wenn dieser Prozess beispielsweise durch einen Fehler in der Programmierung abstürzt, sollten Sie es als Erster erfahren und nicht Ihre Besucher.

Es gibt eine Vielzahl von Überwachungstools für Node.js Applikationen, die dafür sorgen, dass bei einem Fehler eine entsprechende Mitteilung per E-Mail oder auf einem anderen Weg ausgesteuert wird. Hier muss jeder die für seinen Anwendungsfall benötigte Überwachungssoftware selber finden. Ich bevorzuge für Node.js Applikationen unter anderem monit, da es auf den meisten Servern bereits mitgeliefert wird. Es gibt jedoch mit anderen Tools noch weitaus umfangreichere Überwachungsmöglichkeiten als monit diese leistet.

Immer die neuste LTS Version von Node.js einsetzen

Ich empfehle grundsätzlich immer die neuste LTS (Long Term Support) Version von Node.js einzusetzen, um zum einen die Stabilität zu bekommen, zum anderen jedoch nicht auf die neusten Features verzichten zu müssen. Zum Erscheinungszeitpunkt dieses Artikels ist dies die Node.js Version 6.11.0.

Wenn man verschiedene Node.js Versionen einsetzt und einfach zwischen diesen hin- und herschalten möchte, empfehle ich den Einsatz von nvm.

Dateinamen immer im Lowercase schreiben

Don´t create Filenames like this: "MyFile.js" Der Grund ist ziemlich einfach. Node.js gibt es für die verschiedenen Platformen (Windows, OSX, Linux) Der Befehl var MyFile = require('MyFile'); würde zwar beispielsweise auf einem Windows Entwicklungssystem funktionieren, jedoch auf einem Linux Produktionsserver zu einem "File not Found" führen. Der Hintergrund ist, dass einige Betriebssysteme beispielsweise Windows nicht zwischen "MyFile.js" und "myfile.js" unterscheiden. Andere Betriebssysteme, beispielsweise Linux, jedoch schon.

Daher hat sich bei Node.js Projekten für Dateinamen die Schreibweise mit Bindestrich als praktikabel erwiesen. Für das oben stehende Beispiel wäre dies "my-file.js".

Statische Dateien nicht per Node.js ausliefern lassen

Statische Dateien wie beispielsweise Bilder o.ä. sollten nicht über Node.js sondern über den Webserver ausgeliefert werden. Idealerweise läuft eine Node.js Applikation nicht direkt auf Port 80 sondern auf einem anderen Port und ein Webserver (ich empfehle nginx) reicht die Anfragen an den Node.js Prozess weiter.

Da ein Webserver statische Dateien wesentlich performanter ausliefern kann, als eine Node.js Applikation, sollten statische Dateien in eine extra Verzeichnis direkt über den Webserver ausgeliefert werden. Somit stehen der Node.js Applikation mehr Ressourcen für die Verarbeitung von dynamischen Anfragen zur Verfügung.

console.log Statements entfernen

An jeder stelle einer Node.js Applikation können Ausgaben mit console.log(); erzeugt werden. Auf einem Entwicklungssystem kann dies von Vorteil sein, da der Entwickler sich an verschiedenen Stellen im Code beispielsweise den Zustand von einzelnen Objekten ansehen kann.

Werden jedoch diese console.log Statements vergessen und gelangen Sie ins produktiv System, verbrauchen sie unnötig viel CPU Zeit und verschwenden wertvolle Ressourcen, insbesondere dann, wenn die Ausgabe sehr groß ist. Auch blockiert der console.log Befehl den gesamten Prozess, da dieser synchron ausgeführt wird. Von daher sollten vor einem Einsatz im produktiv System alle console.log Anweisungen entfernt werden, beispielsweise durch den Einsatz von Gulp o.ä.

Synchrone Funktionen vermeiden

Node.js bietet beispielsweise für Datei Operationen immer eine synchrone und eine asynchrone Version eines Befehls an. Während beispielsweise das lesen einer Datei mit dem Befehl fs.readFileSync(path[, options]) den gesamten Prozess solange blockiert, bis die Datei komplett gelesen worden ist, wird bei dem Befehl fs.readFile(path[, options], callback) hingegen die Programmausführung weiter fortgesetzt. Sobald die Datei gelesen worden ist, wird die Callback Funktion aufgerufen. Bei einer stark frequentierten Anwendung kann die Leistung bei vielen synchronen Funktionsaufrufen verringert werden. Daher sollte auf den Einsatz von synchronen Funktionsaufrufen soweit verzichtet werden.

Da Node.js Single-Threaded ist, empfiehlt es sich, immer asynchrone Funktionen beispielsweise für das Lesen von Dateien oder Datenbanken einzusetzen. Die Hierdurch entstehende Callback Hirarchie kann durch spezielle npm Module gesteuert werden.

NODE_ENV Variable korrekt setzen

Bei NODE_ENV handelt es sich im eine Umgebungsvariable, die insbesondere durch das Express Framework popular geworden ist. Die NODE_ENV Variable definiert, in welcher Umgebung die Node.js/Express Applikation läuft (development oder production).

Die Variable kann beispielsweise unter Linux & OSX durch export NODE_ENV=production oder unter Windows durch set NODE_ENV=production gesetzt werden. Durch das Festlegen der Umgebungsvariable auf production wird Express u.a. dazu veranlasst, view Templates im Speicher zu halten anstelle sie immer neu von der Festplatte zu laden, sowie der weniger ausführlichen Generierung von Fehlernachrichten. Die Express Anwendung wird hierbei also auf eine höhere Anwendungsleistung getrimmt.

Code durch automatische Tests prüfen

Last but not least sollte der clientseitiger JavaScript Code einer Node.js Applikation immer durch Tests abgesichert werden. Hierzu stehen für Node.js eine Vielzahl von unterschiedlichen Testframeworks bereit.

Sollten Sie die testgetriebene Entwicklung unter Node.js einsetzen wollen oder Unterstützung bei der Implementierung Ihres Projektes benötigen, so kann ich Ihnen hierbei gerne meine technische Unterstützung anbieten. Kontaktieren Sie mich hierzu bitte einfach über das Kontaktformular oder vereinbaren Sie telefonisch einen Termin.