為什麼這個網站快得像幽靈一樣?
當你瀏覽那些用 Next.js 寫出來的世界級網站 (例如 Notion, TikTok 的網頁版) 時,你會有一個感覺:「它快得不可思議!」。 你點擊一個連結,畫面幾乎是「零秒」切換,完全沒有任何白畫面或轉圈圈的延遲。
難道是因為他們花了一個月幾十萬去買超級伺服器嗎? 不,秘密藏在 Next.js 最強大、也最容易讓新手崩潰的核心機制裡:Cache (快取)。
想像一個情境: 你的網站首頁會去呼叫資料庫,抓取「最新上架的 10 個商品」。 如果有一萬個客人同時湧入你的網站首頁,你的資料庫就會瞬間被狂轟猛炸一萬次,然後當機。 但 Next.js 說:「等一下!這 10 個商品在接下來的一小時內,根本就不會變動啊!」 於是,Next.js 在第一個客人來的時候,去資料庫抓了一次資料,然後把它 「快取 (拍照存擋)」 在伺服器裡。 接下來的 9999 個客人,Next.js 會直接把這張「照片」塞給他們,連資料庫碰都不碰一下。
這就是你的網站能夠快到飛起來,而且資料庫帳單極低的真正原因!
快取的雙面刃:為什麼我的畫面永遠不會更新?
享受極速快感是有代價的。 在 Next.js App Router 剛推出的時候,全球無數的工程師在論壇上崩潰哀嚎: 「我明明在後台把商品價格從 100 改成 500 了,為什麼前台畫面死都不更新?!我重新整理了 100 次還是一樣!」
這就是因為 Next.js 的預設行為非常激進:它預設會把你所有的 fetch 請求全部快取起來,而且是永久快取!
為了解決這個問題,你必須學會指揮 Next.js:「告訴它什麼時候可以偷懶用快取,什麼時候必須乖乖去抓最新資料。」
戰術一:SSG (靜態生成) - 永遠不變的化石
這適合用在「聯絡我們」、「公司簡介」這種幾百年不會改的頁面。 Next.js 預設就是這樣,你什麼都不用寫,它就會永久快取。
戰術二:SSR (伺服器動態渲染) - 絕對不偷懶
這適合用在「即時股價」、「購物車」、「會員個人資料」。你絕對不希望客人看到昨天快取的股價。 在 Vibe Coding 中,你只要告訴 AI 加入一行指令,強迫 Next.js 每次都去拿新資料。
// 告訴 Next.js:這個 fetch 絕對不准快取!每次有人看這頁都要去抓最新資料!
const res = await fetch('https://api.example.com/cart', {
cache: 'no-store'
});
戰術三:ISR (增量靜態重建) - 最完美的折衷方案
這是 Next.js 的殺手鐧。適合用在「部落格文章」、「商品列表」。 這些資料不需要「每一秒」都更新,但也「不能永遠不更新」。
// 告訴 Next.js:請快取這筆資料,但如果這筆資料超過 60 秒了,
// 有客人來看的時候,請在背景偷偷去抓最新的資料來更新快取。
const res = await fetch('https://api.example.com/products', {
next: { revalidate: 60 }
});
Vibe Prompt 實戰:打造完美的資料流架構
在真實的商業專案中,要精準設定這些快取策略非常燒腦。但這正是 Vibe Coder 發揮價值的地方。我們不需要死背語法,我們用商業邏輯來詠唱。
【Next.js 終極快取策略 Prompt】 我正在開發一個 Next.js App Router 的新聞網站。請幫我寫一個
app/news/page.tsx的 Server Component。 這個頁面需要去https://api.example.com/news抓取最新的新聞列表。請套用以下商業需求來處理 Data Fetching:
- 新聞不需要即時到每一秒都更新,請使用 ISR 策略,設定每 5 分鐘 (
revalidate: 300) 更新一次快取。- 請幫我加上完整的 Try-Catch 錯誤處理。如果 API 壞掉抓不到資料,請不要讓整個網頁當機,而是回傳一段友善的提示文字:「目前無法載入新聞,請稍後再試。」
- 請使用 TypeScript 幫我定義 News 的資料型別 (
id,title,publishedAt)。- 請附上詳細的中文註解,解釋這段快取機制的運作原理。
AI 產出的神級架構碼:
import { Suspense } from 'react';
// 1. 定義清楚的 TypeScript 型別,讓開發更安全
type NewsItem = {
id: string;
title: string;
publishedAt: string;
};
// 2. 這是一個 Server Component,我們直接在這裡 async 抓資料
export default async function NewsPage() {
let newsList: NewsItem[] = [];
let errorMsg = '';
try {
// 3. 核心魔法:使用 ISR (revalidate: 300)
// 這樣伺服器每 5 分鐘才會真正去呼叫一次真實 API,大大節省成本且載入極快!
const res = await fetch('https://api.example.com/news', {
next: { revalidate: 300 }
});
if (!res.ok) throw new Error('API 回應異常');
newsList = await res.json();
} catch (error) {
// 4. 完美處理錯誤,不讓畫面死白
console.error('抓取新聞失敗:', error);
errorMsg = '🚨 目前無法載入新聞,請稍後再試。工程師正在搶修中!';
}
return (
<main className="p-8">
<h1 className="text-3xl font-bold mb-6">最新商業新聞</h1>
{/* 發生錯誤時顯示防呆文字 */}
{errorMsg ? (
<p className="text-red-500">{errorMsg}</p>
) : (
<ul className="space-y-4">
{newsList.map((news) => (
<li key={news.id} className="p-4 bg-gray-100 rounded-lg shadow-sm">
<p className="text-sm text-gray-500">{news.publishedAt}</p>
<h2 className="text-xl font-semibold">{news.title}</h2>
</li>
))}
</ul>
)}
</main>
);
}
結語:站在巨人的肩膀上
經歷了這五章的 Next.js 課程,你已經從一個只會寫靜態 HTML 的新手,跨越到了能夠理解 Server/Client 邊界、路由導覽、以及企業級快取策略 (Caching) 的高階網頁工程師領域。
你可能會覺得 Next.js 的規則很多、很嚴格。但這正是它強大的原因。 它強迫你用「最正確、最符合效能與資安規範」的方式寫程式碼。而在 Vibe Coding 的加持下,這些複雜的語法細節都交由 AI 來處理,你只需要專注於最核心的問題:「這頁的資料應該要多新?這頁需不需要 SEO?」
掌握了 Next.js,你就等同於擁有了打造下一個百萬流量獨角獸網站的能力。大膽去嘗試,迎接 Web 3.0 與 AI 時代的無限可能吧!