Bread

by Paul Vorbach, 2012-03-07

In diesem Artikel will ich Bread und was dazugehört auf technischer Ebene erläutern.

Statisches HTML

Prinzipiell war ja die Idee von ben_ nicht schlecht, direkt statische HTML-Dateien zu schreiben. Ich habe das vor zirka einem Jahr schon mit Yuki versucht, aber kaum zwei Wochen durchgehalten. Das Problem war, dass ich zunächst sowohl den Blog-Index als auch den Feed von Hand schreiben musste. Das macht einfach keinen Spaß und ich bewundere ben_ dafür, dass er das über ein Jahr so durchgehalten hat. (Auch wenn bei ihm zumindest der Feed automatisch generiert wurde.)

Markdown

Was das Schreiben angeht, habe ich mich dann für Konstantins Ansatz mit Markdown als Markup-Sprache entschieden. Markdown finde ich ganz vorzüglich zum Schreiben von allen möglichen Texten, weil es dem Schreiben nicht im Weg steht. Das scheinen in den letzten Jahren auch einige andere bemerkt zu haben und so ist Markdown an allen möglichen Ecken zu finden.

Umsetzung

Ich habe Bread für Node.js geschrieben. Das hat mehrere Gründe:

  1. Node.js hat ein paar interessante Konzepte, die mir sofort eingeleuchtet haben, und die wirklich Sinn ergeben. Dazu vielleicht an anderer Stelle mehr.
  2. Node.js ist eine sehr schlanke Plattform. Da JavaScript einen kleinen Sprachkern hat, gibt es kaum unnötigen Balast.
  3. Node.js hat ein sehr komfortables Modulsystem. Für viele Dinge gibt es schon fertige Module, die einfach installiert und verwendet werden können. Außerdem kann man in JavaScript auf sehr einfache Weise sehr modular programmieren.
  4. Ich finde PHP auf Dauer ziemlich langweilig. Es ist auch immer nützlich, neues zu lernen.

Da es sich anbietet, JavaScript-Programme modular zu schreiben, besteht Bread selbst aus einigen kleineren Modulen:

Das alles lässt sich mit dem Node package manager prima so zusammenklöppeln, dass man nur noch Node.js und MongoDB und installiert zu haben braucht. Dann kann man bread und alles was dazu gehört ganz bequem per Kommandozeile mit npm install -g bread installieren.

Anschließend braucht man nur noch in das Verzeichnis zu wechseln, das die Texte enthält und dann bread zu starten. Das Programm holt sich die benötigten Informationen zur Konfiguration aus dem Verzeichnis .conf/ und legt sofort mit dem Übersetzen los.

Hier mal beispielhaft, wie so ein Aufruf dann konkret ausschaut:

$ bread
Beginning to bake c:\Dev\Src\web\vorb.de\public.
  * c:\Dev\Src\web\vorb.de\public\info\contact.html written.
  * c:\Dev\Src\web\vorb.de\public\info\markdown.de.html written.
  * c:\Dev\Src\web\vorb.de\public\log\blogroll.html written.
  * c:\Dev\Src\web\vorb.de\public\license\mit.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\02\node-and-npm-on-debian.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\03\was-lange-waehrt.html written.
  * c:\Dev\Src\web\vorb.de\public\info\index.html written.
  * c:\Dev\Src\web\vorb.de\public\info\markdown.en.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\02\beginning.html written.
  * c:\Dev\Src\web\vorb.de\public\log\subscription.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\03\bread.html written.
Content files written.
Beginning to write index and tag files.
  * c:\Dev\Src\web\vorb.de\public\log\tag\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\feed.xml written.
  * c:\Dev\Src\web\vorb.de\public\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\linux.html written.
Tag files written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\weblog.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\misc.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\html.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\markdown.html written.
  * c:\Dev\Src\web\vorb.de\public\log\index.html written.
