Build-time minification, image optimization, htmx SPA navigation, and local htmx bundle

This commit is contained in:
bronku 2026-06-10 16:15:42 +02:00
parent 50a5ca2c71
commit b95d5c2ee5
13 changed files with 186 additions and 115 deletions

60
main.go
View file

@ -3,6 +3,7 @@ package main
//go:generate go tool templ generate templates
import (
"bytes"
"context"
"fmt"
"io"
@ -15,20 +16,57 @@ import (
"piekarnikgosi/utils"
"sort"
"strings"
"sync"
"github.com/tdewolff/minify/v2"
mcss "github.com/tdewolff/minify/v2/css"
mhtml "github.com/tdewolff/minify/v2/html"
mjs "github.com/tdewolff/minify/v2/js"
)
type ComponentRenderer interface {
Render(ctx context.Context, w io.Writer) error
}
func saveFile(name string, comp ComponentRenderer) {
file, err := os.Create("www/" + name + ".html")
var minifier = sync.OnceValue(func() *minify.M {
m := minify.New()
m.Add("text/html", &mhtml.Minifier{
KeepDocumentTags: true,
KeepEndTags: true,
})
m.Add("text/css", &mcss.Minifier{})
m.Add("application/javascript", &mjs.Minifier{})
return m
})
func minifyFile(path, mediatype string) {
data, err := os.ReadFile(path)
if err != nil {
log.Fatal(err)
}
defer file.Close()
err = os.WriteFile(path, minifyData(mediatype, data), 0666)
if err != nil {
log.Fatal(err)
}
}
err = comp.Render(context.Background(), file)
func minifyData(mediatype string, data []byte) []byte {
b, err := minifier().Bytes(mediatype, data)
if err != nil {
log.Fatal(err)
}
return b
}
func saveFile(name string, comp ComponentRenderer) {
var buf bytes.Buffer
err := comp.Render(context.Background(), &buf)
if err != nil {
log.Fatal(err)
}
minified := minifyData("text/html", buf.Bytes())
err = os.WriteFile("www/"+name+".html", minified, 0666)
if err != nil {
log.Fatal(err)
}
@ -117,7 +155,8 @@ func mergeStyles() {
bundledCSS = append(bundledCSS, '\n')
}
err := os.WriteFile("www/style.css", bundledCSS, 0666)
minified := minifyData("text/css", bundledCSS)
err := os.WriteFile("www/style.css", minified, 0666)
if err != nil {
log.Fatal(err)
}
@ -125,9 +164,12 @@ func mergeStyles() {
func ensureDir() {
log.Println("creating directories")
err := os.MkdirAll("www/images", 0777)
if err != nil {
log.Fatal(err)
os.MkdirAll("www/images", 0777)
entries, _ := os.ReadDir("www")
for _, e := range entries {
if !e.IsDir() && filepath.Ext(e.Name()) == ".html" {
os.Remove("www/" + e.Name())
}
}
}
@ -145,6 +187,8 @@ func main() {
mustCopy("img/favicon.avif", "www/images/favicon.avif")
mustCopy("img/logo.svg", "www/images/logo.svg")
mustCopy("js/portfolio.js", "www/portfolio.js")
minifyFile("www/portfolio.js", "application/javascript")
mustCopy("js/htmx.min.js", "www/htmx.min.js")
if len(os.Args) > 1 {
return
}