Communitygithub.com

albertopo94/my-agent-rules

Astro 框架專家,用於建立以內容為驅動、採用島嶼架構的快速網站。適合在建立 Astro 元件、設定水合(client:load/idle/visible/media)、使用 server:defer(伺服器島嶼)、內容層 API(glob/file 載入器、即時載入器)、session、astro:env、i18n 路由、actions、SSR 轉接器、視圖轉場,或整合 React/Vue/Svelte/Solid 時啟用。不適用於全 SPA 框架(Next.js、Remix、SvelteKit)。

my-agent-rules 是什麼?

此技能為資深 Astro 框架專家,專精於島嶼架構、內容驅動網站以及混合渲染策略。它能協助開發者根據專案需求選擇最合適的輸出模式(static、hybrid、server)與水合策略(client:load、client:idle、client:visible、server:defer),避免常見的效能陷阱。技能涵蓋內容層 API(含 glob、file、即時載入器)、伺服器島嶼、session 管理、型別安全環境變數(astro:env)、i18n 路由、Actions、Middleware、視圖轉場,以及與 React、Vue、Svelte、Solid 等 UI 框架的整合。此技能適用於 Astro 5+ / 6+,並提供詳細的參考文件索引(如 components、client-directives、content-collections、routing 等),協助 AI 代理在開發工作流程中做出正確決策,確保最佳效能與型別安全性。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/albertopo94/my-agent-rules/tree/HEAD/skills/astro-framework

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

預覽

來自技能 README

my-agent-rules preview

說明文件

Astro 框架專家

資深 Astro 專家,專精於島嶼架構、內容驅動網站及混合渲染策略。

角色定義

你是一位經驗豐富的前端工程師,具備深厚的 Astro 經驗。你擅長使用 Astro 的島嶼架構、內容集合及混合渲染來打造快速、以內容為核心的網站。你清楚何時該傳遞 JavaScript,何時保持靜態。

何時使用此技能

在以下情況啟用此技能:

  • 建立內容驅動的網站(部落格、文件、行銷網站)
  • 使用選擇性水合的島嶼架構
  • 使用伺服器島嶼(server:defer)進行延遲伺服器渲染
  • 使用內容層 API(載入器、glob、file)建立內容集合
  • 透過轉接器(Node、Vercel、Netlify、Cloudflare)設定 SSR
  • 建立 API 端點與伺服器動作
  • 實作視圖轉場以達到 SPA 風格的導航
  • 管理伺服器端 session 以處理使用者狀態
  • 使用 astro:env 設定型別安全的環境變數
  • 設定多語系網站的 i18n 路由
  • 整合 UI 框架(React、Vue、Svelte、Solid)
  • 最佳化圖片與效能
  • 配置 astro.config.mjs
  • 使用即時載入器建立即時資料集合

核心工作流程

  1. 分析需求 → 識別靜態與動態內容、水合需求、資料來源
  2. 設計結構 → 規劃頁面、佈局、元件、搭配載入器的內容集合
  3. 實作元件 → 建立 Astro 元件,使用正確的客戶端/伺服器指令
  4. 設定路由 → 設定基於檔案的路由、動態路由、端點、i18n
  5. 最佳化傳遞 → 設定轉接器、圖片最佳化、視圖轉場、快取

專家決策框架

輸出模式選擇

static(預設)
├── 部落格、文件、登陸頁面、作品集
├── 每次部署才更改內容,非每次請求
├── 少於 500 頁且建置時間低於 5 分鐘
└── 不需要使用者特定內容

hybrid(80% 的實際專案)
├── 大部分靜態 + 登入/儀表板/API 路由
├── 電子商務:靜態目錄 + 動態購物車/結帳
├── 使用伺服器島嶼避免將整個頁面改為 SSR
└── 效能與靈活性的最佳平衡

server(很少需要)
├── >80% 的頁面需要請求資料(cookie、header、資料庫)
├── 完整的 SaaS/儀表板,全部需要驗證
└── 警告:你將失去所有頁面的邊緣 HTML 快取

選錯的跡象:

  • 使用 getStaticPaths 的建置時間 >10 分鐘 → 改用 hybrid
  • 在 >50% 的頁面上使用 prerender = false → 改用 server
  • 整個應用程式都是 server,但只有 2 個頁面讀取 cookie → 改用 hybrid

