Astro - 基礎入門4. Astro 5.x 最具威力的高級特性

更新 發佈閱讀 10 分鐘

第四課:Server Islands 與 SSR (伺服器端渲染)

在之前的課程中,我們的網站是「靜態」的。

但在真實應用中,有些內容不能是靜態的(例如:用戶登入狀態、即時庫存、或是根據地理位置推薦的內容)。

1. 核心觀念:Server Islands vs. Client Islands

  • Client Islands (client:load): 在瀏覽器下載 JS 並執行。適合互動(按鈕、滑動視窗)。
  • Server Islands (server:defer): 這是 Astro 5 的新武器。它允許頁面大部分是靜態的(極速),但將「慢速或動態」的部分留給伺服器處理,並在處理完後自動補洞

2. 手把手實作:開啟 SSR 模式

要使用伺服器功能,我們需要把輸出模式改為 server

  1. 在終端機執行(以 Vercel 為例,你也可以選 Node.js):
    npx astro add vercel
  2. 這會自動修改你的 astro.config.mjs,將 output 設為 'server'
    當你添加了 adapter: vercel() 卻沒有看到 output 屬性時,這代表 Astro 目前正處於 「混合模式 (Hybrid Mode)」或「伺服器端渲染模式 (SSR)」 的預備狀態,但預設值可能尚未顯式寫出,需自行加入。
    // @ts-check
    import { defineConfig } from 'astro/config'

    import react from '@astrojs/react'

    import vercel from '@astrojs/vercel'

    // https://astro.build/config
    export default defineConfig({
    integrations: [react()],
    adapter: vercel(),
    output: 'server',
    })

3. 手把手實作:建立一個 Server Island

假設我們要在部落格底部顯示「當前伺服器時間」,這個時間必須是準確的,不能在構建時寫死。

建立 src/components/ServerTime.astro

---
// 這個組件會在伺服器上執行
const time = new Date().toLocaleTimeString();
// 模擬一個慢速的資料庫查詢
await new Promise(resolve => setTimeout(resolve, 2000));
---
<div class="server-box">
<p>伺服器即時時間:{time}</p>
<p>(此組件是延遲載入的 Server Island)</p>
</div>

