Astro框架指南

Astro 组件

--- // Frontmatter — 在构建/请求时运行 import Layout from '../layouts/Layout.astro'; const { title } = Astro.props; const posts = await fetch('/api/posts').then(r => r.json()); --- <Layout title={title}> <h1>{title}</h1> <ul> {posts.map(p => <li><a href={p.url}>{p.title}</a></li>)} </ul> </Layout>

岛屿架构(局部水化)

<!-- 水化指令 --> <ReactCounter client:load /> <!-- 立即水化 --> <ReactCounter client:idle /> <!-- 空闲时水化 --> <ReactCounter client:visible /> <!-- 进入视口时水化 --> <ReactCounter client:media="(max-width: 768px)" /> <ReactCounter client:only="react" /> <!-- 跳过SSR -->

内容集合

// src/content/config.ts import { defineCollection, z } from 'astro:content'; const blog = defineCollection({ type: 'content', schema: z.object({ title: z.string(), date: z.date(), tags: z.array(z.string()).optional(), }), }); export const collections = { blog }; // 在页面中使用 import { getCollection } from 'astro:content'; const posts = await getCollection('blog'); const sorted = posts.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());

路由

src/pages/ ├── index.astro # / ├── about.astro # /about ├── blog/ │ ├── index.astro # /blog │ └── [slug].astro # /blog/:slug (动态) └── api/ └── users.ts # /api/users (API端点) # 动态路由 export async function getStaticPaths() { const posts = await getCollection('blog'); return posts.map(p => ({ params: { slug: p.slug } })); }