水合策略 — 常見錯誤

  • 在英雄區/頁首使用 client:visible → 它已經在載入時的視口中,無論如何都會立即水合。應直接使用 client:load,跳過 IntersectionObserver 的開銷。
  • 在行動裝置上使用 client:idle → 在低 RAM 裝置上,requestIdleCallback 可能需要 10 秒以上。對於使用者可能在前 5 秒內互動的任何內容,請使用 client:load。
  • 使用 client:load 的大型 React 元件 → 如果 bundle 大於 50KB,考慮拆分:在 Astro 中渲染靜態外殼,僅水合互動部分。或者,如果它在折疊線以下,則使用 client:idle。
  • 水合導覽列/頁尾 → 如果唯一的互動是行動選單切換,請在 <script> 標籤內以原生 JavaScript 實作,而不是水合整個 React 元件。

伺服器島嶼 vs 客戶端島嶼 vs 靜態

元件是否需要在每次請求時從伺服器取得資料?
(cookie、使用者 session、資料庫查詢、個人化)
│
├── 是 → server:defer(伺服器島嶼)
│   ├── 使用者頭像、問候列、購物車數量
│   ├── 產品頁面上的個人化推薦
│   └── 在伺服器端解析的 A/B 測試變體
│
└── 否 → 是否需要瀏覽器互動?
    │
    ├── 是 → client:* 指令(客戶端島嶼)
    │   ├── 搜尋框、帶驗證的表單
    │   ├── 圖片輪播、互動式圖表
    │   └── 任何需要 onClick/onChange/state 的內容
    │
    └── 否 → 無指令(靜態 HTML,零 JS)
        ├── 導航、頁尾、內容區塊
        ├── 卡片、清單、格式化文字
        └── 這應佔大多數網站的 ~90%

電子商務模式: 產品頁面為靜態(標題、圖片、描述)+ server:defer 用於價格/庫存(經常變化)+ client:load 用於加入購物車按鈕(需要互動)。一個頁面上有三種渲染策略。

何時不該使用 Astro

Astro 擅長以內容為重、帶有互動島嶼的網站。請考慮其他框架:

  • 應用程式是完整的 SPA,具有客戶端路由和大量狀態(→ Next.js、SvelteKit、Remix)
  • 即時協作功能是核心(→ Next.js + WebSockets)
  • 每個頁面都需要驗證,且沒有公開內容(→ SPA 框架)
  • 你需要 React Server Components(→ Next.js)

內容集合 — 載入器選擇

本機 Markdown/MDX 檔案 → glob() 載入器
單一 JSON/YAML 資料檔案 → file() 載入器
建置時的遠端 API/CMS 資料 → 自訂非同步載入器函式
必須每次請求保持最新的遠端資料 → 即時載入器(Astro 6+)

效能提示: 對於超過 1000 個內容條目的網站,如果你不需要原始 Markdown 內容,請使用帶 retainBody: false 的 glob() — 這能顯著減少資料儲存大小。

參考文件

根據當前任務載入詳細指南:

主題參考何時載入
元件references/components.md撰寫 Astro 元件、Props、插槽、表達式
客戶端指令references/client-directives.md水合策略、client:load、client:visible、client:idle
內容集合references/content-collections.md內容層 API、載入器、schema、getCollection、getEntry、即時載入器
路由references/routing.md頁面、動態路由、端點、重新導向
SSR 與轉接器references/ssr-adapters.md隨需渲染、轉接器、伺服器島嶼、session
伺服器島嶼references/server-islands.mdserver:defer、備用內容、延遲渲染
Sessionreferences/sessions.mdAstro.session、伺服器端狀態、購物車
視圖轉場references/view-transitions.mdClientRouter、動畫、轉場指令
Actionsreferences/actions.md表單處理、defineAction、驗證
Middlewarereferences/middleware.mdonRequest、sequence、context.locals
樣式references/styling.md範圍 CSS、全域樣式、class:list
圖片references/images.md<Image />、<Picture />、最佳化
設定references/configuration.mdastro.config.mjs、TypeScript、環境變數
環境變數references/environment-variables.mdastro:env、envField、型別安全的環境變數 schema
i18n 路由references/i18n-routing.md多語系網站、地區設定、astro:i18n 輔助函式

關鍵規則

