diff --git a/web/next.config.mjs b/web/next.config.mjs index 3ffcc6c..deac8d3 100644 --- a/web/next.config.mjs +++ b/web/next.config.mjs @@ -22,6 +22,13 @@ function remotePatterns() { const nextConfig = { output: "standalone", + cacheComponents: true, + partialPrefetching: true, + // Next renders every page per request, uncached, for the crawlers and + // link-preview bots on its "HTML-limited" list, so their metadata is never + // streamed after
. No page here streams metadata (it all comes from + // cached CMS data), so no bot needs that; this pattern matches none + htmlLimitedBots: /(?!)/, images: { remotePatterns: remotePatterns(), formats: ["image/avif", "image/webp"], diff --git a/web/src/app/[...url]/page.tsx b/web/src/app/[...url]/page.tsx index b753d05..dea2a56 100644 --- a/web/src/app/[...url]/page.tsx +++ b/web/src/app/[...url]/page.tsx @@ -1,5 +1,5 @@ import { graphql } from "@/gql"; -import { getClient } from "@/app/client"; +import { cmsQuery } from "@/app/client"; import { Metadata, ResolvingMetadata } from "next"; import { notFound } from "next/navigation"; import { @@ -8,6 +8,13 @@ import { } from "@/components/general/GenericPageView"; import { getSeoMetadata } from "@/lib/seo"; +// Fail the build if this route stops being fully prerendered +export const ensureStatic = "navigation"; + +// Navigations wait for the page instead of showing a loading shell first: +// the response has to be able to turn into a real 404 for an unknown path +export const instant = false; + function getWagtailUrlPath(url: string[]): string { // for the page /foo/bar we need to look for `/home/foo/bar/` return `/home/${url.join("/")}/`; @@ -22,10 +29,7 @@ export async function generateStaticParams() { } } `); - const { data, error } = await getClient().query(allGenericSlugsQuery, {}); - if (error) { - throw new Error(error.message); - } + const data = await cmsQuery(allGenericSlugsQuery, {}); if (!data?.pages) { throw new Error("Failed to generate static params for generic subpages"); } diff --git a/web/src/app/aktuelt/[slug]/page.tsx b/web/src/app/aktuelt/[slug]/page.tsx index d20ab83..9580689 100644 --- a/web/src/app/aktuelt/[slug]/page.tsx +++ b/web/src/app/aktuelt/[slug]/page.tsx @@ -5,10 +5,17 @@ import { loadNewsPageProps, } from "@/components/news/NewsPageView"; import { getSeoMetadata } from "@/lib/seo"; +import { latestSlugParams } from "@/lib/staticParams"; + +// Fail the build if this route stops being fully prerendered +export const ensureStatic = "navigation"; + +// Navigations wait for the page instead of showing a loading shell first: +// the response has to be able to turn into a real 404 for an unknown path +export const instant = false; export async function generateStaticParams() { - // Prerender nothing at build time; render and cache on first request - return []; + return latestSlugParams("news.NewsPage"); } type Params = Promise<{ slug: string }>; diff --git a/web/src/app/aktuelt/page.tsx b/web/src/app/aktuelt/page.tsx index 7a0d54f..5e9ba5f 100644 --- a/web/src/app/aktuelt/page.tsx +++ b/web/src/app/aktuelt/page.tsx @@ -1,5 +1,5 @@ import { Metadata, ResolvingMetadata } from "next"; -import { getClient } from "@/app/client"; +import { cmsQuery } from "@/app/client"; import { NewsIndexView, loadNewsIndexProps, @@ -8,12 +8,14 @@ import { NewsIndexFragment } from "@/gql/graphql"; import { newsIndexMetadataQuery } from "@/lib/news"; import { getSeoMetadata } from "@/lib/seo"; +// Fail the build if this route stops being fully prerendered +export const ensureStatic = "navigation"; + export async function generateMetadata( _: unknown, parent: ResolvingMetadata ): Promise