diff --git a/vike-solid/renderer/+config.ts b/vike-solid/renderer/+config.ts index a210669..e7e78d1 100644 --- a/vike-solid/renderer/+config.ts +++ b/vike-solid/renderer/+config.ts @@ -29,7 +29,15 @@ const toggleSsrRelatedConfig: ConfigEffect = ({ export default { onRenderHtml: "import:vike-solid/renderer/onRenderHtml:onRenderHtml", onRenderClient: "import:vike-solid/renderer/onRenderClient:onRenderClient", + + // A page can define an onBeforeRender() hook to be run on the server, which + // can fetch data and return it as additional page context. Typically it will + // return the page's root Solid component's props and additional data that can + // be used by the renderers. + // It is a cumulative config option, so a web app using vike-solid can extend + // this list. passToClient: ["pageProps", "title"], + clientRouting: true, hydrationCanBeAborted: true, meta: { @@ -46,7 +54,7 @@ export default { env: "server-only", }, favicon: { - env: 'server-only' + env: "server-only", }, lang: { env: "server-only", @@ -67,7 +75,7 @@ declare global { Layout?: Component; title?: string | ((pageContext: PageContext) => string); description?: string; - favicon?: string + favicon?: string; /** * @default 'en' */ diff --git a/vike-solid/renderer/getTitle.ts b/vike-solid/renderer/getTitle.ts index b54cfb6..1241ba7 100644 --- a/vike-solid/renderer/getTitle.ts +++ b/vike-solid/renderer/getTitle.ts @@ -2,21 +2,27 @@ export { getTitle }; import type { PageContext } from "vike/types"; +/** + * Get the page's title if defined, either from the additional data fetched by + * the page's onBeforeRender() hook or from the config. + */ function getTitle(pageContext: PageContext): null | string { - if (typeof pageContext.title === "string") { + if (pageContext.title !== undefined) { return pageContext.title; } - if (pageContext.title) { - throw new Error("pageContext.title should be a string"); + + const titleConfig = pageContext.configEntries.title?.[0]; + if (!titleConfig) { + return null; } - const { title } = pageContext.config; + const title = titleConfig.configValue; if (typeof title === "string") { return title; } if (!title) { return null; } - const { configDefinedAt } = pageContext.configEntries.title![0]!; + const { configDefinedAt } = titleConfig; if (typeof title === "function") { const val = title(pageContext); if (typeof val === "string") { diff --git a/vike-solid/renderer/types.ts b/vike-solid/renderer/types.ts index 1573064..833fff6 100644 --- a/vike-solid/renderer/types.ts +++ b/vike-solid/renderer/types.ts @@ -8,8 +8,14 @@ type PageProps = Record; declare global { namespace Vike { interface PageContext { - Page: Page; - pageProps: Record; + // Note: Page will typically be undefined in onRenderHtml() when setting the `ssr` config flag + // to `false` (SPA mode). + Page?: Page; + + /** Properties of the page's root Solid component. */ + pageProps?: Record; + + /** <title>${title}</title> - has precedence over the config */ title?: string; } }