Bläddra i källkod

Add service worker to cache feed icons

Frédéric Guillot 7 år sedan
förälder
incheckning
6aa02680d8
8 ändrade filer med 88 tillägg och 32 borttagningar
  1. 1 1
      daemon/routes.go
  2. 46 26
      generate.go
  3. 4 2
      template/common.go
  4. 3 1
      template/html/common/layout.html
  5. 1 1
      ui/static/js.go
  6. 7 0
      ui/static/js/bootstrap.js
  7. 14 0
      ui/static/js/sw.js
  8. 12 1
      ui/static_javascript.go

+ 1 - 1
daemon/routes.go

@@ -84,7 +84,7 @@ func routes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handle
 	uiRouter.Use(middleware.AppSession)
 	uiRouter.Use(middleware.UserSession)
 	uiRouter.HandleFunc("/stylesheets/{name}.css", uiController.Stylesheet).Name("stylesheet").Methods("GET")
-	uiRouter.HandleFunc("/js", uiController.Javascript).Name("javascript").Methods("GET")
+	uiRouter.HandleFunc("/{name}.js", uiController.Javascript).Name("javascript").Methods("GET")
 	uiRouter.HandleFunc("/favicon.ico", uiController.Favicon).Name("favicon").Methods("GET")
 	uiRouter.HandleFunc("/icon/{filename}", uiController.AppIcon).Name("appIcon").Methods("GET")
 	uiRouter.HandleFunc("/manifest.json", uiController.WebManifest).Name("webManifest").Methods("GET")

+ 46 - 26
generate.go

@@ -96,23 +96,33 @@ func concat(files []string) string {
 	return b.String()
 }
 
