958b45272d
- Add support for number chip arrays and JSON editor in admin UI config. - Introduce pagebuilder block registry for Svelte components in admin previews. - Implement custom role names and a 3-layer cascade model for field-level permissions. - Add CORS configuration hierarchy for better API security. - Update project setup instructions for admin token and config management. - Improve SSR 404 signaling with proper context handling in NotFound component. - Refactor routing structure to separate NotFound page into its own route.
40 lines
2.1 KiB
Markdown
40 lines
2.1 KiB
Markdown
# SSR and Caching
|
|
|
|
Server-side rendering via goja (Go JS runtime) with HTML caching.
|
|
|
|
## Request flow
|
|
|
|
1. `get_read.js` receives the request and calls `lib/ssr-server.js`.
|
|
2. `get_read.js` loads `lib/app.server.js` and calls `app.default.render({ url })`.
|
|
3. `frontend/src/ssr.ts` stays thin and only initializes locale state before rendering `App.svelte`.
|
|
4. `frontend/src/App.svelte` is responsible for actual page data loading for both browser and SSR.
|
|
5. During SSR, `App.svelte` calls the same `loadContent(...)` path directly inside `typeof window === "undefined"`.
|
|
6. Rendered HTML is stored in the `ssr` collection together with dependency tracking strings.
|
|
|
|
## Build
|
|
|
|
- SSR bundle is built via `yarn build:server` and outputs to `lib/app.server.js`.
|
|
- The project no longer uses Babel for SSR.
|
|
- goja-compatible transforms are configured in `esbuild.config.server.js` via `supported`.
|
|
- The server build must remove frontend-only splitting/outdir options inherited from the shared esbuild config.
|
|
|
|
## Cache invalidation
|
|
|
|
- `clear_cache.js` hook invalidates SSR cache entries based on collection dependencies.
|
|
- Dependencies are stored as strings like `content:<id>` or `content:*`.
|
|
- `DELETE` invalidation must be robust even when `context.data.id` is missing.
|
|
|
|
## Route validation
|
|
|
|
- SSR route validation is active in `config.js`.
|
|
- Public page URLs are language-prefixed (`/de/...`, `/en/...`), while `content.path` in the DB is stored without that prefix.
|
|
- `ssrValidatePath()` must strip the language prefix before querying content and return a canonical language-prefixed URL when needed.
|
|
|
|
## 404 signaling
|
|
|
|
The SSR hook (`get_read.js`) checks `context.is404` after rendering to determine the HTTP status code. If `true`, it returns HTTP 404 with the rendered 404 page HTML (and does not cache the result).
|
|
|
|
`NotFound.svelte` sets `context.is404 = true` during SSR. When the component renders (only when the page is not found), its top-level script sets the flag. The goja runtime provides `context` as a global during SSR, so it's available from the compiled frontend code.
|
|
|
|
When adding a 404 page or changing the not-found logic, ensure `context.is404` is still set during SSR.
|