David Novella

Eine statische Website, gemacht mit Swift

Obwohl es Hugo, Eleventy, Astro und ein Dutzend weitere gut gepflegte Generatoren für statische Websites gibt, habe ich diese Seite mit Publish von John Sundell gebaut. Das ist eine diskutable Entscheidung, also erkläre ich sie.

Der Grund, abgesehen davon, nichts mit WordPress machen zu wollen

Publish lässt mich die Website als Struct definieren:

struct DavidNovella: Website {
    enum SectionID: String, WebsiteSectionID {
        case apps
        case blog
    }

    var url = URL(string: "https://davidnovella.es")!
    var name = "David Novella"
    var language: Language { .spanish }
}

Und das Theme als Funktionen, die HTML zurückgeben, mit dem Compiler als Aufpasser:

func makeItemHTML(for item: Item<Site>,
                  context: PublishingContext<Site>) throws -> HTML {
    HTML(
        .lang(context.site.language),
        .head(for: item, on: context.site),
        .body {
            SiteHeader(currentPath: item.path)
            Wrapper {
                H1(item.title)
                Div(item.body).class("content")
            }
        }
    )
}

Keine Templates mit doppelten geschweiften Klammern und keine Fehler, die erst beim Generieren auftauchen. Wenn ich mir ein Metadatenfeld ausdenke, kompiliert es nicht. Es fühlt sich an wie die Arbeit mit SwiftUI, angewandt auf HTML.

Die Nachteile

Man sollte sie nennen:

  • Publish wird seit einer Weile nicht aktualisiert. Die letzte getaggte Version ist 0.9.0. Sie kompiliert problemlos mit Swift 6.4, aber Korrekturen sind nicht zu erwarten.
  • Die Community ist klein. Verglichen mit Hugo ist hier wenig geschrieben und es gibt wenige Themes zum Abschauen.
  • Das Plugin-Ökosystem ist minimal. Was Sie brauchen, müssen Sie wahrscheinlich selbst schreiben — wobei ein PublishingStep erstaunlich wenig Code ist.

Fazit

Als Übung, eine Website zu bauen, die ich mit wenig Aufwand pflegen kann, halte ich das für einen guten Anfang. Später sehe ich, ob ich zu einem anderen Generator wechseln muss oder Publish forke und ein paar Dinge ändere.