Pre-renderingc和Staged Hydration是一種優化技術,用於提升應用程序的加載速度和用戶體驗。
在預渲染和水合過程中,通過分階段處理不同部分的渲染,能夠更有效地利用資源並減少初始加載時間。
預渲染是指在頁面加載之前,先在服務器端生成靜態 HTML 內容。Next.js 提供了兩種主要的預渲染方式:
水合是指在客戶端將預渲染的靜態 HTML 轉換為可交互的 React 組件的過程。這個過程需要將靜態內容“水合”成動態應用,使其具備交互能力。
分階段水合指的是將水合過程分成多個階段進行,而不是一次性完成整個頁面的水合。這種技術能夠減少初始加載時間,提升首屏渲染性能。
React.lazy 和 Suspense 分階段水合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和加載。這種技術有助於提升整體用戶體驗,特別是在應用初次加載時。