18.6.2017
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.
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.
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.
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.
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.
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 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.
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.ä.
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.
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.
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.