From eac6938baa665e38a76a93ff4e9f778f4c96a6bd Mon Sep 17 00:00:00 2001 From: Sakurasan <26715255+Sakurasan@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:30:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1:=20SPA=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=BB=BA=E5=90=8E?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E9=BB=91=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.html 设 Cache-Control: no-cache,避免浏览器启发式缓存保留引用已删除 chunk 的旧 HTML - /assets/*(文件名含内容 hash,不可变)设 immutable 长缓存,减少回源 Co-Authored-By: Claude --- server/internal/api/router.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/server/internal/api/router.go b/server/internal/api/router.go index 31bd6ed..7fb8133 100644 --- a/server/internal/api/router.go +++ b/server/internal/api/router.go @@ -34,7 +34,13 @@ func NewRouter(a *app.App, gw *proxy.Gateway) *gin.Engine { // 静态资源(前端构建产物,存在时托管) const dist = "web/dist" if _, err := os.Stat(dist); err == nil { - r.Static("/assets", dist+"/assets") + // /assets 文件名含内容 hash,不可变:长缓存 + immutable,避免每次回源 + assets := r.Group("/assets") + assets.Use(func(c *gin.Context) { + c.Header("Cache-Control", "public, max-age=31536000, immutable") + c.Next() + }) + assets.Static("", dist+"/assets") r.StaticFile("/favicon.svg", dist+"/favicon.svg") } @@ -48,6 +54,8 @@ func NewRouter(a *app.App, gw *proxy.Gateway) *gin.Engine { return } if _, err := os.Stat(dist); err == nil { + // SPA 入口:必须每次回源校验,否则浏览器启发式缓存会保留引用已删除 chunk 的旧 HTML → 黑屏 + c.Header("Cache-Control", "no-cache") c.File(dist + "/index.html") return }