Question presented to candidate: "Our product page is static except for the cart count and a personal greeting, so the whole route renders per request. How would Partial Prerendering change that, and how do you turn it on in Next.js 16?"
What a strong answer should cover:
- PPR prerenders a static shell of a route at build time and leaves holes for request-time content, marked by Suspense boundaries.
- At request time the shell and the fallbacks are sent immediately, and the dynamic parts stream into the same response.
- In Next.js 16 it is part of Cache Components: enable
cacheComponents: true(since 16.4 together withpartialPrefetching, which new create-next-app projects already set); the oldexperimental.pprflag now fails the build. - Request-time APIs such as
cookies()must sit inside Suspense (or be cached with 'use cache'), otherwise the build reports blocking data. - Route segment config like
dynamicandrevalidateis not compatible withcacheComponents.
Clarifying questions expected:
- "Which parts are personalised or need request data?" β those become Suspense holes.
- "Are you on Next.js 16?" β the configuration differs from the 15 canary.
Code / implementation expected: Yes β the config flag and a page with one dynamic hole.