為什麼這個網站快得像幽靈一樣?

當你瀏覽那些用 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:

  1. 新聞不需要即時到每一秒都更新,請使用 ISR 策略,設定每 5 分鐘 (revalidate: 300) 更新一次快取。
  2. 請幫我加上完整的 Try-Catch 錯誤處理。如果 API 壞掉抓不到資料,請不要讓整個網頁當機,而是回傳一段友善的提示文字:「目前無法載入新聞,請稍後再試。」
  3. 請使用 TypeScript 幫我定義 News 的資料型別 (id, title, publishedAt)。
  4. 請附上詳細的中文註解,解釋這段快取機制的運作原理。

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 時代的無限可能吧!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!