From 323e769bd06c7896a47ed8a297d27ae1058663a2 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sat, 1 Aug 2020 14:46:07 +0200 Subject: [PATCH 1/4] Remove the ServiceWorker and manifest.json There is barely any performance benefit of SW-based caching and it causes a lot of issues after updating a instance and when the cache is stale, causing weird UI issues like chunk loading errors and other unexpected behaviour. I kept the unregistration in the code so existing serviceworkers will properly uninstall after an update. We may be able to eventually drop the code completely in a future version after most users have ran the uninstallation. manifest.json is removed because it serves no real purpose without a serviceworker and to eliminate another HTTP request for the sake of performance. Fixes: https://github.com/go-gitea/gitea/issues/12344 --- Makefile | 2 +- custom/conf/app.example.ini | 2 - .../doc/advanced/config-cheat-sheet.en-us.md | 1 - .../doc/advanced/hacking-on-gitea.en-us.md | 2 - modules/setting/setting.go | 2 - modules/templates/helper.go | 3 -- package-lock.json | 22 --------- package.json | 2 - templates/base/head.tmpl | 1 - web_src/js/features/serviceworker.js | 46 ++++--------------- web_src/js/serviceworker.js | 23 ---------- webpack.config.js | 9 +--- 12 files changed, 10 insertions(+), 105 deletions(-) delete mode 100644 web_src/js/serviceworker.js diff --git a/Makefile b/Makefile index 890332fde1e43..3aefafa61216f 100644 --- a/Makefile +++ b/Makefile @@ -96,7 +96,7 @@ FOMANTIC_DEST_DIR := web_src/fomantic/build WEBPACK_SOURCES := $(shell find web_src/js web_src/less -type f) $(FOMANTIC_DEST) WEBPACK_CONFIGS := webpack.config.js WEBPACK_DEST := public/js/index.js public/css/index.css -WEBPACK_DEST_ENTRIES := public/js public/css public/fonts public/img/webpack public/serviceworker.js +WEBPACK_DEST_ENTRIES := public/js public/css public/fonts public/img/webpack BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST)) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index f8c631ee0718e..77ecb088396b4 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -190,8 +190,6 @@ REACTIONS = +1, -1, laugh, hooray, confused, heart, rocket, eyes DEFAULT_SHOW_FULL_NAME = false ; Whether to search within description at repository search on explore page. SEARCH_REPO_DESCRIPTION = true -; Whether to enable a Service Worker to cache frontend assets -USE_SERVICE_WORKER = true [ui.admin] ; Number of users that are displayed on one page diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 39fc350e4f40a..3be1726dad40b 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -137,7 +137,6 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. For custom reactions, add a tightly cropped square image to public/emoji/img/reaction_name.png - `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used. - `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page. -- `USE_SERVICE_WORKER`: **true**: Whether to enable a Service Worker to cache frontend assets. ### UI - Admin (`ui.admin`) diff --git a/docs/content/doc/advanced/hacking-on-gitea.en-us.md b/docs/content/doc/advanced/hacking-on-gitea.en-us.md index b24260c68a42a..6a8daa1b01d08 100644 --- a/docs/content/doc/advanced/hacking-on-gitea.en-us.md +++ b/docs/content/doc/advanced/hacking-on-gitea.en-us.md @@ -151,8 +151,6 @@ Before committing, make sure the linters pass: make lint-frontend ``` -Note: When working on frontend code, set `USE_SERVICE_WORKER` to `false` in `app.ini` to prevent undesirable caching of frontend assets. - ### Building and adding SVGs SVG icons are built using the `make svg` target which compiles the icon sources defined in `build/generate-svg.js` into the output directory `public/img/svg`. Custom icons can be added in the `web_src/svg` directory. diff --git a/modules/setting/setting.go b/modules/setting/setting.go index d4ce13079a581..9f562cbf74838 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -179,7 +179,6 @@ var ( Reactions []string ReactionsMap map[string]bool SearchRepoDescription bool - UseServiceWorker bool Notification struct { MinTimeout time.Duration @@ -1012,7 +1011,6 @@ func NewContext() { UI.ShowUserEmail = Cfg.Section("ui").Key("SHOW_USER_EMAIL").MustBool(true) UI.DefaultShowFullName = Cfg.Section("ui").Key("DEFAULT_SHOW_FULL_NAME").MustBool(false) UI.SearchRepoDescription = Cfg.Section("ui").Key("SEARCH_REPO_DESCRIPTION").MustBool(true) - UI.UseServiceWorker = Cfg.Section("ui").Key("USE_SERVICE_WORKER").MustBool(true) HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 718fe8f2672ec..7cb38fd537cd1 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -169,9 +169,6 @@ func NewFuncMap() []template.FuncMap { "MetaKeywords": func() string { return setting.UI.Meta.Keywords }, - "UseServiceWorker": func() bool { - return setting.UI.UseServiceWorker - }, "FilenameIsImage": func(filename string) bool { mimeType := mime.TypeByExtension(filepath.Ext(filename)) return strings.HasPrefix(mimeType, "image/") diff --git a/package-lock.json b/package-lock.json index 415fb38016084..41bba720a908b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14688,28 +14688,6 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, - "workbox-core": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.3.tgz", - "integrity": "sha512-TFSIPxxciX9sFaj0FDiohBeIKpwMcCyNduydi9i3LChItcndDS6TJpErxybv8aBWeCMraXt33TWtF6kKuIObNw==" - }, - "workbox-routing": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.3.tgz", - "integrity": "sha512-F+sAp9Iy3lVl3BEG+pzXWVq4AftzjiFpHDaZ4Kf4vLoBoKQE0hIHet4zE5DpHqYdyw+Udhp4wrfHamX6PN6z1Q==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-strategies": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.3.tgz", - "integrity": "sha512-wiXHfmOKnWABeIVW+/ye0e00+2CcS5y7SIj2f9zcdy2ZLEbcOf7B+yOl5OrWpBGlTUwRjIYhV++ZqiKm3Dc+8w==", - "requires": { - "workbox-core": "^5.1.3", - "workbox-routing": "^5.1.3" - } - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index d2980e93035d5..73c42609dee28 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,6 @@ "webpack": "4.44.0", "webpack-cli": "3.3.12", "webpack-fix-style-only-entries": "0.5.1", - "workbox-routing": "5.1.3", - "workbox-strategies": "5.1.3", "worker-loader": "2.0.0", "wrap-ansi": "7.0.0" }, diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 0760354e43068..61e99e2d6c219 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -30,7 +30,6 @@ AppVer: '{{AppVer}}', AppSubUrl: '{{AppSubUrl}}', StaticUrlPrefix: '{{StaticUrlPrefix}}', - UseServiceWorker: {{UseServiceWorker}}, csrf: '{{.CsrfToken}}', HighlightJS: {{if .RequireHighlightJS}}true{{else}}false{{end}}, SimpleMDE: {{if .RequireSimpleMDE}}true{{else}}false{{end}}, diff --git a/web_src/js/features/serviceworker.js b/web_src/js/features/serviceworker.js index fa415866cd299..407ac55295fda 100644 --- a/web_src/js/features/serviceworker.js +++ b/web_src/js/features/serviceworker.js @@ -1,7 +1,5 @@ -const {UseServiceWorker, AppSubUrl, AppVer} = window.config; -const cachePrefix = 'static-cache-v'; // actual version is set in the service worker script - async function unregister() { + if (!('serviceWorker' in navigator)) return; const registrations = await navigator.serviceWorker.getRegistrations(); await Promise.all(registrations.map((registration) => { return registration.active && registration.unregister(); @@ -9,45 +7,17 @@ async function unregister() { } async function invalidateCache() { + if (!caches || !caches.keys) return; const cacheKeys = await caches.keys(); await Promise.all(cacheKeys.map((key) => { - return key.startsWith(cachePrefix) && caches.delete(key); + return key.startsWith('static-cache-v') && caches.delete(key); })); } -async function checkCacheValidity() { - const cacheKey = AppVer; - const storedCacheKey = localStorage.getItem('staticCacheKey'); - - // invalidate cache if it belongs to a different gitea version - if (cacheKey && storedCacheKey !== cacheKey) { - await invalidateCache(); - localStorage.setItem('staticCacheKey', cacheKey); - } -} - export default async function initServiceWorker() { - if (!('serviceWorker' in navigator)) return; - - if (UseServiceWorker) { - try { - // normally we'd serve the service worker as a static asset from StaticUrlPrefix but - // the spec strictly requires it to be same-origin so it has to be AppSubUrl to work - await Promise.all([ - checkCacheValidity(), - navigator.serviceWorker.register(`${AppSubUrl}/serviceworker.js`), - ]); - } catch (err) { - console.error(err); - await Promise.all([ - invalidateCache(), - unregister(), - ]); - } - } else { - await Promise.all([ - invalidateCache(), - unregister(), - ]); - } + // we once had a service worker, if it's present, remove it and wipe its cache + await Promise.all([ + invalidateCache(), + unregister(), + ]); } diff --git a/web_src/js/serviceworker.js b/web_src/js/serviceworker.js deleted file mode 100644 index c96ef8bd97ffe..0000000000000 --- a/web_src/js/serviceworker.js +++ /dev/null @@ -1,23 +0,0 @@ -import {registerRoute} from 'workbox-routing'; -import {StaleWhileRevalidate} from 'workbox-strategies'; - -const cacheName = 'static-cache-v2'; - -// disable workbox debug logging in development, remove when debugging the service worker -self.__WB_DISABLE_DEV_LOGS = true; - -// see https://developer.mozilla.org/en-US/docs/Web/API/RequestDestination for possible values -const cachedDestinations = new Set([ - 'font', - 'manifest', - 'paintworklet', - 'script', - 'sharedworker', - 'style', - 'worker', -]); - -registerRoute( - ({request}) => cachedDestinations.has(request.destination), - new StaleWhileRevalidate({cacheName}), -); diff --git a/webpack.config.js b/webpack.config.js index e733a7784ed5a..bba849fef37bc 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -50,9 +50,6 @@ module.exports = { swagger: [ resolve(__dirname, 'web_src/js/standalone/swagger.js'), ], - serviceworker: [ - resolve(__dirname, 'web_src/js/serviceworker.js'), - ], 'eventsource.sharedworker': [ resolve(__dirname, 'web_src/js/features/eventsource.sharedworker.js'), ], @@ -61,11 +58,7 @@ module.exports = { devtool: false, output: { path: resolve(__dirname, 'public'), - filename: ({chunk}) => { - // serviceworker can only manage assets below it's script's directory so - // we have to put it in / instead of /js/ - return chunk.name === 'serviceworker' ? '[name].js' : 'js/[name].js'; - }, + filename: 'js/[name].js', chunkFilename: 'js/[name].js', }, optimization: { From 67085e1cc766eb5240bb5683dca4207de5bf522e Mon Sep 17 00:00:00 2001 From: silverwind Date: Tue, 11 Aug 2020 21:38:58 +0200 Subject: [PATCH 2/4] remove manifest.json --- routers/routes/routes.go | 5 ----- templates/base/head.tmpl | 1 - templates/pwa/manifest_json.tmpl | 31 ------------------------------- 3 files changed, 37 deletions(-) delete mode 100644 templates/pwa/manifest_json.tmpl diff --git a/routers/routes/routes.go b/routers/routes/routes.go index d739f0b6ca5d2..643a8e9550e6b 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -1043,11 +1043,6 @@ func RegisterRoutes(m *macaron.Macaron) { ctx.Redirect(path.Join(setting.StaticURLPrefix, "img/apple-touch-icon.png"), 301) }) - // Progressive Web App - m.Get("/manifest.json", templates.JSONRenderer(), func(ctx *context.Context) { - ctx.HTML(200, "pwa/manifest_json") - }) - // prometheus metrics endpoint if setting.Metrics.Enabled { c := metrics.NewCollector() diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 61e99e2d6c219..e86f528cac905 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -5,7 +5,6 @@ {{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}} {{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} - diff --git a/templates/pwa/manifest_json.tmpl b/templates/pwa/manifest_json.tmpl deleted file mode 100644 index 793b42f2e1c89..0000000000000 --- a/templates/pwa/manifest_json.tmpl +++ /dev/null @@ -1,31 +0,0 @@ -{ - "short_name": "Gitea", - "name": "Gitea - Git with a cup of tea", - "icons": [ - { - "src": "{{StaticUrlPrefix}}/img/gitea-lg.png", - "type": "image/png", - "sizes": "880x880" - }, - { - "src": "{{StaticUrlPrefix}}/img/gitea-sm.png", - "type": "image/png", - "sizes": "120x120" - }, - { - "src": "{{StaticUrlPrefix}}/img/gitea-512.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "{{StaticUrlPrefix}}/img/gitea-192.png", - "type": "image/png", - "sizes": "192x192" - } - ], - "start_url": "{{AppSubUrl}}/", - "scope": "{{AppSubUrl}}/", - "background_color": "#FAFAFA", - "display": "standalone", - "theme_color": "{{ThemeColorMetaTag}}" - } From b87810b00fbbb9942874d9fd366bb550203bcecf Mon Sep 17 00:00:00 2001 From: silverwind Date: Tue, 11 Aug 2020 21:50:54 +0200 Subject: [PATCH 3/4] remove unused gitea-512.png --- build/generate-images.js | 1 - public/img/gitea-512.png | Bin 17709 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 public/img/gitea-512.png diff --git a/build/generate-images.js b/build/generate-images.js index 9b7b8201720eb..c9a662d25fa53 100755 --- a/build/generate-images.js +++ b/build/generate-images.js @@ -89,7 +89,6 @@ async function main() { const svg = await readFile(resolve(__dirname, '../assets/logo.svg'), 'utf8'); await generateSvgFavicon(svg, resolve(__dirname, '../public/img/favicon.svg')); await generate(svg, resolve(__dirname, '../public/img/gitea-lg.png'), {size: 880}); - await generate(svg, resolve(__dirname, '../public/img/gitea-512.png'), {size: 512}); await generate(svg, resolve(__dirname, '../public/img/gitea-192.png'), {size: 192}); await generate(svg, resolve(__dirname, '../public/img/gitea-sm.png'), {size: 120}); await generate(svg, resolve(__dirname, '../public/img/avatar_default.png'), {size: 200}); diff --git a/public/img/gitea-512.png b/public/img/gitea-512.png deleted file mode 100644 index 7b32fb33b60842378f13d504c5b4f539921e0f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17709 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