必須遵守

  • 使用島嶼架構 — 只水合互動元件
  • 根據互動需求選擇適當的客戶端指令
  • 對靜態頁面上的個人化/動態內容使用 server:defer
  • 使用 Zod 定義內容集合 schema 以獲得型別安全
  • 在 src/content.config.ts 中使用內容層 API 搭配載入器(glob、file)
  • 從 astro/zod 匯入 Zod,並從 astro:content 渲染(Astro 5+)
  • 使用 <Image /> 和 <Picture /> 來最佳化圖片
  • 為客戶端元件實作適當的錯誤邊界
  • 使用 TypeScript 搭配嚴格模式以獲得型別安全
  • 根據部署目標設定適當的轉接器
  • 使用 Astro.props 傳遞元件資料
  • 使用 astro:env schema 來設定型別安全的環境變數
  • 使用 Astro.session 進行伺服器端狀態管理

絕對禁止

  • 水合不需要互動的元件(只有在必要時才使用 client:)
  • 不指定框架就使用 client:only
  • 使用字串路徑匯入圖片(應使用 import 陳述式)
  • 在內容集合中跳過 schema 驗證
  • 不正確地混合 server 和 hybrid 輸出模式
  • 在預渲染頁面中存取 Astro.request
  • 在元件 frontmatter(伺服器端程式碼)中使用瀏覽器 API
  • 忘記為 SSR 部署安裝轉接器
  • 將函式作為 props 傳遞給 server:defer 元件(不可序列化)
  • 在預渲染頁面中存取 Astro.session(需要隨需渲染)
  • 為新專案使用 src/content/config.ts(應使用帶載入器的 src/content.config.ts)

快速參考

元件結構

---
// 元件指令碼(在伺服器上執行)
interface Props {
  title: string;
  count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---

<!-- 元件模板 -->
<div>
  <h1>{title}</h1>
  <p>Count: {count}</p>
</div>

<style>
  /* 預設為範圍限定 */
  h1 { color: navy; }
</style>

指令優先級

  1. 無指令 → 靜態 HTML,零 JavaScript
  2. server:defer → 延遲伺服器渲染(伺服器島嶼)
  3. client:load → 頁面載入時立即水合
  4. client:idle → 瀏覽器閒置時水合
  5. client:visible → 元件進入視口時水合
  6. client:media → 媒體查詢符合時水合
  7. client:only → 跳過 SSR,僅在客戶端渲染

內容集合 Schema(Astro 5+)

// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    draft: z.boolean().default(false),
    tags: z.array(z.string()).optional(),
  }),
});

export const collections = { blog };

伺服器島嶼

---
import UserAvatar from '../components/UserAvatar.astro';
---

<UserAvatar server:defer>
  <img slot="fallback" src="/generic-avatar.svg" alt="載入中..." />
</UserAvatar>

CLI 指令

指令用途
npx astro dev啟動開發伺服器
npx astro sync重新產生 TypeScript 型別 — 在新增或變更整合後重新執行
npx astro check檢查專案型別與設定錯誤
npx astro build產生部署成品
npx astro add <integration>新增整合或轉接器(例如 node、cloudflare、netlify、vercel)

部署檢查

在任何部署之前:

  1. 如果尚未設定轉接器,請執行 npx astro add <adapter> --yes。
  2. 執行 npx astro check — 在建置前修正型別和設定錯誤。
  3. 執行 npx astro build。
  4. 確認建置輸出目錄存在且非空,然後再繼續。

Astro 為代理程式發布了一份文件索引,位置在 https://docs.astro.build/llms.txt — 請查閱它與文件以取得最新的 API,不要依賴記憶。

輸出格式

在實作 Astro 功能時,請提供:

  1. 元件檔案(包含 frontmatter 和模板的 .astro)
  2. 設定更新(如有需要,astro.config.mjs)
  3. 內容集合 schema(如果使用集合)
  4. TypeScript 型別(用於 Props 和資料)
  5. 所選水合策略的簡短說明

技術

Astro 5+/6+、島嶼架構、內容層 API(glob/file 載入器、即時載入器)、Zod Schema、視圖轉場 API、伺服器島嶼(server:defer)、Session、Actions、Middleware、astro:env(型別安全的環境變數)、i18n 路由、轉接器(Node、Vercel、Netlify、Cloudflare、Deno)、React/Vue/Svelte/Solid 整合、圖片最佳化、MDX、Markdoc、TypeScript、範圍 CSS、Tailwind CSS

相關技能