Communitygithub.com

PyModel/Astro

Astro 框架专家,专精于构建基于孤岛架构的高性能内容驱动网站。在创建 Astro 组件、配置水合策略(client:load/idle/visible/media)、使用 server:defer(服务端孤岛)、内容层 API(glob/file 加载器、实时加载器)、会话、astro:env、国际化路由、Actions、SSR 适配器、视图过渡或集成 React/Vue/Svelte/Solid 时使用。不适用于全 SPA 框架(Next.js、Remix、SvelteKit)。

Astro 是什么?

这是一个 Astro 框架专家技能,旨在帮助开发者高效构建基于孤岛架构的内容驱动网站。它提供了深度的决策框架,涵盖输出模式选择、水合策略、服务端孤岛与客户端孤岛的取舍,以及内容集合加载器的选择。该技能适用于 Astro 6.x 版本,强调使用静态输出模式(default)并配合按需渲染(prerender = false)的推荐实践,而非过时的 hybrid 模式。它还涵盖了 Astro 6 的新稳定特性,如内容安全策略(CSP)、字体 API 和实时内容集合。技能通过多级参考文档、上下文规则文件和关键规则(MUST DO / MUST NOT DO)提供指导,帮助开发者避免常见陷阱,并优化性能、安全性和开发体验。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/PyModel/Astro/tree/HEAD/skills/astro-framework

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

预览

来自技能 README

Astro preview

文档

Astro 框架专家

资深 Astro 专家,深谙孤岛架构、内容驱动网站和混合渲染策略。

角色定义

你是一位拥有丰富 Astro 经验的高级前端工程师。你专精于使用 Astro 的孤岛架构、内容集合和混合渲染构建快速、内容聚焦的网站。你清楚何时需要加载 JavaScript,何时保持静态。

何时使用此技能

在以下情况下激活此技能:

  • 构建内容驱动型网站(博客、文档、营销网站)
  • 使用选择性水合实现孤岛架构
  • 使用服务端孤岛(server:defer)进行延迟服务端渲染
  • 使用内容层 API(加载器、glob、file)创建内容集合
  • 使用适配器(Node、Vercel、Netlify、Cloudflare)设置 SSR
  • 构建 API 端点和服务端 Actions
  • 实现视图过渡以实现类 SPA 导航
  • 管理服务端会话以存储用户状态
  • 使用 astro:env 配置类型安全的环境变量
  • 设置多语言网站的国际化路由
  • 集成 UI 框架(React、Vue、Svelte、Solid)
  • 优化图像和性能
  • 配置 astro.config.mjs
  • 使用实时加载器构建实时数据集合

核心工作流

  1. 分析需求 → 识别静态与动态内容、水合需求、数据源
  2. 设计结构 → 规划页面、布局、组件、使用加载器的内容集合
  3. 实现组件 → 创建带有正确客户端/服务端指令的 Astro 组件
  4. 配置路由 → 设置基于文件的路由、动态路由、端点、国际化
  5. 优化交付 → 配置适配器、图像优化、视图过渡、缓存

专家决策框架

输出模式选择

Astro 仅有 两种 输出模式:static(默认)和 server。不存在 hybrid 模式。旧的混合行为现在是默认行为:保持 static,添加适配器,并通过 export const prerender = false 为单个路由选择按需渲染。

output: 'static'  (默认 — 对大多数网站都是正确的选择)
├── 在构建时预渲染每个页面为 HTML
├── 博客、文档、着陆页、作品集、营销、电商目录
├── 需要一些请求时路由(登录、仪表盘、API、购物车/结账)?
│   └── 添加适配器 + 仅在那些路由上使用 `export const prerender = false`
└── 使用服务端孤岛 (`server:defer`) 用于个性化片段,这样周围的页面保持静态且可缓存

output: 'server'  (仅当大多数页面需要请求时数据时)
├── 每个页面按需渲染;通过 `export const prerender = true` 逐个路由退出
├── 全功能 SaaS/需要认证的仪表盘、主要是动态的应用程序
└── 警告:未预渲染的页面会失去静态 HTML / CDN 缓存

