Pre-renderingc和Staged Hydration是一種優化技術,用於提升應用程序的加載速度和用戶體驗。

在預渲染和水合過程中,通過分階段處理不同部分的渲染,能夠更有效地利用資源並減少初始加載時間。

預渲染 (Pre-rendering)

預渲染是指在頁面加載之前,先在服務器端生成靜態 HTML 內容。Next.js 提供了兩種主要的預渲染方式:

  1. 靜態生成 (Static Generation, SSG):在構建時生成靜態 HTML。
  2. 服務器端渲染 (Server-Side Rendering, SSR):在每次請求時生成 HTML。

水合 (Hydration)

水合是指在客戶端將預渲染的靜態 HTML 轉換為可交互的 React 組件的過程。這個過程需要將靜態內容“水合”成動態應用,使其具備交互能力。

分階段水合 (Staged Hydration)

分階段水合指的是將水合過程分成多個階段進行,而不是一次性完成整個頁面的水合。這種技術能夠減少初始加載時間,提升首屏渲染性能。

具體策略

  1. 優先加載和水合關鍵組件:先水合最重要的部分,如頁面首屏內容,確保用戶能夠快速看到主要內容。
  2. 延遲加載和水合次要組件:對於非關鍵內容或不在首屏範圍內的部分,延遲其加載和水合,從而優化整體性能。

使用示例

使用 React.lazySuspense 分階段水合

import React, { Suspense, lazy } from 'react';

// 懶加載次要組件
const LazyComponent = lazy(() => import('../components/LazyComponent'));

const Page = ({ initialData }) => (
  <div>
    <h1>Hello World</h1>
    {/* 首屏關鍵內容立即加載和水合 */}
    <p>{initialData}</p>

    {/* 使用 Suspense 延遲加載次要內容 */}
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  </div>
);

export async function getStaticProps() {
  // 預渲染時獲取數據
  const res = await fetch('<https://api.example.com/data>');
  const initialData = await res.json();

  return {
    props: {
      initialData,
    },
  };
}

export default Page;

使用 next/dynamic 分階段水合

import dynamic from 'next/dynamic';

// 動態加載次要組件,禁用 SSR
const DynamicComponent = dynamic(() => import('../components/DynamicComponent'), {
  ssr: false,
  loading: () => <p>Loading...</p>,
});

const Page = ({ initialData }) => (
  <div>
    <h1>Hello World</h1>
    {/* 首屏關鍵內容立即加載和水合 */}
    <p>{initialData}</p>

    {/* 動態加載次要內容 */}
    <DynamicComponent />
  </div>
);

export async function getStaticProps() {
  // 預渲染時獲取數據
  const res = await fetch('<https://api.example.com/data>');
  const initialData = await res.json();

  return {
    props: {
      initialData,
    },
  };
}

export default Page;

總結

通過Staged Hydration技術,可以優化應用的加載性能,確保用戶能夠快速看到關鍵內容,同時在後台逐步完成其餘部分的Hydration和加載。這種技術有助於提升整體用戶體驗,特別是在應用初次加載時。