1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-01 17:38:37 +00:00

Use embed package for Javascript bundles instead of generated files

This commit is contained in:
Frédéric Guillot 2021-02-18 20:34:58 -08:00 committed by fguillot
parent 9569666259
commit 4855fbd13f
9 changed files with 79 additions and 106 deletions

File diff suppressed because one or more lines are too long

View file

@ -12,12 +12,15 @@ import (
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/css"
"github.com/tdewolff/minify/v2/js"
)
// Static assets.
var (
StylesheetBundleChecksums map[string]string
StylesheetBundles map[string][]byte
JavascriptBundleChecksums map[string]string
JavascriptBundles map[string][]byte
)
//go:embed bin/*
@ -26,6 +29,9 @@ var binaryFiles embed.FS
//go:embed css/*.css
var stylesheetFiles embed.FS
//go:embed js/*.js
var javascriptFiles embed.FS
var binaryFileChecksums map[string]string
// CalculateBinaryFileChecksums generates hash of embed binary files.
@ -102,3 +108,67 @@ func GenerateStylesheetsBundles() error {
return nil
}
// GenerateJavascriptBundles creates JS bundles.
func GenerateJavascriptBundles() error {
var bundles = map[string][]string{
"app": {
"js/dom_helper.js",
"js/touch_handler.js",
"js/keyboard_handler.js",
"js/request_builder.js",
"js/modal_handler.js",
"js/app.js",
"js/bootstrap.js",
},
"service-worker": {
"js/service_worker.js",
},
}
var prefixes = map[string]string{
"app": "(function(){'use strict';",
"service-worker": "'use strict';",
}
var suffixes = map[string]string{
"app": "})();",
}
JavascriptBundles = make(map[string][]byte)
JavascriptBundleChecksums = make(map[string]string)
minifier := minify.New()
minifier.AddFunc("text/javascript", js.Minify)
for bundle, srcFiles := range bundles {
var buffer bytes.Buffer
if prefix, found := prefixes[bundle]; found {
buffer.WriteString(prefix)
}
for _, srcFile := range srcFiles {
fileData, err := javascriptFiles.ReadFile(srcFile)
if err != nil {
return err
}
buffer.Write(fileData)
}
if suffix, found := suffixes[bundle]; found {
buffer.WriteString(suffix)
}
minifiedData, err := minifier.Bytes("text/javascript", buffer.Bytes())
if err != nil {
return err
}
JavascriptBundles[bundle] = minifiedData
JavascriptBundleChecksums[bundle] = fmt.Sprintf("%x", sha256.Sum256(minifiedData))
}
return nil
}

View file

@ -16,7 +16,7 @@ import (
func (h *handler) showJavascript(w http.ResponseWriter, r *http.Request) {
filename := request.RouteStringParam(r, "name")
etag, found := static.JavascriptsChecksums[filename]
etag, found := static.JavascriptBundleChecksums[filename]
if !found {
html.NotFound(w, r)
return
@ -24,7 +24,7 @@ func (h *handler) showJavascript(w http.ResponseWriter, r *http.Request) {
response.New(w, r).WithCaching(etag, 48*time.Hour, func(b *response.Builder) {
b.WithHeader("Content-Type", "text/javascript; charset=utf-8")
b.WithBody(static.Javascripts[filename])
b.WithBody(static.JavascriptBundles[filename])
b.Write()
})
}

View file

@ -41,7 +41,7 @@ func New(tpl *template.Engine, r *http.Request, sess *session.Session) *View {
b.params["flashErrorMessage"] = sess.FlashErrorMessage(request.FlashErrorMessage(r))
b.params["theme"] = theme
b.params["theme_checksum"] = static.StylesheetBundleChecksums[theme]
b.params["app_js_checksum"] = static.JavascriptsChecksums["app"]
b.params["sw_js_checksum"] = static.JavascriptsChecksums["service-worker"]
b.params["app_js_checksum"] = static.JavascriptBundleChecksums["app"]
b.params["sw_js_checksum"] = static.JavascriptBundleChecksums["service-worker"]
return b
}