use cache: private
Learn how to use the "use cache: private" directive to cache functions that access runtime request APIs.
The 'use cache: private' directive allows functions to access runtime request APIs like cookies(), headers(), and searchParams within a cached scope. In production, matching calls within one request can reuse the same result, but Next.js does not store it in a server cache across requests.
The client router can keep the rendered output in browser memory for the stale time configured with cacheLife. This client-side cache does not persist across page reloads.
Reach for 'use cache: private' when:
- You want to cache a function that already accesses runtime data, and refactoring to move the runtime access outside and pass values as arguments is not practical.
- You need request-specific data to be excluded from server caches that persist across production requests.
Private Cache Functions run at request time and are excluded from static shell generation. To start a private Cache Function before a component needs its result, see Preloading data.
It is not possible to configure custom cache handlers for 'use cache: private'.
For a comparison of the different cache directives, see How use cache: remote differs from use cache and use cache: private.
Usage
To use 'use cache: private', enable the cacheComponents flag in your next.config.ts file:
Then add 'use cache: private' to your function along with a cacheLife configuration.
Basic example
In this example, we demonstrate that you can access cookies within a 'use cache: private' scope:
Good to know: The stale time must be at least 30 seconds for per-link prefetching to work, and at least 5 minutes for the content to be included in the route's App Shell. See cacheLife prerendering behavior for details.
Configuring the client stale time
Private Cache Functions contribute their stale time to the route's Client Cache. If a function only needs request-scoped deduplication, use cacheLife({ stale: Infinity }) to keep it from lowering the route's stale time.
Next.js uses the shortest stale time from the route's cache entries, so another cache or route setting can still set a finite value. Setting stale to Infinity does not store the private result on the server across production requests. Use a finite value when the client router should revalidate personalized output after a known interval.
Request APIs allowed in private caches
The following request-specific APIs can be used inside 'use cache: private' functions:
| API | Allowed in use cache | Allowed in 'use cache: private' |
|---|---|---|
cookies() | No | Yes |
headers() | No | Yes |
searchParams | No | Yes |
connection() | No | No |
Note: The connection() API is prohibited in both use cache and 'use cache: private' as it provides connection-specific information that cannot be safely cached.
Version History
| Version | Changes |
|---|---|
v16.0.0 | "use cache: private" is enabled with the Cache Components feature. |