Build-time minification, image optimization, htmx SPA navigation, and local htmx bundle
This commit is contained in:
parent
50a5ca2c71
commit
b95d5c2ee5
13 changed files with 186 additions and 115 deletions
60
main.go
60
main.go
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue