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

代表:

raw-image

實際行為差異

❌ 沒用 server:defer

<ServerTime />

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

✅ 使用 server:defer

<ServerTime server:defer />

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

適合用在什麼情境?

✅ 適合

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

❌ 不適合

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

和其他指令的對比

raw-image

※ <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 差別

raw-image

實務常見用法

<UserProfile server:defer>
<div slot="fallback" class="skeleton">
使用者資料載入中…
</div>
</UserProfile>
<CartTotal server:defer>
<span slot="fallback">計算中...</span>
</CartTotal>
留言
avatar-img
李昀瑾的沙龍
0會員
32內容數
李昀瑾的沙龍的其他內容
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
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
PRD 老是寫不完?這篇用實戰範例與 WBS、驗收標準等技巧,教你如何面對變動需求,也能做出全團隊都能對齊的好文件。
Thumbnail
PRD 老是寫不完?這篇用實戰範例與 WBS、驗收標準等技巧,教你如何面對變動需求,也能做出全團隊都能對齊的好文件。
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News