Routing per host bovenop net/http: routegroepen, middleware, benoemde routes, gemounte routers en not-found-pagina's, met middleware voor logging, security-headers, compressie en output caching.
go-webthings is een familie van gerichte pakketten voor Go-applicaties die hun pagina's op de server opbouwen en toch vlot aanvoelen. De stukken blijven klein: routing is routing, wat een template nodig heeft staat beschreven, en partial rendering is expliciet.
Je werkt met gewone net/http en gewone html/template-bestanden, en krijgt updates die goed met HTMX samengaan, zonder dat de browser de hoofdapplicatie wordt.
go-router routeert het verzoek, go-clue beschrijft wat een template verwacht, en go-partial rendert een hele pagina of alleen een HTMX-fragment.
Routing per host bovenop net/http: routegroepen, middleware, benoemde routes, gemounte routers en not-found-pagina's, met middleware voor logging, security-headers, compressie en output caching.
Getypeerde contracten en editor-metadata voor html/template-bestanden. Templates blijven gewoon templates, maar je editor kan aanvullen, navigeren en fouten in modeltoegang aanwijzen.
Rendert hele pagina's of alleen het stuk dat nodig is uit dezelfde templates: gerichte HTMX-updates, out-of-band swaps, selecties, acties en herbruikbare regio's, zonder van HTML een componentendialect te maken.
Formulieren, vertalingen en het klaarzetten van assets werken op dezelfde manier: expliciete Go-types en HTML voorop. Elk pakket is ook los te gebruiken.
Getypeerde HTML-formulieren uit struct-tags, met het inlezen van inzendingen, veldvalidatie, instelbare thema's, request-metadata en CSRF-bescherming.
Zet vaste versies van JavaScript- en CSS-pakketten tijdens de build klaar met een lockfile, bedt ze in, serveert ze met versie-URL's en Subresource Integrity, en maakt import maps en stylesheet-tags voor je templates.
Gettext-PO-catalogi met een taal per request, meervoudsvormen, vertaalcontexten en het extraheren van letterlijke sleutels uit Go-templates.
De Go-bibliotheek go-webthings draait de backend van een website, gebouwd uit deze pakketten. Je site is een klein Go-programma: jij brengt de templates en kiest de modules. Het resultaat is één binary, die op SQLite draait zonder andere dienst, of op PostgreSQL of MySQL.
app := webthings.New(webthings.Config{
Name: "My site",
Locales: locales.Config{
Default: "en",
Enabled: []string{"en", "nl"},
},
Templates: os.DirFS("templates"),
})
err := app.Use(
publishing.Module("news", "News"),
events.Module("agenda", "Agenda"),
)
if err != nil {
log.Fatal(err)
}
err = app.ListenAndServe(ctx, ":8080")
Een module voeg je toe met één regel: haar admin-secties, pagina's, templatefuncties en databasetabellen komen mee. De meegeleverde modules gebruiken alleen de publieke API, dus een eigen module kan alles wat zij ook kunnen.