From 6c2e94a12d0a92c144a6739c1dc12cffd28c518f Mon Sep 17 00:00:00 2001 From: bowenliang123 Date: Fri, 31 Jul 2026 14:04:31 +0800 Subject: [PATCH] perf(server): add cache headers for web UI static assets --- .changeset/web-assets-cache-headers.md | 5 +++++ packages/kap-server/src/routes/webAssets.ts | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changeset/web-assets-cache-headers.md diff --git a/.changeset/web-assets-cache-headers.md b/.changeset/web-assets-cache-headers.md new file mode 100644 index 0000000000..80075e74e1 --- /dev/null +++ b/.changeset/web-assets-cache-headers.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +web: Serve hashed static assets with long-lived immutable cache headers so repeat visits load faster. diff --git a/packages/kap-server/src/routes/webAssets.ts b/packages/kap-server/src/routes/webAssets.ts index 7b7ad01760..cb86be8fd5 100644 --- a/packages/kap-server/src/routes/webAssets.ts +++ b/packages/kap-server/src/routes/webAssets.ts @@ -1,6 +1,6 @@ import { createReadStream } from 'node:fs'; import { stat } from 'node:fs/promises'; -import { extname, join, normalize, resolve, sep } from 'node:path'; +import { extname, join, normalize, relative, resolve, sep } from 'node:path'; import type { FastifyReply, FastifyRequest } from 'fastify'; @@ -57,9 +57,19 @@ async function serveWebAsset( return reply .type(mimeType(filePath)) .header('Content-Length', String(fileInfo.size)) + .header('Cache-Control', cacheControl(assetsDir, filePath)) .send(createReadStream(filePath)); } +// Vite emits content-hashed files under `assets/` — cache them forever. +// Everything else (index.html, SPA fallback, favicon, ...) must revalidate. +function cacheControl(assetsDir: string, filePath: string): string { + const rel = relative(resolve(assetsDir), filePath); + return rel.startsWith(`assets${sep}`) + ? 'public, max-age=31536000, immutable' + : 'no-cache'; +} + async function resolveStaticFile( assetsDir: string, pathname: string,