_pN88XNd>VV>vCmC;^)0 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 BVod-5 From e92d553b67776a055178fa75bb987007d6e2abf9 Mon Sep 17 00:00:00 2001 From: silverwind Date: Tue, 11 Aug 2020 21:59:55 +0200 Subject: [PATCH 4/4] remove gitea-192.png after replacing usage with svg --- README.md | 2 +- README_ZH.md | 2 +- build/generate-images.js | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e46ae4cd1af7c..4199390bfc655 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [简体中文](README_ZH.md) -

logo Gitea - Git with a cup of tea

+

logo Gitea - Git with a cup of tea

[![Build Status](https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg?ref=refs/heads/master)](https://drone.gitea.io/go-gitea/gitea) [![Join the Discord chat at https://discord.gg/Gitea](https://img.shields.io/discord/322538954119184384.svg)](https://discord.gg/Gitea) diff --git a/README_ZH.md b/README_ZH.md index 5163e336d2eb4..fd78ed829adfc 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -1,6 +1,6 @@ [English](README.md) -

logo Gitea - Git with a cup of tea

+

logo Gitea - Git with a cup of tea

[![Build Status](https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg)](https://drone.gitea.io/go-gitea/gitea) [![Join the Discord chat at https://discord.gg/Gitea](https://img.shields.io/discord/322538954119184384.svg)](https://discord.gg/Gitea) diff --git a/build/generate-images.js b/build/generate-images.js index c9a662d25fa53..111034f30e32d 100755 --- a/build/generate-images.js +++ b/build/generate-images.js @@ -89,7 +89,6 @@ async function main() { const svg = await readFile(resolve(__dirname, '../assets/logo.svg'), 'utf8'); await generateSvgFavicon(svg, resolve(__dirname, '../public/img/favicon.svg')); await generate(svg, resolve(__dirname, '../public/img/gitea-lg.png'), {size: 880}); - await generate(svg, resolve(__dirname, '../public/img/gitea-192.png'), {size: 192}); await generate(svg, resolve(__dirname, '../public/img/gitea-sm.png'), {size: 120}); await generate(svg, resolve(__dirname, '../public/img/avatar_default.png'), {size: 200}); await generate(svg, resolve(__dirname, '../public/img/favicon.png'), {size: 180, removeDetail: true});