Index files written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\dev.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\cms.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2011\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\03\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2011\09\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\2012\02\index.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\deutsch.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\nodejs.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\bread.html written.
  * c:\Dev\Src\web\vorb.de\public\log\tag\english.html written.
Autoindex files written.
ok

Vor- und Nachteile

Natürlich bringt das System seine Vor- und Nachteile mit sich.

Vorteile

Komfort:
Neue Artikel lassen sich einfach und schnell schreiben. Markdown eignet sich hervorragend genau für diesen Zweck.
Standortunabhängigkeit:

Die HTML-Dateien lassen sich eins zu eins auf einen beliebigen Webserver übertragen. Damit kann man das Blog dann auf jedem Billig-Hoster veröffentlichen, solange dieser einen FTP-Zugang anbietet. Außerdem lassen sich, wie ben_ schon vor einer Ewigkeit erkannt hat, alle Dateien prima mit Git sichern und versionieren.

Dass Node.js und MongoDB benötigt werden ist hierfür kein Problem. Die Website kann (und das wird von mir auch so betrieben) komplett auf dem Client generiert werden. Es reicht, die Resultate per FTP auf den Server zu schieben. Die MongoDB wird sowieso mit jedem Aufruf neugestartet und wird somit auch nicht auf dem Server benötigt.

Editor der Wahl:

Web-Editoren sind Mist. Viel komfortabler lassen sich Texte mit den Tools schreiben, die man bei sich auf dem Rechner laufen lassen kann.

Da mir leider der iAwriter wegen mangelnder Unterstützung für Windows noch verwehrt bleibt, kommt aktuell Vim zum Einsatz. Damit und mit der Kommandozeile lässt sich sehr komfortabel und schnell arbeiten.

Nachteile

Nachteile sehe ich im Moment in folgenden Bereichen:

Datenbank:
Die Tatsache, dass ich eine Datenbank brauche, um die Inhalte so zu generieren wie ich sie brauche, stört mich. Das muss auch besser und einfacher gehen. Der Einsatz von MongoDB ist eher eine Notlösung.
Langer Übersetzungsprozess:
Noch läuft der gesamte Übersetzungsprozess innerhalb von – mal schnell ausprobieren – weniger als zwei Sekunden ab. Fraglich ist jedoch, wie das aussieht, wenn ich erst mal mehrere hundert oder gar tausend Artikel geschrieben habe, sieht das aber anders aus. Dafür muss ich mir noch eine Lösung einfallen lassen.
Komplexität:

Die vielen Module (und ich habe noch ein paar wichtige ausgelassen) führen zwangsläufig zu einer selbst erschaffenen Komplexität. Teilweise ist auch der Code selbst etwas kompliziert geworden, woran Node.js mit schuld ist. Da in Node.js sämtliche I/O asynchron abläuft, benötigt man viele Closures, was schon mal zu sechs Schachtelungsebenen führen kann. Das ist suboptimal und für Laien schlecht zu verstehen.

Da ich das meiste aber selbst geschrieben habe, komme ich recht gut mit dieser Komplexität klar. Schön wäre aber, wenn ich da in Zukunft einiges vereinfachen könnte.

Was noch kommt

Ein paar Sachen habe ich vorerst noch nicht beschrieben:

Das soll aber nicht lange so bleiben. Wer nicht warten kann, kann sich auch gerne das Repository zu dieser Website auf Github anschauen.

Standing on the shoulders of giants

Wie der Blogracer steht auch Bread auf den Schultern von Giganten. Ich möchte mich bei ben_, Konstantin und Maurice sowie allen Kommentatoren auf den jeweiligen Blogs bedanken, die einige wertvolle Gedanken zu diesem Thema zusammengetragen haben.

Wer sich für die Hintergründe interessiert, wird unter anderem hier fündig:

So, jetzt muss ich mich aber mal zügeln. Das mag ja sonst keiner mehr lesen. Ich freue mich schon auf die Diskussion. Was meint ihr dazu?