載入介面與串流
特殊檔案 loading.js
可協助您使用 React Suspense 建立有意義的載入介面 (Loading UI)。透過此約定,您可以在路由區段內容載入時,從伺服器顯示即時載入狀態。渲染完成後,新內容會自動替換顯示。

即時載入狀態
即時載入狀態是導航時立即顯示的備用介面。您可以預先渲染載入指示器,例如骨架畫面 (skeleton) 或旋轉圖示 (spinner),或是未來畫面的小型但有意義的部分,例如封面照片、標題等。這有助於讓使用者了解應用程式正在回應,並提供更好的使用者體驗。
在資料夾內新增 loading.js
檔案即可建立載入狀態。

在同一個資料夾中,loading.js
會嵌套在 layout.js
內。它會自動將 page.js
檔案及其下方的所有子項目包裹在 <Suspense>
邊界中。

須知事項:
- 即使採用以伺服器為中心的路由,導航仍是即時的。
- 導航是可中斷的,這表示變更路由時無需等待路由內容完全載入即可導航至其他路由。
- 共享版面配置 (shared layouts) 在新路由區段載入時仍可保持互動。
建議: 對路由區段 (layouts 和 pages) 使用
loading.js
約定,因為 Next.js 會對此功能進行優化。
使用 Suspense 串流
除了 loading.js
外,您也可以手動為自己的介面元件建立 Suspense 邊界。App Router 支援在 Node.js 和 Edge 執行環境中使用 Suspense 進行串流。
須知事項:
- 某些瀏覽器會緩衝串流回應。您可能直到串流回應超過 1024 位元組才會看到串流內容。這通常只影響「hello world」應用程式,而不會影響實際應用程式。
什麼是串流?
要了解串流在 React 和 Next.js 中的運作方式,有必要先理解伺服器渲染 (SSR) 及其限制。
使用 SSR 時,在使用者能看到並與頁面互動之前,需要完成一系列步驟:
- 首先,在伺服器上擷取給定頁面的所有資料。
- 接著,伺服器渲染頁面的 HTML。
- 將頁面的 HTML、CSS 和 JavaScript 傳送至客戶端。
- 使用產生的 HTML 和 CSS 顯示非互動式使用者介面。
- 最後,React 水合 (hydrate) 使用者介面,使其具有互動性。

這些步驟是順序且阻塞的,這表示伺服器只能在所有資料擷取完成後才能渲染頁面的 HTML。而在客戶端,React 也只有在頁面中所有元件的程式碼下載完成後才能水合介面。
React 和 Next.js 的 SSR 透過盡快向使用者顯示非互動式頁面,有助於提升感知的載入效能。

然而,由於伺服器上的所有資料擷取都必須完成後才能向使用者顯示頁面,因此速度可能仍然較慢。
串流可讓您將頁面的 HTML 分解為較小的區塊,並逐步將這些區塊從伺服器傳送至客戶端。

這使得頁面的某些部分可以更早顯示,而無需等待所有資料載入後才能渲染任何介面。
串流與 React 的元件模型配合良好,因為每個元件都可以視為一個區塊。具有較高優先順序 (例如產品資訊) 或不依賴資料的元件 (例如版面配置) 可以先傳送,而 React 可以更早開始水合。具有較低優先順序的元件 (例如評論、相關產品) 可以在其資料擷取完成後,在同一個伺服器請求中傳送。

當您希望防止長時間的資料請求阻擋頁面渲染時,串流特別有益,因為它可以減少首次位元組時間 (TTFB) 和首次內容繪製時間 (FCP)。它也有助於改善互動時間 (TTI),特別是在較慢的裝置上。
範例
<Suspense>
的運作方式是包裹執行非同步動作 (例如擷取資料) 的元件,在動作進行時顯示備用介面 (例如骨架畫面、旋轉圖示),並在動作完成後替換為您的元件。
使用 Suspense 可獲得以下好處:
- 串流伺服器渲染 - 從伺服器逐步渲染 HTML 至客戶端。
- 選擇性水合 - React 會根據使用者互動優先處理哪些元件應先具有互動性。
如需更多 Suspense 範例和使用情境,請參閱 React 文件。
SEO
- Next.js 會先等待
generateMetadata
內的資料擷取完成,再將介面串流至客戶端。這保證串流回應的第一部分包含<head>
標籤。 - 由於串流是伺服器渲染的,因此不會影響 SEO。您可以使用 Google 的豐富結果測試工具來查看您的頁面在 Google 網路爬蟲中的顯示方式,並檢視序列化的 HTML (來源)。
狀態碼
串流時會傳回 200
狀態碼,表示請求成功。
伺服器仍可在串流內容本身中向客戶端傳達錯誤或問題,例如使用 redirect
或 notFound
時。由於回應標頭已傳送至客戶端,因此無法更新回應的狀態碼。這不會影響 SEO。