Hinter den Kulissen

7 Minuten zum lesen

Wie bereits im letzten Blogbeitrag angekündigt, geht es heute darum, wie wir die neue Website von Isatis Web & Media technisch umgesetzt haben.

Die Grundlage bilden der Static Site Generator Jekyll mit dem Theme Minimal Mistakes. Jekyll ist in der Programmiersprache Ruby entwickelt. Die muss also auf dem Rechner, auf dem die Website gebaut werden soll, verfügbar sein. Auf dem Webserver, der das Endprodukt dann ausliefern soll, ist Ruby dagegen nicht notwendig. Es handelt sich ja um eine statische Website, deren HTML, CSS, JavaScript und so fort als “gewöhnliche” Dateien vorliegen. Wie man Ruby installiert, geht über den Rahmen dieses Blogbeitrags hinaus. Wir gehen also hier davon aus, dass Ruby zur Verfügung steht. Benötigt wird außerdem das im Ruby-Bereich weit verbreitete Tool Bundler.

Jekyll wird als Ruby-Gem installiert, beispielsweise mit gem install jekyll. Dann steht auf der Kommandozeile der neue Befehl jekyll zur Verfügung, mit dem man eine neue Website erzeugen kann. Die kann man dann nach und nach anpassen, wie man es haben möchte.

jekyll new legt die neue Website als Unterverzeichnis im aktuellen Verzeichnis an. Mit dem Kommando

jekyll new meine_neue_website

wird also ein neues Unterverzeichnis meine_neue_website erzeugt, was die initialen Dateien für die Website enthält. Der hier verwendete Name muss übrigens nicht dem späteren Namen der Website, wie er beispielsweise im title -Tag in HTML erscheint, entsprechen. Es ist aber erfahrungsgemäß eine gute Idee, einen “sprechenden Namen” zu verwenden, und sei es nur, damit man die Dateien später einmal auch wiederfindet.

Unter den erzeugten Dateien sind zunächst die zentrale Konfigurationsdatei _config.yml (man beachte den Unterstrich am Beginn, der wird uns noch häufiger begegnen) und das Unterverzeichnis _posts wichtig. Das Theme Minimal Mistakes wird als Gem installiert und dafür im Gemfile ergänzt. Das Theme benötigt außerdem das Jekyll-Plugin jekyll-include-cache. Dieses Plugin dient vereinfacht gesagt dazu, die Auswertungsergebnisse (das Rendering) von bestimmten Templates zwischenzuspeichern, damit sie nicht wiederholt gerendert werden müssen. Wir ergänzen das Gemfile also um die beiden Gems, die wir integrieren wollen:

gem 'minimal-mistakes-jekyll'
gem 'jekyll-include-cache'

und aktualisieren das Bundle mit bundle update auf der Kommandozeile. Nun wird das eben installierte Theme in der _config.yml eingetragen, damit Jekyll es verwendet. Dort ist standardmäßig das Theme Minima eingestellt.

# von
theme: minima
# ändern in
theme: minimal-mistakes-jekyll

Ebenfalls in der _config.yml muss noch jekyll-include-cache in der Plugin-Liste ergänzt werden, zum standardmäßig bereits vorhandenen jekyll-feed:

plugins:
  - jekyll-feed
  - jekyll-include-cache

Jetzt wird noch eine auf die Dauer nervige Deprecation-Meldung von Sass unterdrückt. Es würde hier zu weit führen, die Hintergründe im Detail zu erklären, aber so viel sei gesagt: Minimal Mistakes verwendet in seinen Stylesheets eine inzwischen nicht mehr unterstützte Syntax, die von neueren Versionen des CSS-Präprozessors Sass bemängelt wird. Die Verantwortlichen für Minimal Mistakes sind zögerlich dabei, die problematische Syntax einfach auf den aktuellen Stand zu bringen, weil dann das Theme nicht mehr mit einem bestimmten Setup bei GitHub Pages funktionieren würde, wo eine sehr alte Version von Jekyll verwendet wird. Das würde bedeuten, dass vermutlich tausende Websites plötzlich nicht mehr funktionieren würden. Dieses Problem betrifft eine ganze Reihe von Themes aus dem Jekyll-Ökosystem.

