Re:Nuxt

07/20
Lesson 07

Data Fetching

SSR 資料獲取

本章將介紹 Nuxt 如何在伺服器端獲取資料,實現真正的 SSR 和更好的 SEO。

1 核心概念 (Concept)

在傳統 Vue (SPA) 中,你通常會用 axiosonMounted 裡抓資料。這有個大缺點:

SEO 差:

爬蟲機器人來的時候,頁面是空的 (因為資料還在 Loading)。

效能差:

使用者要先下載完 JS,執行後才開始抓資料,等待時間長。

在伺服器端執行:

當使用者第一次進入頁面,Nuxt Server 會先抓好資料,把「有資料的 HTML」直接丟給瀏覽器 (SEO 滿分)。

防止重複抓取:

Nuxt 會把伺服器抓到的資料「打包」傳給瀏覽器 (Hydration),瀏覽器直接拿來用,不會再發送第二次 API 請求。

語法結構:

// 不需要 import, 支援 Top-level await
const { data, pending, error } = await useFetch('/api/users')

你一次獲得了「資料本身」、「讀取狀態」和「錯誤訊息」。

2 給 Claude Code 的中文指令 (Prompt) Prompt

我們要用一個真實的假資料 API (JSONPlaceholder) 來模擬文章列表。

請複製以下指令給 Claude:

請建立一個展示 API 資料的頁面:

  1. 建立新頁面 app/pages/posts.vue
  2. <script setup> 中,使用 await useFetch('https://jsonplaceholder.typicode.com/posts') 來抓取文章列表。
  3. 解構回傳物件,取得 data (重新命名為 posts), pending, error
  4. 在 template 中實作三種狀態的 UI:
    • pending 為 true 時:顯示「資料載入中...」。
    • error 存在時:顯示紅色錯誤訊息。
    • 當有資料時:使用 <ul>v-for 列出前 10 篇文章的標題 (title)。
  5. 修改首頁 app/pages/index.vue,加入連往 /posts 的連結。

3 驗收重點 (Acceptance Criteria)

請檢查 Claude 完成後的結果:

體驗 Loading 狀態: 點擊首頁的 /posts 連結。如果你的網路很快,可能看不到「載入中...」。

確認資料顯示: 畫面應該要列出一排文章標題。

檢視原始碼 (SEO 驗證): 這是最關鍵的一步。請在 /posts 頁面按右鍵選「檢視網頁原始碼 (View Page Source)」。搜尋文章的標題文字。

如果找得到文字: 恭喜!這是 SSR (Server-Side Rendering),Google 爬蟲看得到你的內容。
如果找不到 (只有一堆 JS): 代表你的 useFetch 設定有誤或變成了 CSR 模式。

💡 架構師筆記 (Top-level Await)

注意看 Claude 寫的 code,你會發現 await useFetch 直接寫在 <script setup> 的最外層,不需要包在 async function 裡。

這是 Vue 3 的 <script setup> 搭配 Nuxt 的特異功能。Nuxt 會自動處理非同步的等待,確保資料抓完才渲染頁面(這也是為什麼它能做 SSR 的原因)。
7