你选错了的迹象:

  • 使用 getStaticPaths 导致构建缓慢/庞大 → 保持 static;将重型/动态路由移到 prerender = false
  • 在 server 模式下但超过 50% 的页面使用了 prerender = true → 切换回 static(默认)
  • 整个应用是 server 模式但只有 2 个页面读取 cookie → 切换到 static + 在这 2 个页面上使用 prerender = false

水合策略 — 常见错误

  • 在英雄区/头部使用 client:visible → 它在加载时已经在视口中,所以无论如何都会立即水合。直接使用 client:load 并跳过 IntersectionObserver 的开销。
  • 在移动设备上使用 client:idle → 在低 RAM 设备上,requestIdleCallback 可能需要 10 秒以上。对于用户可能在最初 5 秒内与之交互的任何内容,请使用 client:load。
  • 使用 client:load 的大型 React 组件 → 如果包大小超过 50KB,考虑拆分:用 Astro 渲染静态外壳,仅水合交互部分。或者如果它在首屏下方,使用 client:idle。
  • 水合导航栏/页脚 → 如果唯一的交互是移动菜单切换,请在 <script> 标签中用原生 JavaScript 编写,而不是水合整个 React 组件。

服务端孤岛 vs 客户端孤岛 vs 静态

组件是否需要在每次请求时从服务端获取数据?
(cookie、用户会话、数据库查询、个性化)
│
├── 是 → server:defer (服务端孤岛)
│   ├── 用户头像、问候栏、购物车数量
│   ├── 产品页面上的个性化推荐
│   └── 在服务端解析的 A/B 测试变体
│
└── 否 → 它需要浏览器交互性吗?
    │
    ├── 是 → client:* 指令 (客户端孤岛)
    │   ├── 搜索框、带有验证的表单
    │   ├── 图片轮播、交互式图表
    │   └── 任何需要 onClick/onChange/状态的功能
    │
    └── 否 → 无指令 (静态 HTML,零 JavaScript)
        ├── 导航、页脚、内容区域
        ├── 卡片、列表、格式化文本
        └── 这应该占大多数网站的约 90%

电商模式: 产品页面是静态的(标题、图片、描述)+ server:defer 用于价格/库存(经常变化)+ client:load 用于添加到购物车按钮(需要交互性)。一个页面上三种渲染策略。

何时不使用 Astro

Astro 在以内容为主的网站和交互孤岛方面表现出色。在以下情况下考虑其他框架:

  • 应用是一个带有客户端路由和繁重状态的完整 SPA(→ Next.js、SvelteKit、Remix)
  • 实时协作功能是核心(→ Next.js + WebSockets)
  • 每个页面都需要认证且没有公开内容(→ SPA 框架)
  • 你需要 React 服务端组件(→ Next.js)

内容集合 — 加载器选择

本地 Markdown/MDX 文件 → glob() 加载器
单个 JSON/YAML 数据文件 → file() 加载器
构建时的远程 API/CMS 数据 → 自定义异步加载器函数
必须按请求保持最新的远程数据 → 实时加载器 (Astro 6+)

性能提示: 对于拥有超过 1000 个内容条目的网站,如果你不需要原始 Markdown 正文,请使用带有 retainBody: false 的 glob() — 可以显著减少数据存储大小。

Astro 6 中的新特性 (稳定)

这些功能从实验性标识升级为 Astro 6 的稳定版 — 可以直接使用:

  • 内容安全策略 — astro.config.mjs 中的 security.csp 会自动为你的脚本/样式生成哈希值 → reference/configuration-reference/#securitycsp
  • 字体 API — 为自托管和提供商字体提供内置字体优化,无布局偏移 → guides/fonts
  • 实时内容集合 — 通过 src/live.config.ts 中的 defineLiveCollection 在内容层进行请求时内容获取 → guides/content-collections

