提示:本网站现在为维护调试状态

Astro 静态站点深度:群岛架构 & 内容集合

Choyeon
Choyeon
2026年9月2日 1 分钟阅读 378 阅读
442 字 1,676 字符 更新于 2026年11月8日
Astro 静态站点深度:群岛架构 & 内容集合
目录

Astro 默认零 JavaScript,核心是群岛架构(组件按需水合)和类型安全的内容集合,兼具极致性能和现代开发体验。

群岛架构与水合策略

非交互内容输出纯静态 HTML,只有标记 client:load/visible/idle/only 的组件才会加载 JS 并水合。同一页面可混合 React/Svelte/Vue 组件互不冲突。

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

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string().max(80),
    description: z.string().max(200),
    pubDate: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    cover: z.object({ src: z.string(), alt: z.string() }).optional(),
    draft: z.boolean().default(false),
    category: z.enum(['tutorial','technology','essays','translation']),
  }),
});
const projects = defineCollection({
  type: 'content',
  schema: ({ image }) => z.object({
    name: z.string(), summary: z.string(),
    hero: image(), stack: z.array(z.string()),
    repo: z.string().url().optional(), live: z.string().url().optional(),
    featured: z.boolean().default(false),
  }),
});
export const collections = { blog, projects };

// src/pages/blog/[...slug].astro
/* ---
import { getCollection, type CollectionEntry } from 'astro:content';
import { Image } from 'astro:assets';
import LikeCounter from '../../components/LikeCounter.svelte';

export async function getStaticPaths() {
  const posts = await getCollection('blog', ({ data }) => import.meta.env.DEV || !data.draft);
  return posts.map(p => ({ params: { slug: p.slug }, props: { post: p } }));
}
const { post } = Astro.props as { post: CollectionEntry<'blog'> };
const { Content } = await post.render();
--- ---
<article>
  <header>
    <h1>{post.data.title}</h1>
    {post.data.cover && <Image src={post.data.cover.src} alt={post.data.cover.alt} widths={[400,800,1200]} />}
  </header>
  <Content />
  <LikeCounter client:idle postSlug={post.slug} />
</article>
*/

Content Collections 类型安全

在 content/config.ts 中用 Zod 为集合定义 schema,getCollection 返回内容时自动校验 frontmatter,不匹配直接报错。支持图片自动优化。

水合指令 触发时机 体积开销 适合组件
(默认) 永远不水合 0 JS 纯展示卡片/正文
client:load 页面加载即水合 最高 导航/核心交互
client:idle 浏览器空闲时 中低 点赞/次要交互
client:visible 滚动进入视口 极低 页脚/长列表后项

最佳实践

默认先不写 client:*,确定需要交互再添加。内容集合 schema 严格化避免脏数据。用 getStaticPaths + Slug 预渲染所有动态路由。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

评论 (5)

0 / 3000
机器学习萌新
机器学习萌新2026年10月1日

看到博主推荐的这个 UI 组件库了,之前一直在纠结选哪个,试了一下确实不错,文档也很友好!

测试小瓢虫
测试小瓢虫2026年9月30日

补充:用 CSS container query 实现响应式其实比媒体查询更灵活,组件级别的适配体验会好很多。

自由撰稿人阿秋
自由撰稿人阿秋qiuwrites.blog2026年9月30日

博主请问一下,Next.js 15 里这个写法在 App Router 下会有 hydration 不匹配的问题吗?我用的时候偶尔报错。

安全小白白
安全小白白seclab.digital2026年9月30日

终于有人把 CSS Grid 的各种布局技巧讲明白了,我之前看 MDN 文档看半天没搞懂,看完这篇直接上手了!

运维老司机
运维老司机ops-notes.cn2026年9月29日

示例代码里那个 useEffect 的依赖数组好像少了个参数,严格模式下会触发两次,建议修正一下。

相关文章

前端性能优化:Core Web Vitals 实战

前端性能优化:Core Web Vitals 实战

Google 搜索排名核心指标完全实战:LCP 最大内容绘制(预连接/图像优先级/CDN缓存)、CLS 累积布局偏移(图像尺寸/字体FOIT/动态占位)、INP 交互响应(长任务拆分/防抖节流)全面落地。

1 分钟阅读
PWA 离线应用实战:Service Worker + IndexedDB + Background Sync

PWA 离线应用实战:Service Worker + IndexedDB + Background Sync

逐步构建可安装、可离线运行、网络恢复自动同步的 Progressive Web App:Service Worker 缓存策略(Cache First / Stale-While-Revalidate)、IndexedDB 封装结构化本地数据、Background Sync 后台队列在用户离线操作后网络恢复时自动提交变更,附完整 TS 代码。

1 分钟阅读
React 18 Hooks 最佳实践

React 18 Hooks 最佳实践

React 18 引入了并发渲染、自动批处理、useTransition、useDeferredValue 等革命性特性。本文系统梳理 useState/useEffect 的正确用法、useMemo/useCallback 的优化边界、自定义 Hook 的设计模式,以及并发模式下避免陈旧闭包、竞态条件等陷阱的完整指南,帮助你写出更健壮的 React 18 代码。

1 分钟阅读
Tailwind CSS v4 新特性:Zero-config + CSS-native 变量

Tailwind CSS v4 新特性:Zero-config + CSS-native 变量

Tailwind CSS v4 是一次架构级升级:彻底抛弃 tailwind.config.js,用 @theme 块在原生 CSS 文件声明设计令牌;新增 @import "tailwindcss" 单入口代替 postcss.config;内置 CSS 变量、容器查询原生支持、oxc 引擎提速 10-40 倍、颜色函数简化。

1 分钟阅读
Vue 3 组合式 API 实战

Vue 3 组合式 API 实战

Vue 3 的组合式 API (Composition API) 彻底改变了 Vue 组件的组织方式。本文通过构建一个复杂的电商筛选器组件,演示 ref/reactive 的选择、computed/watch 的合理使用、自定义组合函数 (Composable) 的抽离原则、生命周期钩子的时机以及 provide/inject 进行跨层级状态传递的正确姿势。

1 分钟阅读
CSS Container Queries 完全指南

CSS Container Queries 完全指南

彻底掌握现代响应式 CSS:Container Queries 让组件基于父容器尺寸自适应(而非视口),配合 :has() 父选择器实现依赖后代状态的样式变化,彻底改变组件化响应式设计范式。

1 分钟阅读