Files
seaweedfs/weed/admin/gen_static_gz.go
T
Chris LuandGitHub e56a1c4c05 admin: pre-gzip embedded static assets, add cache headers (#9918)
The admin UI served embedded static files uncompressed and without
cache headers: embed.FS has zero mod times, so no Last-Modified, no
ETag, no 304s -- every page load re-downloaded ~700KB of css/js in
full, which gets painful over slow or tunneled links.

Gzip the static tree at generation time (go generate ./weed/admin)
and embed only the compressed mirror, shrinking the binary ~1.5MB.
The handler hands the pre-compressed bytes to gzip-capable clients,
decompresses for the rest, and sets Cache-Control, per-variant
content-hash ETags and Vary so repeat loads revalidate with a 304.
bootstrap.min.css goes 232KB -> 30KB on the wire.

A drift test keeps static_gz/ in sync with static/.
2026-06-10 12:54:36 -07:00

59 lines
1.1 KiB
Go

//go:build ignore
// Regenerates static_gz/, the gzipped mirror of static/ that is embedded
// into the binary. Run after changing anything under static/:
//
// go generate ./weed/admin
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io/fs"
"os"
"path/filepath"
)
func main() {
if err := run(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func run() error {
if err := os.RemoveAll("static_gz"); err != nil {
return err
}
return filepath.WalkDir("static", func(p string, d fs.DirEntry, err error) error {
if err != nil || d.IsDir() {
return err
}
data, err := os.ReadFile(p)
if err != nil {
return err
}
var buf bytes.Buffer
zw, err := gzip.NewWriterLevel(&buf, gzip.BestCompression)
if err != nil {
return err
}
if _, err := zw.Write(data); err != nil {
return err
}
if err := zw.Close(); err != nil {
return err
}
rel, err := filepath.Rel("static", p)
if err != nil {
return err
}
out := filepath.Join("static_gz", rel+".gz")
if err := os.MkdirAll(filepath.Dir(out), 0755); err != nil {
return err
}
return os.WriteFile(out, buf.Bytes(), 0644)
})
}