From 51c6d1f0a69be3a8e1174f85228b1af3762ba406 Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Sat, 1 Nov 2025 01:08:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(wip):=20serviceworker=20*=20=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E7=BC=93=E5=AD=98=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/index.ts | 13 ++++++++++++- client/sw.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 client/sw.ts diff --git a/client/index.ts b/client/index.ts index 2045029..752bce3 100644 --- a/client/index.ts +++ b/client/index.ts @@ -24,4 +24,15 @@ const onResize = () => { } // deno-lint-ignore no-window no-window-prefix window.addEventListener('resize', onResize) -onResize() \ No newline at end of file +onResize() + +// @ts-ignore 工作正常, 这里是获取为 URL 以便于构建 +import sw from './sw.ts?worker&url' + +if ("serviceWorker" in navigator) + try { + navigator.serviceWorker + .register(sw as URL) + } catch (e) { + console.error(e) + } diff --git a/client/sw.ts b/client/sw.ts new file mode 100644 index 0000000..9e30143 --- /dev/null +++ b/client/sw.ts @@ -0,0 +1,30 @@ +interface FetchEvent extends Event { + waitUntil: (p: Promise) => void + request: Request + respondWith: (r: Response | Promise) => void +} + +// 上传文件的代理与缓存 +self.addEventListener("fetch", (e) => { + const event = e as FetchEvent + if (event.request.method != "GET" || event.request.url.indexOf("/uploaded_files/") == -1) return + + event.respondWith( + (async () => { + const cache = await caches.open("LingChair-UploadedFile-Cache") + const cachedResponse = await cache.match(event.request) + if (cachedResponse) { + event.waitUntil(cache.add(event.request)) + return cachedResponse + } + return fetch({ + ...event.request, + headers: { + ...event.request.headers, + // 目前还不能获取 token + // localsotrage 在这里不可用 + } + }) + })() + ) +})