Um die Meldung auszublenden, ergänzt man die bereits bekannte Datei _config.yml um die entsprechende Konfiguration:

sass:
  quiet_deps: true

Nun wird noch die von jekyll new erzeugte Datei about.markdown entfernt. Wenn eine “Über uns”-Seite benötigt wird, kann man die einfach später an anderer Stelle anlegen.

Beim Erzeugen der Website hat jekyll new auch einen Beispiel-Blogeintrag angelegt, den man im Unterverzeichnis _posts findet. Der genaue Dateiname richtet sich danach, wann die Website erzeugt wurde, denn im Dateinamen eines Blogbeitrags in Jekyll ist das Datum enthalten. Der Blogbeitrag kann also beispielsweise in der Datei 2023-11-23-welcome-to-jekyll.markdown enthalten sein. In dieser Datei müssen wir noch das Layout post auf das von Minimal Mistakes unterstützte single ändern:

# von
layout: post
# ändern in
layout: single

Jetzt gilt es noch, zwei Verzeichnisse anzulegen, die typischerweise im Verlauf der Arbeit an der Seite mit Inhalt gefüllt werden: _pages , im Hauptverzeichnis der Seite auf derselben Ebene wie _posts, enthält die Seiten der Website. Das ist vereinfacht gesagt alles was kein Blogbeitrag ist, wie zum Beispiel die oben erwähnte “Über uns”-Seite. Jede Seite wird dort als eine eigene Markdown- oder HTML-Datei angelegt.

Für Assets, also Dinge wie Bilder, CSS-Dateien, JavaScript-Dateien und so fort, hat sich ein eigenes Verzeichnis assets ebenfalls im Hauptverzeichnis bewährt.

Jetzt bekommen wir zum ersten Mal das Ergebnis unserer bisherigen Arbeit zu Gesicht: Mit bundle exec jekyll server --livereload startet man den Entwicklungs-Server von Jekyll, der den aktuellen Stand der Seite auf localhost, Port 4000 anbietet. Wenn wir also im Webbrowser unserer Wahl die Adresse http://localhost:4000 aufrufen, können wir den aktuellen Stand der Website bewundern.

Die Option --livereload sorgt dabei dafür, dass bei Änderungen an den Dateien die Website im Browser automatisch neu geladen wird. Dabei gibt es allerdings eine Ausnahme: Änderungen an der bereits hinlänglich bekannten _config.yml werden vom Live Reload nicht erkannt. Hier muss der Server mit STRG-C beendet und anschließend mit dem oben genannten Kommando neu gestartet werden.

In der _config.yml geht es auch weiter, weil hier noch einige der vorgegebenen Standardwerte angepasst werden müssen. Bei den entsprechenden Schlüsseln können wir den Titel der Website angeben, wie er im Browser erscheint (Schlüssel title), die Emai-Adresse des Verantwortlichen (email), eine Beschreibung der Seite (description) und so fort. Die in der Konfigurationsdatei bereits vorhandenen Schlüssel sind weitgehend selbsterklärend. Zusätzlich bietet Minimal Mistakes die Möglichkeit, den Namen des (Haupt-)Autoren und eine Logografik festzulegen:

name: Max Mustermann
logo: /assets/images/logo.svg

Für das Favicon können wir den HTML-head erweitern. Dazu legen wir auf der Hauptebene der Website das Verzeichnis _includes an, darin wiederum das Unterverzeichnis head, und darin wiederum die Datei custom.html. Diese Datei enthält alle HTML-Tags, die in den head eingebunden werden sollen, zum Beispiel

<link rel="icon" href="/assets/images/favicon.svg" type="image/svg+xml">

In dieser Datei können auch weitere HTML-Fragmente eingefügt werden, die man im head braucht, etwa Angaben für soziale Netzwerke wie Facebook, wie Links zu dieser Website dargestellt werden sollen (Stichwort beispielsweise Open Graph).

