Node.js ist ein serverseitiges Framework zum Erstellen von Server- und Konsolenanwendungen mit JavaScript. Es setzt mit der JavaScript-Engine V8 von Google eine sehr schnelle JavaScript-Implementierung ein.

zx - Ein Werkzeug für einfachere Konsolen-Scripte in Node.js

Bash-Scripte sind schnell geschrieben, allerdings erschwert die gewöhnungsbedürftige Syntax es, komplexere Skripte zu schreiben. JavaScript ist eigentlich eine perfekte, um Scripte zu schreiben (was das Script im Namen ja bereits andeutet), aber die Verwendung der Node.js-Standardbibliothek ist leider nicht intuitiv. Das zx-Paket, das als Open-Source von Google bereitgestellt wird, stellt nützliche Wrapper für child_process bereit und liefert darüber hinaus einiges an sinvollen Funktionen.

zx kann über npm i -g zx global installiert werden, einzige Vorausetztung ist ein installiertes Node/NPM.

Hier ein einfaches Beispiel-Script:

#!/usr/bin/env zx
await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
    $`sleep 1; echo 1`,
    $`sleep 2; echo 2`,
    $`sleep 3; echo 3`,
])

let name = 'foo bar'
await $`mkdir /tmp/${name}`

Es werden folgende Befehle bereitgestellt:
  • $ - Führt angegbenen Befehl über spawn aus
  • cd()
  • fetch()
  • question()
  • sleep() 
  • echo()
  • stdin()
  • within()
  • retry()
  • spinner()- Rendert einen Spinner/Ladeanimation auf der Konsole
  • chalk - Ermöglicht farbige Ausgaben auf der Konsole
  • fs 
  • os 
  • path 
  • glob
  • yaml - Ermöglicht das einlesen von YAML
  • minimist - Einfaches parsen von Argumenten
  • which 
  • filename 
  • dirname 
  • require()

Mehr zu zx unter github.com/google/zx

Pkg – Node.js Kommandozeilenprogramme einfach verteilen

Lange war es umständlich ein in Node.js geschriebenes Script an nicht Node.js-Entwickler weiterzugeben, da auf dem System des Nutzers eine Node.js-Runtime vorhanden sein musste. Das ist außerhalb des Node.js Umfelds fast nie der Fall. Selbst unter Linux gehört Node.js nicht zur Standartinstallation. Mit dem Pkg-Tool von "Zeit" ist es aber inzwischen ein leichtes Scripte als ausführbare Programme zu packen.

Die Installation von Pkg ist mit einem Befehl erledigt.

npm install -g pkg

Danach kann ein beliebiges Node.js-Script über das Kommando:

pkg <filename>.js 

in ein Executable gepackt werden. Beim ersten verwenden von Pkg lädt das Tool automatisch die benötigen Node.js-Runtimes herunter:

$ pkg index.js
> pkg@4.4.9
> Targets not specified. Assuming:
  node12-linux-x64, node12-macos-x64, node12-win-x64
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v12.18.1-linux-x64   [====================] 100%
  fetched-v12.18.1-win-x64     [====================] 100%
  fetched-v12.18.1-macos-x64   [====================] 100%

Bei einem erneuten Aufruf werden automatisch gecachte Node.js-Runtimes verwendet so das das Paketieren viel schneller durchgeführt wird. Ohne Angabe von Parametern werden automatisch Executables für Windows, MacOS und Linux erstellt. Über zusätzlichen Parameter kann genau spezifiziert werden welche Node.js-Version verwendet und für welche Systeme ein Executable erstellt werden soll. Leider sind die erstellten Executables sehr groß. Für die Version 12 von Node.js bei einem einfachen "Hello World"-Programm mit ca. 40 MB zu rechnen. Durch einfaches zippen kann die Größe auf ca. 12 MB reduziert werden. Die Großen Executables sind der Funktionsweise von Pkg geschuldet: Scripte werden mit einer Runtime zusammen in eine Executable gepackt und nicht etwa kompiliert. Dies ist bei interpretierten Scriptsprachen nicht vorgesehen. Dennoch ist Pkg ein interessantes Tool wenn man mal schnell ein "kleines" Script weitergeben möchte.

Cylon.js - Javascript für das internet der Dinge

