From 125e3e5302ada7af28c39aa8f41b8e5a087e0708 Mon Sep 17 00:00:00 2001 From: shellRaining Date: Sun, 26 Jul 2026 00:51:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(pwa):=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=88=87=E6=8D=A2=E5=90=8E=E7=9A=84=E6=87=92=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +-- apps/docs/content/guide/getting-started.md | 2 +- apps/website/build/runtime-cache.ts | 32 ++++++++ .../src/components/PwaStatusBanner.vue | 71 +++++++++++++++-- apps/website/src/components/pwa-update.ts | 71 +++++++++++++++++ apps/website/tests/pwa-update.test.ts | 78 +++++++++++++++++++ apps/website/tests/runtime-cache.test.ts | 38 +++++++++ apps/website/tests/vercel-routing.test.ts | 32 ++++++++ apps/website/vite.config.ts | 8 +- docs/exec-plans/README.md | 4 +- .../active/2026-07-26-pwa-version-skew.md | 60 ++++++++++++++ docs/frontend.md | 6 +- vercel.json | 7 +- 13 files changed, 398 insertions(+), 21 deletions(-) create mode 100644 apps/website/build/runtime-cache.ts create mode 100644 apps/website/src/components/pwa-update.ts create mode 100644 apps/website/tests/pwa-update.test.ts create mode 100644 apps/website/tests/runtime-cache.test.ts create mode 100644 apps/website/tests/vercel-routing.test.ts create mode 100644 docs/exec-plans/active/2026-07-26-pwa-version-skew.md diff --git a/README.md b/README.md index 635d9ea..c93a65a 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,12 @@ ## 开发环境 -| 开发者类型 | 需要自行准备 | 说明 | -| --- | --- | --- | -| 普通开发者 | [Vite+](https://viteplus.dev/) 的 `vp` CLI | 进入仓库后执行 `vp install`,其余项目工具由仓库管理 | -| 真实接口验证者 | 浙江大学校园网或代理、CC98 账号 | 账号写入 `.cc98-credentials.local`;普通构建和离线测试不需要 | +| 开发者类型 | 需要自行准备 | 说明 | +| ------------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------- | +| 普通开发者 | [Vite+](https://viteplus.dev/) 的 `vp` CLI | 进入仓库后执行 `vp install`,其余项目工具由仓库管理 | +| 真实接口验证者 | 浙江大学校园网或代理、CC98 账号 | 账号写入 `.cc98-credentials.local`;普通构建和离线测试不需要 | | 并行或自动化开发者 | [Worktrunk](https://worktrunk.dev/);按需安装浏览器运行环境 | Worktrunk 用于多 worktree;浏览器环境运行 `vp exec agent-browser install` | -| 部署维护者 | Vercel 项目权限;按需安装 Vercel CLI | 普通开发者不需要;生产域名维护还需要相应 DNS 权限 | +| 部署维护者 | Vercel 项目权限;按需安装 Vercel CLI | 普通开发者不需要;生产域名维护还需要相应 DNS 权限 | 安装依赖并启动开发环境: diff --git a/apps/docs/content/guide/getting-started.md b/apps/docs/content/guide/getting-started.md index a573e58..06fa92d 100644 --- a/apps/docs/content/guide/getting-started.md +++ b/apps/docs/content/guide/getting-started.md @@ -12,7 +12,7 @@ 支持 PWA 的浏览器可以把 CC98 安装到桌面或主屏幕。安装入口通常位于地址栏或浏览器菜单中,名称可能是“安装应用”“添加到主屏幕”或“创建快捷方式”。安装后会以独立窗口打开,账号和外观设置仍由当前浏览器管理。 -页面提示新版本已经准备好时,点击“刷新”即可切换版本。选择“稍后”不会影响当前页面,下次发现更新时还会再次提示。 +页面提示新版本已经准备好时,点击“立即更新”即可切换版本。选择“稍后”不会影响当前页面,下次发现更新时还会再次提示。如果页面显示“当前版本已失效”,说明刚才打开的页面代码已经被新部署替换,需要更新后再继续访问。更新会重新加载当前页面,请先保存尚未提交的内容。 ## 认识顶部导航 diff --git a/apps/website/build/runtime-cache.ts b/apps/website/build/runtime-cache.ts new file mode 100644 index 0000000..8616cfb --- /dev/null +++ b/apps/website/build/runtime-cache.ts @@ -0,0 +1,32 @@ +export function createAppAssetCachePlugin() { + const cacheWillUpdate = async (context: { + request: Request; + response: Response; + }): Promise => { + const { request, response } = context; + if (response.status !== 200) return null; + + const contentType = response.headers.get("Content-Type")?.toLowerCase() ?? ""; + const pathname = new URL(request.url).pathname.toLowerCase(); + + if (pathname.endsWith(".js")) { + return contentType.includes("javascript") || contentType.includes("ecmascript") + ? response + : null; + } + if (pathname.endsWith(".css")) { + return contentType.startsWith("text/css") ? response : null; + } + if (/\.(?:woff2?|ttf)$/.test(pathname)) { + return contentType.startsWith("font/") || + contentType.startsWith("application/font-") || + contentType.startsWith("application/x-font-") || + contentType.startsWith("application/octet-stream") + ? response + : null; + } + return null; + }; + + return { cacheWillUpdate }; +} diff --git a/apps/website/src/components/PwaStatusBanner.vue b/apps/website/src/components/PwaStatusBanner.vue index 31a1a70..498b56c 100644 --- a/apps/website/src/components/PwaStatusBanner.vue +++ b/apps/website/src/components/PwaStatusBanner.vue @@ -1,25 +1,84 @@