Als nächstes werden die Einträge für die Hauptnavigation im Header der Website definiert. Dazu muss auf der Hauptebene das Unterverzeichnis ` _data angelegt werden, sowie darin die Datei navigation.yml`. In dieser YAML-Datei können wir die Menupunkte definieren:

main:
  - title: "Über uns"
    description: "Wer wir sind und was wir machen"
    url: /about
  - title: "Kontakt & Impressum"
    description: "Wie man uns erreicht und die Formalitäten"
    url: /contact

Minimal Mistakes bietet an, im Footer der Website externe Profile, etwa bei sozialen Medien, zu verlinken. Ein Link auf den RSS-Feed der Website unter /feed.xml ist bereits automatisch gesetzt. Die Links verwenden Symbole aus Font Awesome. Definiert werden die Links in der _config.yml:

footer:
  links:
    - label: "Mastodon"
      icon: "fab fa-fw fa-mastodon"
      url: "https://..."
    - label: "Codeberg"
      icon: "fab fa-fw fa-codeberg"
      url: "https://..."

Damit steht bereits ein großer Teil des “Rahmens” der Website, so dass wir uns jetzt dem eigentlichen Inhalt zuwenden können. Für die verschiedenen Seiten haben wir weiter oben ja schon das Verzeichnis _pages angelegt. Damit Jekyll die Dateien darin erkennt, müssen wir das Verzeichnis noch in der _config.yml einbinden, und zwar im Schlüssel include:

include:
  - _pages

Die einzelnen Seiten, also beispielsweise “Über uns”, “Kontakt” oder “Unsere Produkte”, entsprechen jeweils einer Datei in _pages. Das kann eine HTML-Datei oder eine Markdown-Datei sein. In beiden Fällen steht am Beginn ein sogenanntes Frontmatter. Darin sind Meta-Angaben zur Seite enthalten wie etwa der Titel oder das Datum der letzten Änderung. Das kann dann beispielsweise so aussehen, in einer about.md im Markdown-Format:

---
title: "&Uuml;ber uns"
permalink: /about
description: "Wer wir sind und wie wir es wurden"
date: 2023-11-17 15:41:00 +0200
last_modified_at: 2023-11-17 15:41:00 +0200
---

# Über uns

Alles begann an einem sonnigen Tag im Jahr 2002.

oder in einer products.html im HTML-Format:

---
title: "Unsere Produkte"
permalink: /products
description: "Was wir für Sie tun k&ouml;nnen"
date: 2023-11-17 15:41:00 +0200
last_modified_at: 2023-11-17 15:41:00 +0200
---

<h3>Unsere Produkte</h3>

<p>Bei uns finden Sie ein umfangreiches Angebot rund um...

Es mag auf den ersten Blick ungewohnt erscheinen, ein Frontmatter in eine HTML-Datei einzubinden, aber das ist korrekt so.

Der Schlüssel permalink gibt an, unter welchem Pfad die Seite erreichbar sein soll, relativ zur Domain. Wenn wir beispielsweise https://meine-website.tld/ bauen, entspricht ein Permalink /about demnach https://meine-website.tld/about.

Nach dem gleichen Prinzip können übrigens im Verzeichnis _posts Blogbeiträge erstellt werden.

Damit haben wir bereits einen großen Teil der Website behandelt. Natürlich bleibt noch einiges an “Feinschliff” zu tun, wie beispielsweise die Auswahl der Layouts für die einzelnen Seiten, die Verwendung von Helpern für Feature Rows oder Gallerien, die Archiv-Seiten für den Blog und so fort. Das würde aber den Rahmen dieser Übersicht sprengen. Mit dieser kurzen Einführung sollten Interessierte auf einem guten Weg sein, eine ansprechende Website mit Jekyll und Minimal Mistakes auf die Beine zu stellen. Allen anderen hoffen wir, einen interessanten kleinen Einblick darin gegeben zu haben, wie diese Website entwickelt wurde.