feat: enhance SSR cache management with dependency tracking and entry-level invalidation

This commit is contained in:
2026-02-25 17:35:10 +00:00
parent 3886eb9f34
commit 3b84e49383
8 changed files with 96 additions and 86 deletions

View File

@@ -120,6 +120,8 @@ const { ssrRequest } = require("../lib/ssr-server")
} else {
// @ts-ignore
context.ssrCache = {}
// @ts-ignore tracks dependencies as { "col:id": true, "col:*": true }
context.ssrDeps = {}
// @ts-ignore
context.ssrRequest = ssrRequest
@@ -165,6 +167,22 @@ const { ssrRequest } = require("../lib/ssr-server")
tpl = tpl.replace("<!--HEAD-->", head)
tpl = tpl.replace("<!--HTML-->", html)
tpl = tpl.replace("<!--SSR.ERROR-->", error ? "<!--" + error + "-->" : "")
// Deduplicate deps: if "col:*" exists, drop all "col:<id>" for that collection
// @ts-ignore ssrDeps is set dynamically above
var depsKeys = context.ssrDeps ? Object.keys(context.ssrDeps) : []
/** @type {{[key: string]: boolean}} */
var wildcardCols = {}
depsKeys.forEach(function (k) {
if (k.endsWith(":*")) wildcardCols[k.split(":")[0]] = true
})
depsKeys = depsKeys.filter(function (k) {
if (k.endsWith(":*")) return true
return !wildcardCols[k.split(":")[0]]
})
// @ts-ignore append deps for debugging
comment += ", deps: [" + depsKeys.join(", ") + "]"
tpl = tpl.replace("<!--SSR.COMMENT-->", comment ? "<!--" + comment + "-->" : "")
if (cacheIt && !noCache) {
@@ -174,6 +192,8 @@ const { ssrRequest } = require("../lib/ssr-server")
content: tpl,
// @ts-ignore
validUntil: context.ssrCacheValidUntil,
// dependency strings: "col:id" for detail, "col:*" for list (deduplicated)
dependencies: depsKeys,
})
}