-func generateJSBundle(bundleFile string, srcFiles []string) {
-	var b strings.Builder
-	b.WriteString("(function() {'use strict';")
-	b.WriteString(concat(srcFiles))
-	b.WriteString("})();")
-
+func generateJSBundle(bundleFile string, bundleFiles map[string][]string, prefixes, suffixes map[string]string) {
+	bundle := NewBundle("static", "Javascripts")
 	m := minify.New()
 	m.AddFunc("text/javascript", js.Minify)
 
-	output, err := m.String("text/javascript", b.String())
-	if err != nil {
-		panic(err)
+	for name, srcFiles := range bundleFiles {
+		var b strings.Builder
+
+		if prefix, found := prefixes[name]; found {
+			b.WriteString(prefix)
+		}
+
+		b.WriteString(concat(srcFiles))
+
+		if suffix, found := suffixes[name]; found {
+			b.WriteString(suffix)
+		}
+
+		minifiedData, err := m.String("text/javascript", b.String())
+		if err != nil {
+			panic(err)
+		}
+
+		bundle.Files[name] = minifiedData
+		bundle.Checksums[name] = checksum([]byte(minifiedData))
 	}
 
-	bundle := NewBundle("static", "Javascript")
-	bundle.Files["app"] = output
-	bundle.Checksums["app"] = checksum([]byte(output))
 	bundle.Write(bundleFile)
 }
 
@@ -165,20 +175,30 @@ func generateBundle(bundleFile, pkg, mapName string, srcFiles []string) {
 }
 
 func main() {
-	generateJSBundle("ui/static/js.go", []string{
-		"ui/static/js/dom_helper.js",
-		"ui/static/js/touch_handler.js",
-		"ui/static/js/keyboard_handler.js",
-		"ui/static/js/mouse_handler.js",
-		"ui/static/js/form_handler.js",
-		"ui/static/js/request_builder.js",
-		"ui/static/js/unread_counter_handler.js",
-		"ui/static/js/entry_handler.js",
-		"ui/static/js/confirm_handler.js",
-		"ui/static/js/menu_handler.js",
-		"ui/static/js/modal_handler.js",
-		"ui/static/js/nav_handler.js",
-		"ui/static/js/bootstrap.js",
+	generateJSBundle("ui/static/js.go", map[string][]string{
+		"app": []string{
+			"ui/static/js/dom_helper.js",
+			"ui/static/js/touch_handler.js",
+			"ui/static/js/keyboard_handler.js",
+			"ui/static/js/mouse_handler.js",
+			"ui/static/js/form_handler.js",
+			"ui/static/js/request_builder.js",
+			"ui/static/js/unread_counter_handler.js",
+			"ui/static/js/entry_handler.js",
+			"ui/static/js/confirm_handler.js",
+			"ui/static/js/menu_handler.js",
+			"ui/static/js/modal_handler.js",
+			"ui/static/js/nav_handler.js",
+			"ui/static/js/bootstrap.js",
+		},
+		"sw": []string{
+			"ui/static/js/sw.js",
+		},
+	}, map[string]string{
+		"app": "(function(){'use strict';",
+		"sw":  "'use strict';",
+	}, map[string]string{
+		"app": "})();",
 	})
 
 	generateCSSBundle("ui/static/css.go", map[string][]string{

+ 4 - 2
template/common.go

@@ -103,7 +103,9 @@ var templateCommonMap = map[string]string{
     {{ else }}
         <link rel="stylesheet" type="text/css" href="{{ route "stylesheet" "name" "default" }}">
     {{ end }}
-    <script type="text/javascript" src="{{ route "javascript" }}" defer></script>
+
+    <script type="text/javascript" src="{{ route "javascript" "name" "app" }}" defer></script>
+    <script type="text/javascript" src="{{ route "javascript" "name" "sw" }}" defer id="service-worker-script"></script>
 </head>
 <body data-entries-status-url="{{ route "updateEntriesStatus" }}">
     {{ if .user }}
@@ -232,6 +234,6 @@ var templateCommonMap = map[string]string{
 var templateCommonMapChecksums = map[string]string{
 	"entry_pagination": "756ef122f3ebc73754b5fc4304bf05e59da0ab4af030b2509ff4c9b4a74096ce",
 	"item_meta":        "6cff8ae243f19dac936e523867d2975f70aa749b2a461ae63f6ebbca94cf7419",
-	"layout":           "27b21c2d8ce341edcc11bf557f73fcd08dad1dfc8d0788c94addbc87f94f2f19",
+	"layout":           "7a4a1ec5fdfe96b20626aa7b9028fd1f166a753e46b497f6d2232f5cd050895d",
 	"pagination":       "b592d58ea9d6abf2dc0b158621404cbfaeea5413b1c8b8b9818725963096b196",
 }

+ 3 - 1
template/html/common/layout.html

@@ -29,7 +29,9 @@
     {{ else }}
         <link rel="stylesheet" type="text/css" href="{{ route "stylesheet" "name" "default" }}">
     {{ end }}
-    <script type="text/javascript" src="{{ route "javascript" }}" defer></script>
+
+    <script type="text/javascript" src="{{ route "javascript" "name" "app" }}" defer></script>
+    <script type="text/javascript" src="{{ route "javascript" "name" "sw" }}" defer id="service-worker-script"></script>
 </head>
 <body data-entries-status-url="{{ route "updateEntriesStatus" }}">
     {{ if .user }}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
ui/static/js.go


+ 7 - 0
ui/static/js/bootstrap.js

@@ -71,4 +71,11 @@ document.addEventListener("DOMContentLoaded", function() {
         mouseHandler.onClick(".logo", () => menuHandler.toggleMainMenu());
         mouseHandler.onClick(".header nav li", (event) => menuHandler.clickMenuListItem(event));
     }
+
+    if ("serviceWorker" in navigator) {
+        let scriptElement = document.getElementById("service-worker-script");
+        if (scriptElement) {
+            navigator.serviceWorker.register(scriptElement.src);
+        }
+    }
 });

+ 14 - 0
ui/static/js/sw.js

@@ -0,0 +1,14 @@
+self.addEventListener("fetch", (event) => {
+    if (event.request.url.includes("/feed/icon/")) {
+        event.respondWith(
+            caches.open("feed_icons").then((cache) => {
+                return cache.match(event.request).then((response) => {
+                    return response || fetch(event.request).then((response) => {
+                        cache.put(event.request, response.clone());
+                        return response;
+                    });
+                });
+            })
+        );
+    }
+});

+ 12 - 1
ui/static_javascript.go

@@ -8,11 +8,22 @@ import (
 	"net/http"
 	"time"
 
+	"github.com/miniflux/miniflux/http/request"
 	"github.com/miniflux/miniflux/http/response"
+	"github.com/miniflux/miniflux/http/response/html"
 	"github.com/miniflux/miniflux/ui/static"
 )
 
 // Javascript renders application client side code.
 func (c *Controller) Javascript(w http.ResponseWriter, r *http.Request) {
-	response.Cache(w, r, "text/javascript; charset=utf-8", static.JavascriptChecksums["app"], []byte(static.Javascript["app"]), 48*time.Hour)
+	filename := request.Param(r, "name", "app")
+	if _, found := static.Javascripts[filename]; !found {
+		html.NotFound(w)
+		return
+	}
+
+	body := static.Javascripts[filename]
+	etag := static.JavascriptsChecksums[filename]
+
+	response.Cache(w, r, "text/javascript; charset=utf-8", etag, []byte(body), 48*time.Hour)
 }

Vissa filer visades inte eftersom för många filer har ändrats