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

Astro 靜態站點深度:群島架構 & 內容集合

Choyeon
Choyeon
2026年9月2日 1 分鐘閱讀 381 閱讀
442 字 1,676 字元 更新於 2026年11月8日
Astro 靜態站點深度:群島架構 & 內容集合
目錄

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 分鐘閱讀