Wer den letzten Blogpost gelesen hat und sich auch fragt, was node.js ist, dem (und natürlich auch allen anderen ;-)) möchte ich eine kurze Einführung geben.
Mit JavaScript und HTML kann man viele tolle Sachen machen – zum Beispiel Zeichnen im Canvas-Element. Ohne Browser und eine Person, die diesen bedient, sieht man relativ wenig. Für Reports beispielsweise, steht außer Frage, dass Bildgenerierung automatisiert ablaufen muss.
Mit Node.js, einem serverseitigem JavaScript-Framework zum Erstellen von Server- und Konsolenanwendungen, kann nicht nur diese Aufgabe bewältigt werden.
Auf dem Vormarsch
Node.js ist mittlerweile 2 Jahre “alt” – Updates, zumindest in der Unstable-Linie, erscheinen regelmäßig. Sogar Microsoft beteiligt sich an der Entwicklung. Die Zahlen von GitHub und deren Mailing List lassen erkennen, dass sich node.js an einer wachsenden Community und reger Entwicklung erfreut.
Die letzte Stabile Version (0.6, November 2011) hat leider noch keinen Einzug in die Repositories der bekannten Linux-Distributionen gefunden. Die aktuelle Version für Fedora und Enterprise-Distributionen kann hier bezogen werden. Für Debian und Ubuntu ist dieses PPA zu empfehlen.
Auch wir setzen auf node.js, zum Beispiel bei inGraph.
Unter der Haube
Basis von node.js ist die schnelle JavaScript-Engine V8 von Google, die den JavaScript-Code vor dem Ausführen in Maschinencode übersetzt.
Modular erweiterbar und mit schlankem Kern, kommt es ohne weitere externe Abhängigkeiten aus – nur Python >= 2.5 wird benötigt.
Besonderheit von node.js ist die ereignisgesteuerte Architektur. Standardmäßig blockieren Ein- und Ausgabeoperationen (zum Beispiel Datenbankzugriffe) den Programmablauf. Im Gegensatz zur herkömmlichen Methode (Threading) und dem damit verbundenen Umgang mit Thread-Sicherheit (Locking, Race Conditions), setzt es auf “non-blocking I/O”.
Das heißt, dass alle Funktionen, die in anderen Umgebungen blockieren würden, Rückruffunktionen (Callback) als Parameter erwarten, die erst dann aufgerufen werden, wenn die Operation im Hintergrund ausgeführt wurde.
Los geht’s
Die Installation gestaltet sich recht einfach

# wget http://nodejs.org/dist/v0.6.8/node-v0.6.8.tar.gz
# tar xzf node-v0.6.8.tar.gz
# cd node-v0.6.8
# ./configure
# make
# make install

Neben node, wurde auch der Node Package Manager installiert. Den benutzen wir, um das benötigte Modul node-canvas zu installieren

# npm install node-canvas

Ein Rechteck
Folgender Code zeigt beispielhaft die Benutzung des Core-Moduls fs und des kürzlich installierten canvas


var Canvas = require('canvas'),
    canvas = new Canvas(150, 150),
    ctx = canvas.getContext('2d'),
    fs = require('fs'); // File I/O
ctx.fillStyle = '#00F';
ctx.fillRect(0, 0, 150, 150);
var out = fs.createWriteStream(__dirname + '/rectangle.png'),
    stream = canvas.createPNGStream();
stream.on('data', function(data){
  out.write(data);
});

Rufen wir das Skript nun mit dem node-Binary auf, so erstellt es uns ein blaues Rechteck mit dem Namen rectangle.png

# node png.js

Weitere Informationen findet man auf der Website der Entwickler.

Eric Lippmann
Eric Lippmann
Lead Senior Developer

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er sich für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.