Route Segment Config
Learn about how to configure options for Next.js route segments.
Good to know:
- The options outlined on this page are disabled if the
cacheComponentsflag is on, and will eventually be deprecated in the future. - Route Segment options only take effect in Server Component Pages, Layouts, or Route Handlers.
generateStaticParamscannot be used inside a'use client'file.
The Route Segment options allows you to configure the behavior of a Page, Layout, or Route Handler by directly exporting the following variables:
| Option | Type | Default |
|---|---|---|
dynamic | 'auto' | 'force-dynamic' | 'error' | 'force-static' | 'auto' |
dynamicParams | boolean | true |
revalidate | false | 0 | number | false |
fetchCache | 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store' | 'auto' |
runtime | 'nodejs' | 'edge' | 'nodejs' |
preferredRegion | 'auto' | 'global' | 'home' | string | string[] | 'auto' |
maxDuration | number | Set by deployment platform |
Options
dynamic
Change the dynamic behavior of a layout or page to fully static or fully dynamic.
Good to know: The new model in the app directory favors granular caching control at the fetch request level over the binary all-or-nothing model of getServerSideProps and getStaticProps at the page-level in the pages directory. The dynamic option is a way to opt back in to the previous model as a convenience and provides a simpler migration path.
-
'auto'(default): The default option to cache as much as possible without preventing any components from opting into dynamic behavior. -
'force-dynamic': Force dynamic rendering, which will result in routes being rendered for each user at request time. This option is equivalent to:- Setting the option of every
fetch()request in a layout or page to{ cache: 'no-store', next: { revalidate: 0 } }. - Setting the segment config to
export const fetchCache = 'force-no-store'
- Setting the option of every
-
'error': Force static rendering and cache the data of a layout or page by causing an error if any components use Dynamic APIs or uncached data. This option is equivalent to:getStaticProps()in thepagesdirectory.- Setting the option of every
fetch()request in a layout or page to{ cache: 'force-cache' }. - Setting the segment config to
fetchCache = 'only-cache'.
-
'force-static': Force static rendering and cache the data of a layout or page by forcingcookies,headers()anduseSearchParams()to return empty values. It is possible torevalidate,revalidatePath, orrevalidateTag, in pages or layouts rendered withforce-static.
Good to know:
- Instructions on how to migrate from
getServerSidePropsandgetStaticPropstodynamic: 'force-dynamic'anddynamic: 'error'can be found in the upgrade guide.
dynamicParams
Control what happens when a dynamic segment is visited that was not generated with generateStaticParams.
true(default): Dynamic segments not included ingenerateStaticParamsare generated on demand.false: Dynamic segments not included ingenerateStaticParamswill return a 404.
Good to know:
- This option replaces the
fallback: true | false | blockingoption ofgetStaticPathsin thepagesdirectory. - To statically render all paths the first time they're visited, you'll need to return an empty array in
generateStaticParamsor utilizeexport const dynamic = 'force-static'. - When
dynamicParams = true, the segment uses Streaming Server Rendering.
revalidate
Set the default revalidation time for a layout or page. This option does not override the revalidate value set by individual fetch requests.
false(default): The default heuristic to cache anyfetchrequests that set theircacheoption to'force-cache'or are discovered before a Dynamic API is used. Semantically equivalent torevalidate: Infinitywhich effectively means the resource should be cached indefinitely. It is still possible for individualfetchrequests to usecache: 'no-store'orrevalidate: 0to avoid being cached and make the route dynamically rendered. Or setrevalidateto a positive number lower than the route default to increase the revalidation frequency of a route.0: Ensure a layout or page is always dynamically rendered even if no Dynamic APIs or uncached data fetches are discovered. This option changes the default offetchrequests that do not set acacheoption to'no-store'but leavesfetchrequests that opt into'force-cache'or use a positiverevalidateas is.number: (in seconds) Set the default revalidation frequency of a layout or page tonseconds.
Good to know:
- The revalidate value needs to be statically analyzable. For example
revalidate = 600is valid, butrevalidate = 60 * 10is not. - The revalidate value is not available when using
runtime = 'edge'. - In Development, Pages are always rendered on-demand and are never cached. This allows you to see changes immediately without waiting for a revalidation period to pass.
Revalidation Frequency
- The lowest
revalidateacross each layout and page of a single route will determine the revalidation frequency of the entire route. This ensures that child pages are revalidated as frequently as their parent layouts. - Individual
fetchrequests can set a lowerrevalidatethan the route's defaultrevalidateto increase the revalidation frequency of the entire route. This allows you to dynamically opt-in to more frequent revalidation for certain routes based on some criteria.
fetchCache
This is an advanced option that should only be used if you specifically need to override the default behavior.
By default, Next.js will cache any fetch() requests that are reachable before any Dynamic APIs are used and will not cache fetch requests that are discovered after Dynamic APIs are used.
fetchCache allows you to override the default cache option of all fetch requests in a layout or page.
'auto'(default): The default option to cachefetchrequests before Dynamic APIs with thecacheoption they provide and not cachefetchrequests after Dynamic APIs.'default-cache': Allow anycacheoption to be passed tofetchbut if no option is provided then set thecacheoption to'force-cache'. This means that evenfetchrequests after Dynamic APIs are considered static.'only-cache': Ensure allfetchrequests opt into caching by changing the default tocache: 'force-cache'if no option is provided and causing an error if anyfetchrequests usecache: 'no-store'.'force-cache': Ensure allfetchrequests opt into caching by setting thecacheoption of allfetchrequests to'force-cache'.'default-no-store': Allow anycacheoption to be passed tofetchbut if no option is provided then set thecacheoption to'no-store'. This means that evenfetchrequests before Dynamic APIs are considered dynamic.'only-no-store': Ensure allfetchrequests opt out of caching by changing the default tocache: 'no-store'if no option is provided and causing an error if anyfetchrequests usecache: 'force-cache''force-no-store': Ensure allfetchrequests opt out of caching by setting thecacheoption of allfetchrequests to'no-store'. This forces allfetchrequests to be re-fetched every request even if they provide a'force-cache'option.
Cross-route segment behavior
- Any options set across each layout and page of a single route need to be compatible with each other.
- If both the
'only-cache'and'force-cache'are provided, then'force-cache'wins. If both'only-no-store'and'force-no-store'are provided, then'force-no-store'wins. The force option changes the behavior across the route so a single segment with'force-*'would prevent any errors caused by'only-*'. - The intention of the
'only-*'and'force-*'options is to guarantee the whole route is either fully static or fully dynamic. This means:- A combination of
'only-cache'and'only-no-store'in a single route is not allowed. - A combination of
'force-cache'and'force-no-store'in a single route is not allowed.
- A combination of
- A parent cannot provide
'default-no-store'if a child provides'auto'or'*-cache'since that could make the same fetch have different behavior.
- If both the
- It is generally recommended to leave shared parent layouts as
'auto'and customize the options where child segments diverge.
runtime
We recommend using the Node.js runtime for rendering your application. This option cannot be used in Proxy.
Good to know: Using runtime: 'edge' is not supported for Cache Components.
'nodejs'(default)'edge'
preferredRegion
Support for preferredRegion, and regions supported, is dependent on your deployment platform.
Good to know:
- If a
preferredRegionis not specified, it will inherit the option of the nearest parent layout. - The root layout defaults to
allregions.
maxDuration
By default, Next.js does not limit the execution of server-side logic (rendering a page or handling an API).
Deployment platforms can use maxDuration from the Next.js build output to add specific execution limits.
Note: This setting requires Next.js 13.4.10 or higher.
Good to know:
- If using Server Actions, set the
maxDurationat the page level to change the default timeout of all Server Actions used on the page.
generateStaticParams
The generateStaticParams function can be used in combination with dynamic route segments to define the list of route segment parameters that will be statically generated at build time instead of on-demand at request time.
See the API reference for more details.