Bei Cylon.js handelt es sich um ein Node-Modul, es ermöglicht den einfachen Zugriff auf viele unterschiedliche Hardwareplatformen (momentan 43). Dabei wird der eigentliche JavaScript-Code entweder auf einem PC ausgeführt wodurch z.B einen Arduino nicht mehr autark ist, oder kann bei leistungsfähiger Hardware wie z.B einem Rasspery Pi direkt auf dem System ausgeführt werden. Bei der Verwendung von Hardware die nicht in der Lage ist den Node.js Code selbstständig auszuführen werden die verarbeiteten Befehle über unterschiedliche Protokolle an das Board geschickt und dort dann ausgeführt. Mit dem Arduino erfolgt die Datenübertragung per Firmata Protokoll, dafür muss ein spezielles Image auf den Arduino geflasht werden. Neben Firmata werden je nach Platform auch noch andere Protokolle unterstützt.

Eine Tutorial über die Verwendung von Cylon.js findet ihr z.B. hier.

Mit Johnny-Five existiert noch eine zweites Node-Modul welches einen ähnlichen Funktionsumfang bietet.

Apache Proxy für Node.js einrichten

Will man auf einem Rootserver parallel einen Apache und einen Node.js Server betreiben hat man das Problem das beide nicht einfach auf dem selben Port laufen können. Zwar ist es theoretisch möglich Node.js oder Apache auf unterschiedlichen Ports laufen zu lassen. Allerdings ist das bei Webserver unüblich und kann zu Problemen führen wenn bei einigen Benutzern nur der Port 80 in der Firewall geöffnet ist.  Auch ist es damit nicht möglich nur eine bestimmte Subdomain unter Node.js zu betreiben.

In der folgenden Anleitung wird beschrieben wie man eine Subdomain unter Apache an einen Node.js Server weiterleitet, alles wurde unter Ubuntu erfolgreich getestet. Die hier vorgestellte Lösung ist performance-technisch nicht optimal aber einfach umzusetzen.

Hier der verwendete minimale Node.js Server:

var http = require("http");
var s = http.createServer(function(req,res){
  res.writeHead(200, {'content-type': 'text/plain'});
  res.end("Node working on 8080"); 
});
s.listen(8080); 
console.log("Server running...") 

Für den Apache müssen über zwei zusätzliche Module installiert werden: sudo apt-get install libapache2-mod-proxy-html Danach müssen die beiden Module über  sudo a2enmod proxy_http
sudo a2enmod proxy
aktiviert werden. Die Virtualhost-Datei muss wie folgt aufgebaut sein:

<VirtualHost *:80>
   ServerName tour.ragersweb.de
   ServerAdmin webmaster@ragersweb.de 

   ProxyRequests On
   <Proxy *>
    Order deny,allow
    Allow from localhost
   </Proxy>
   ProxyPass / http://localhost:8080
   ProxyPassReverse / http://localhost:8080 
</VirtualHost>

In diesem Beispiel werden alle Anfragen an die Subdomain bps.ragersweb.de an den unter Port 8080 laufenden Node.js Server weiterleitet.

Websites mit Node.js

Das Entwickeln von Webanwendungen mit Node.js unterscheidet sich Grundlegend von der Herangehensweise in PHP. Wo PHP eine sehr umfangreiche Standartbibliothek bietet ist die von Node.js auf das wichtigste reduziert.

Um Node.js zu erweitern stehen zahlreiche Module zur Verfügung. Module können über die Paketverwaltung NPM installiert werden. Inzwischen ist NPM standardmäßig in der Node.js Installation enthalten.

Nachfolgend einige wichtige Module die für Standardwebanwendungen hilfreich sind:

  • Express
    Webframework welches die Arbeit mit Node.js extrem erleichtert
  • Swig
    Templateengine für express, benötigt Consolidate um zu funktionieren
  • Xml2js
    Einfacher Wrapper wandelt XML in JSON um und ermöglicht so direkten Zugriff. Funktioniert unter Linux und Windows
  • Eyes
    Bringt Farbe in die Console
  • MongoJs
    Datenbanktreiber für MongoDb
  • Prompt
    Nimmt Eingaben von der Commandline entgegen
  • Cheerio
    jQuery Implementierung für Node.js ermöglicht den Zugriff auf das DOM über die bekannten jQuery Selektoren
  • Request
    einfacheres Screen-Scraping für Node.js, funktioniert auch unter Windows