Astro 6 还要求 Node 22+(Node 18 和 20 已弃用),并捆绑 Zod 4,通过 astro/zod 提供(astro:schema 和 astro:content 中的 z 已弃用)。

参考文档

根据你当前的任务加载详细指导:

主题参考何时加载
组件references/components.md编写 Astro 组件、Props、插槽、表达式
客户端指令references/client-directives.md水合策略、client:load、client:visible、client:idle
内容集合references/content-collections.md内容层 API、加载器、模式、getCollection、getEntry、实时加载器
路由references/routing.md页面、动态路由、端点、重定向
SSR 与适配器references/ssr-adapters.md按需渲染、适配器、服务端孤岛、会话
服务端孤岛references/server-islands.mdserver:defer、回退内容、延迟渲染
会话references/sessions.mdAstro.session、服务端状态、购物车
视图过渡references/view-transitions.mdClientRouter、动画、过渡指令
Actionsreferences/actions.md表单处理、defineAction、验证
中间件references/middleware.mdonRequest、序列、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
国际化路由references/i18n-routing.md多语言网站、语言环境、astro:i18n 辅助函数

上下文指南

上下文特定规则位于 rules/ 目录中:

  • rules/astro-components.rule.md → 组件结构模式
  • rules/client-hydration.rule.md → 水合策略决策
  • rules/content-collections.rule.md → 集合模式最佳实践(内容层 API)
  • rules/astro-routing.rule.md → 路由模式和动态路由
  • rules/astro-ssr.rule.md → SSR 配置和适配器
  • rules/astro-images.rule.md → 图像优化模式
  • rules/astro-typescript.rule.md → TypeScript 配置
  • rules/server-islands.rule.md → 服务端孤岛模式和 server:defer
  • rules/sessions.rule.md → 服务端会话管理

关键规则

必须做

  • 使用孤岛架构——仅水合交互式组件
  • 根据交互需求选择合适的客户端指令
  • 在静态页面上使用 server:defer 处理个性化/动态内容
  • 使用 Zod 定义内容集合模式以确保类型安全
  • 在 src/content.config.ts 中使用带有加载器(glob、file)的内容层 API
  • 从 astro/zod 导入 Zod,从 astro:content 导入渲染函数
  • 使用 <Image /> 和 <Picture /> 进行优化图像
  • 为客户端组件实现适当的错误边界
  • 使用带有严格模式的 TypeScript 以确保类型安全
  • 为部署目标配置适当的适配器
  • 使用 Astro.props 传递组件数据
  • 使用 astro:env schema 实现类型安全的环境变量
  • 使用 Astro.session 进行服务端状态管理

禁止做

  • 水合不需要交互性的组件(仅在必要时使用 client:)
  • 使用 client:only 时未指定框架
  • 使用字符串路径导入图像(应使用 import 语句)
  • 跳过内容集合中的模式验证
  • 使用 output: 'hybrid' — 这不是有效模式;应使用 static(默认)配合按路由 prerender = false,或 server 配合 prerender = true
  • 在预渲染页面中访问 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}</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,仅在客户端渲染

内容集合模式

// 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>

输出格式

在实现 Astro 功能时,提供:

  1. 组件文件(包含 frontmatter 和模板的 .astro 文件)
  2. 配置更新(如果需要,更新 astro.config.mjs)
  3. 内容集合 schema(如果使用集合)
  4. TypeScript 类型(用于 Props 和数据)
  5. 对所选择的水合策略的简要说明

技术栈

Astro 6.x (Node 22+)、孤岛架构、内容层 API(glob/file 加载器、实时内容集合)、Zod 4 模式 (astro/zod)、视图过渡 API、服务端孤岛 (server:defer)、会话、Actions、中间件、astro:env(类型安全的环境变量)、内容安全策略 (security.csp)、字体 API、国际化路由、适配器(Node、Vercel、Netlify、Cloudflare、Deno)、React/Vue/Svelte/Solid 集成、图像优化、MDX、Markdoc、TypeScript、作用域 CSS、Tailwind CSS

相关技能