路由區段設定
路由區段選項允許您透過直接導出以下變數來配置 頁面、佈局 或 路由處理器 的行為:
| 選項 | 類型 | 預設值 |
|---|---|---|
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 | 由部署平台設定 |
export const dynamic = 'auto'
export const dynamicParams = true
export const revalidate = false
export const fetchCache = 'auto'
export const runtime = 'nodejs'
export const preferredRegion = 'auto'
export const maxDuration = 5
export default function MyComponent() {}export const dynamic = 'auto'
export const dynamicParams = true
export const revalidate = false
export const fetchCache = 'auto'
export const runtime = 'nodejs'
export const preferredRegion = 'auto'
export const maxDuration = 5
export default function MyComponent() {}須知事項:
- 目前設定選項的值需要是靜態可分析的。例如
revalidate = 600是有效的,但revalidate = 60 * 10則無效。
選項
dynamic
變更佈局或頁面的動態行為,使其完全靜態或完全動態。
export const dynamic = 'auto'
// 'auto' | 'force-dynamic' | 'error' | 'force-static'export const dynamic = 'auto'
// 'auto' | 'force-dynamic' | 'error' | 'force-static'須知事項:
app目錄中的新模型傾向於在fetch請求層級進行細粒度的快取控制,而不是pages目錄中getServerSideProps和getStaticProps在頁面層級的二元全有或全無模型。dynamic選項是一種回退到先前模型的便利方式,並提供了更簡單的遷移路徑。
-
'auto'(預設): 預設選項,盡可能快取,同時不阻止任何元件選擇動態行為。 -
'force-dynamic': 強制 動態渲染,這將導致每個使用者在請求時渲染路由。此選項等同於pages目錄中的getServerSideProps()。 -
'error': 強制靜態渲染並快取佈局或頁面的數據,如果任何元件使用 動態函數 或未快取的數據,則會引發錯誤。此選項等同於:pages目錄中的getStaticProps()。- 將佈局或頁面中每個
fetch()請求的選項設定為{ cache: 'force-cache' }。 - 將區段配置設定為
fetchCache = 'only-cache', dynamicParams = false。 dynamic = 'error'會將dynamicParams的預設值從true變更為false。您可以透過手動設定dynamicParams = true來選擇為未由generateStaticParams生成的動態參數動態渲染頁面。
-
'force-static': 強制靜態渲染並快取佈局或頁面的數據,透過強制cookies()、headers()和useSearchParams()返回空值。
須知事項:
- 有關如何從
getServerSideProps和getStaticProps遷移到dynamic: 'force-dynamic'和dynamic: 'error'的說明,請參閱 升級指南。
dynamicParams
控制當訪問未使用 generateStaticParams 生成的動態區段時會發生什麼。
export const dynamicParams = true // true | false,export const dynamicParams = true // true | false,true(預設): 未包含在generateStaticParams中的動態區段會按需生成。false: 未包含在generateStaticParams中的動態區段將返回 404。
須知事項:
- 此選項取代了
pages目錄中getStaticPaths的fallback: true | false | blocking選項。- 當
dynamicParams = true時,該區段使用 串流伺服器渲染 (Streaming Server Rendering)。- 如果使用了
dynamic = 'error'和dynamic = 'force-static',則會將dynamicParams的預設值變更為false。
revalidate
為佈局或頁面設定預設的重新驗證時間。此選項不會覆蓋個別 fetch 請求設定的 revalidate 值。
export const revalidate = false
// false | 0 | numberexport const revalidate = false
// false | 0 | numberfalse(預設): 預設啟發式方法,快取任何將其cache選項設定為'force-cache'的fetch請求,或在使用 動態函數 之前發現的請求。語意上等同於revalidate: Infinity,這實際上意味著資源應無限期快取。個別fetch請求仍可使用cache: 'no-store'或revalidate: 0來避免被快取並使路由動態渲染。或者將revalidate設定為低於路由預設值的正數,以增加路由的重新驗證頻率。0: 確保佈局或頁面始終 動態渲染,即使未發現動態函數或未快取的數據獲取。此選項會將未設定cache選項的fetch請求的預設值變更為'no-store',但保留選擇'force-cache'或使用正數revalidate的fetch請求不變。number: (以秒為單位) 將佈局或頁面的預設重新驗證頻率設定為n秒。
須知事項:
revalidate選項僅在使用 Node.js 運行時 (Node.js Runtime) 時可用。這意味著將revalidate選項與runtime = 'edge'一起使用將無效。
重新驗證頻率
- 單一路由的每個佈局和頁面中的最低
revalidate值將決定整個路由的重新驗證頻率。這確保子頁面與其父佈局一樣頻繁地重新驗證。 - 個別
fetch請求可以設定比路由預設revalidate更低的revalidate,以增加整個路由的重新驗證頻率。這允許您根據某些條件動態選擇更頻繁地重新驗證某些路由。
fetchCache
這是一個進階選項,僅在您需要特別覆蓋預設行為時使用。
預設情況下,Next.js 會快取 任何在使用 動態函數 之前可達的 fetch() 請求,並且 不會快取 在使用動態函數之後發現的 fetch 請求。
fetchCache 允許您覆蓋佈局或頁面中所有 fetch 請求的預設 cache 選項。
export const fetchCache = 'auto'
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'export const fetchCache = 'auto'
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store''auto'(預設): 預設選項,根據fetch請求提供的cache選項快取動態函數之前的請求,不快取動態函數之後的請求。'default-cache': 允許將任何cache選項傳遞給fetch,但如果未提供選項,則將cache選項設定為'force-cache'。這意味著即使動態函數之後的fetch請求也被視為靜態。'only-cache': 確保所有fetch請求選擇快取,如果未提供選項,則將預設值變更為cache: 'force-cache',如果任何fetch請求使用cache: 'no-store',則會引發錯誤。'force-cache': 確保所有fetch請求選擇快取,將所有fetch請求的cache選項設定為'force-cache'。'default-no-store': 允許將任何cache選項傳遞給fetch,但如果未提供選項,則將cache選項設定為'no-store'。這意味著即使動態函數之前的fetch請求也被視為動態。'only-no-store': 確保所有fetch請求選擇不進行快取,如果未提供選項,則將預設值變更為cache: 'no-store',如果任何fetch請求使用cache: 'force-cache',則會引發錯誤。'force-no-store': 確保所有fetch請求選擇不進行快取,將所有fetch請求的cache選項設定為'no-store'。這強制所有fetch請求在每次請求時重新獲取,即使它們提供了'force-cache'選項。
跨路由區段行為
- 單一路由的每個佈局和頁面中設定的所有選項需要彼此相容。
- 如果同時提供
'only-cache'和'force-cache',則'force-cache'優先。如果同時提供'only-no-store'和'force-no-store',則'force-no-store'優先。強制選項會變更整個路由的行為,因此具有'force-*'的單一區段將防止由'only-*'引起的任何錯誤。 'only-*'和force-*'選項的目的是保證整個路由要麼完全靜態,要麼完全動態。這意味著:- 不允許在單一路由中同時使用
'only-cache'和'only-no-store'。 - 不允許在單一路由中同時使用
'force-cache'和'force-no-store'。
- 不允許在單一路由中同時使用
- 如果子區段提供
'auto'或'*-cache',則父區段不能提供'default-no-store',因為這可能使相同的fetch具有不同的行為。
- 如果同時提供
- 通常建議將共享的父佈局保留為
'auto',並在子區段分歧處自訂選項。
runtime
export const runtime = 'nodejs'
// 'nodejs' | 'edge'export const runtime = 'nodejs'
// 'nodejs' | 'edge''nodejs'(預設)'edge'
了解更多關於 邊緣和 Node.js 運行時 (Edge and Node.js runtimes)。
preferredRegion
export const preferredRegion = 'auto'
// 'auto' | 'global' | 'home' | ['iad1', 'sfo1']export const preferredRegion = 'auto'
// 'auto' | 'global' | 'home' | ['iad1', 'sfo1']preferredRegion 的支持以及支持的區域取決於您的部署平台。
須知事項:
- 如果未指定
preferredRegion,它將繼承最接近的父佈局的選項。- 根佈局預設為
all區域。
maxDuration
預設情況下,Next.js 不限制伺服器端邏輯的執行時間(渲染頁面或處理 API)。
部署平台可以使用 Next.js 構建輸出中的 maxDuration 來添加特定的執行限制。
例如,在 Vercel 上。
注意: 此設定需要 Next.js 13.4.10 或更高版本。
export const maxDuration = 5export const maxDuration = 5須知事項:
- 如果使用 伺服器操作 (Server Actions),請在頁面層級設定
maxDuration以變更頁面上使用的所有伺服器操作的預設逾時時間。
generateStaticParams
generateStaticParams 函數可以與 動態路由區段 結合使用,以定義在構建時靜態生成的路由區段參數列表,而不是在請求時按需生成。
詳情請參閱 API 參考。