<style>
.server-box { border: 2px dashed #ff5d01; padding: 1rem; background: #fff5f0; }
</style>

在 src/pages/index.astro 中使用它:

---
import BaseLayout from '../layouts/BaseLayout.astro';
import ServerTime from '../components/ServerTime.astro';
---
<BaseLayout pageTitle="Astro 5 實驗室">
<h2>歡迎來到我的動態首頁</h2>

<ServerTime server:defer>
<p slot="fallback" class="loading">正在連線伺服器...</p>
</ServerTime>
</BaseLayout>

📝 第四課練習題

任務目標:建立一個動態的「隨機推薦」組件。

  1. 建立一個名為 RandomQuote.astro 的組件。
  2. 在該組件的 Code Fence 中,使用 fetch() 從 API 抓取一句隨機名言(例如:https://api.quotable.io/random)。
  3. 在 about.astro 頁面中,以 server:defer 的方式引入這個組件。
  4. 設定一個具備 Loading 樣式的 fallback 內容。
  5. 進階挑戰: 嘗試將原本的部落格清單頁面 blog.astro 改為混合模式——頁面頂部標題是靜態的,但文章清單改由 server:defer 渲染。

第四課練習題實作放在下一篇 ( 我也是第一次學習,自己試作,不一定是對的喔👍 )
然後 https://api.quotable.io/random 憑證過期了,可以找別的 api 來玩


📚 額外筆記

※ server:defer

在 Astro 裡:

<ServerTime server:defer />

這是一個 Astro 指令(directive),意思是:
👉 把這個元件延後到「伺服器端」再執行 / 回傳內容
server:defer = 不要在建置或一開始就跑,等請求進來再由 Server 動態產生

拆開來看

1️⃣ <ServerTime />

這是一個 Astro / Framework 元件
通常用來顯示「現在伺服器時間」

---
// ServerTime.astro
const now = new Date().toLocaleString()
---
<p>Server Time: {now}</p>

2️⃣ server:defer 是什麼?

它是 Astro 的 Server Directive

server:defer

代表:

vocus|新世代的創作平台

實際行為差異

❌ 沒用 server:defer

<ServerTime />

👉 在 build 時就固定
👉 所有人看到一樣的時間(不會變)

✅ 使用 server:defer

<ServerTime server:defer />

👉 每次 request 才計算時間
👉 顯示真正的「現在時間」

適合用在什麼情境?

✅ 適合

  • 現在時間
  • 後端 API 結果
  • Cookie / Header 相關資料
  • 使用者相關狀態(未登入前端 JS)

❌ 不適合

  • 純靜態內容
  • 需要前端互動(點擊、動畫)

和其他指令的對比

vocus|新世代的創作平台

※ <p slot="fallback">...</p>

👉 這是「後端內容還沒回來之前,先顯示的畫面」

你的程式碼在做什麼

<ServerTime server:defer>
<p slot="fallback" class="loading">
正在連線伺服器...
</p>
</ServerTime>

實際流程是:

1️⃣ 頁面一開始載入

Astro 不會立刻有 <ServerTime /> 的結果
因為你用了 server:defer
👉 所以先顯示:

<p class="loading">正在連線伺服器...</p>

2️⃣ 伺服器把 ServerTime 算好後

Astro 會:

  • 把 <ServerTime /> 的 HTML 傳回來
  • 自動把 fallback 換掉

結果變成:

<p>Server Time: 2026/01/04 11:23:45</p>

👉 使用者不需要重整頁面
👉 也沒有任何前端 JS hydrate

那個 <p> 到底是什麼?

🔹 它不是普通子元件

它是:

Astro 的 slot fallback

slot="fallback"

是 Astro 保留的 slot 名稱

🔹 為什麼一定要用 slot="fallback"?

因為 Astro 在 server:defer 時:

  • 主內容 → 等 server 回應
  • fallback slot → 立刻顯示

如果你這樣寫:

<ServerTime server:defer>
<p>正在連線伺服器...</p>
</ServerTime>

❌ 不會顯示
(因為沒指定 fallback slot)

🔹 視覺化流程

頁面載入

├─ 顯示 <p class="loading">正在連線伺服器...</p>

├─ ServerTime 在 Server 執行

└─ 回傳 HTML → fallback 被替換

和 client 指令的 loading 差別

vocus|新世代的創作平台

實務常見用法

<UserProfile server:defer>
<div slot="fallback" class="skeleton">
使用者資料載入中…
</div>
</UserProfile>
<CartTotal server:defer>
<span slot="fallback">計算中...</span>
</CartTotal>
留言
avatar-img
李昀瑾的沙龍
0會員
37內容數
李昀瑾的沙龍的其他內容
2026/01/10
第三課:Astro Islands —— 混合開發與互動性 核心觀念:預設 0 JS Astro 就像一個「大洋」,預設所有組件都是靜態的 HTML(沒有 JS)。如果你需要互動(如:彈窗、購物車、即時搜尋),你就在大洋中丟入一個「孤島 (Island)」。
2026/01/10
第三課:Astro Islands —— 混合開發與互動性 核心觀念:預設 0 JS Astro 就像一個「大洋」,預設所有組件都是靜態的 HTML(沒有 JS)。如果你需要互動(如:彈窗、購物車、即時搜尋),你就在大洋中丟入一個「孤島 (Island)」。
2026/01/10
Astro - 基礎入門3.第三課練習題實作
2026/01/10
Astro - 基礎入門3.第三課練習題實作
2026/01/09
題目 任務目標: 實作「動態路由」,讓點擊列表後能看到文章內容。 這在 Astro 中是非常經典的步驟,請嘗試完成以下開發:
2026/01/09
題目 任務目標: 實作「動態路由」,讓點擊列表後能看到文章內容。 這在 Astro 中是非常經典的步驟,請嘗試完成以下開發:
看更多
你可能也想看
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
PRD 老是寫不完?這篇用實戰範例與 WBS、驗收標準等技巧,教你如何面對變動需求,也能做出全團隊都能對齊的好文件。
Thumbnail
PRD 老是寫不完?這篇用實戰範例與 WBS、驗收標準等技巧,教你如何面對變動需求,也能做出全團隊都能對齊的好文件。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News