15
Re:Nuxt 100 天練習曲
Day 15

為網站裝上電話線 (資料獲取心法)

Day 15·資料獲取·SSR vs CSR

一個網站如果不能跟外界溝通、獲取新資料,就像一座孤島。今天,我們要來為網站「接上電話線」,學習如何從遠方伺服器 (API) 獲取資料。

1. 為什麼不能直接用 fetch? —「重複點餐」問題

在一般的純前端專案中,我們可能會用瀏覽器內建的 fetch 來要資料。但在 Nuxt (一個全端框架) 中,這樣做會出問題。

比喻一下:

想像您去一家高科技餐廳。在您進門時,服務生 (Nuxt 伺服器) 已經預先為您點好了一份套餐,並準備好要端上桌。 但當您坐到位置上後,您自己 (Nuxt 客戶端) 又拿出手機,點了一模一樣的套餐。

這就是「重複獲取 (Double Fetching)」,同一份資料被請求了兩次,一次在伺服器,一次在客戶端。這會浪費網路資源,也可能導致頁面顯示錯亂。

2. Nuxt 的聰明解法 —「外帶餐盒 (Payload)」

Nuxt 的解決方法很聰明。

延續比喻:

服務生 (伺服器) 點完餐後,不會立刻上菜,而是會把餐點用一個「外帶餐盒 (Payload)」打包好,連同您的座位資訊 (HTML) 一起送到您的桌上。 當您坐到位置上後 (客戶端),您會先看看桌上有沒有這個餐盒。如果有,就直接打開來吃,不需要再點一次餐

這個「外帶餐盒」機制,就是 Nuxt 確保資料只會被獲取一次的核心魔法。

3. Nuxt 的三大神器 — 該用哪一個?

為了實現這個魔法,Nuxt 提供了三種主要工具,它們各有不同的使用時機:

$ $fetch (手動打電話)

定位:最單純、最直接的工具。

時機:適合用在使用者互動後才觸發的請求。例如,使用者填完表單後,按下「送出」按鈕。它不會使用「外帶餐盒」機制。

F useFetch (自動訂餐系統)

定位:我們最常用的主力,90% 的情況下用它就對了。

時機:適合在一進入頁面就需要顯示的資料。例如,文章列表、商品資訊。它會自動處理好所有「外帶餐盒」的麻煩事。

A useAsyncData (萬能主廚)

定位:最強大、最靈活的工具,是 useFetch 的內核。

時機:當您的資料來源不是一個簡單的 API 網址,而是需要執行更複雜的非同步邏輯時(例如,使用第三方的 SDK 或存取本地資料庫),就換這位主廚上場。

今日總結

今天我們建立了三個關鍵觀念:

1

在 Nuxt 中直接用 fetch 會導致重複獲取的問題。

2

Nuxt 透過「Payload」機制來解決這個問題,確保資料只被獲取一次。

3

我們有三種工具 ($fetch, useFetch, useAsyncData),各有其最適合的使用場景。

觀念清楚了,明天我們就來實際動手,深入學習最好用的主力工具 useFetch