Communitygithub.com

anubhavg-icpl/vibe

使用 Astro 构建以内容为中心的网站——默认零 JavaScript、孤岛架构、多框架组件、Markdown/MDX 支持。在需要 Astro 帮助时使用。

vibe 是什么?

Astro 是一个专为内容密集型网站(如博客、文档、作品集、营销页面和电子商务)设计的 Web 框架。其核心创新是“孤岛架构”(Islands Architecture):默认情况下,Astro 向浏览器发送零 JavaScript,交互式组件作为独立的“孤岛”被选择性水合。Astro 支持在同一个项目中同时使用 React、Vue、Svelte、Solid 等 UI 框架,让你可以为每个组件选择最合适的工具。该技能(SKILL.md)提供了 Astro 的完整指南,涵盖项目搭建、组件语法、基于文件的路由、内容集合、孤岛水合指令、布局系统以及 SSR 模式,并包含大量代码示例和最佳实践。它适用于性能优先、内容丰富且需要 SSG(静态生成)或可选 SSR(服务端渲染)的项目。使用时需注意仅对必要的交互组件使用客户端指令,并利用内容集合获得类型安全。

兼容平台✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/anubhavg-icpl/vibe/tree/HEAD/skills/ag-astro

在你喜欢的 AI 中提问

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

文档

Astro Web 框架

概述

Astro 是一个为内容丰富的网站设计的 Web 框架——博客、文档、作品集、营销网站和电子商务。其核心创新是孤岛架构:默认情况下,Astro 向浏览器发送零 JavaScript。交互式组件作为孤立的“孤岛”被选择性水合。Astro 支持在同一个项目中同时使用 React、Vue、Svelte、Solid 和其他 UI 框架,让你可以为每个组件选择合适的工具。

何时使用此技能

  • 构建博客、文档网站、营销页面或作品集时
  • 性能和核心 Web 指标是首要优先级时
  • 项目内容包含大量 Markdown 或 MDX 文件时
  • 需要 SSG(静态)输出,并且可选 SSR 用于动态路由时
  • 用户询问 .astro 文件、Astro.props、内容集合或 client: 指令时

工作原理

第 1 步:项目设置

npm create astro@latest my-site
cd my-site
npm install
npm run dev

根据需要添加集成:

npx astro add tailwind        # Tailwind CSS
npx astro add react           # React 组件支持
npx astro add mdx             # MDX 支持
npx astro add sitemap         # 自动生成 sitemap.xml
npx astro add vercel          # Vercel SSR 适配器

项目结构:

src/
  pages/          ← 基于文件的路由 (.astro, .md, .mdx)
  layouts/        ← 可复用的页面外壳
  components/     ← UI 组件 (.astro, .tsx, .vue 等)
  content/        ← 类型安全的内容集合 (Markdown/MDX)
  styles/         ← 全局 CSS
public/           ← 静态资源(原样复制)
astro.config.mjs  ← 框架配置

第 2 步:Astro 组件语法

.astro 文件顶部有一个代码围栏(仅在服务器端运行),下方是模板:

---
// src/components/Card.astro
// 此代码块仅在服务器端运行——永远不会在浏览器中执行
interface Props {
  title: string;
  href: string;
  description: string;
}

const { title, href, description } = Astro.props;
---

<article class="card">
  <h2><a href={href}>{title}</a></h2>
  <p>{description}</p>
</article>

<style>
  /* 自动作用域限于此组件 */
  .card { border: 1px solid #eee; padding: 1rem; }
</style>

第 3 步:基于文件的页面和路由

src/pages/index.astro          → /
src/pages/about.astro         → /about
src/pages/blog/[slug].astro    → /blog/:slug (动态)
src/pages/blog/[...path].astro → /blog/* (通配)

带 getStaticPaths 的动态路由:

---
// src/pages/blog/[slug].astro
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<h1>{post.data.title}</h1>
<Content />

第 4 步:内容集合

内容集合让你类型安全地访问 Markdown 和 MDX 文件:

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

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

export const collections = { blog };
---
// src/pages/blog/index.astro
import { getCollection } from 'astro:content';

const posts = (await getCollection('blog'))
  .filter(p => !p.data.draft)
  .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---

<ul>
  {posts.map(post => (
    <li>
      <a href={`/blog/${post.slug}`}>{post.data.title}</a>
      <time>{post.data.date.toLocaleDateString()}</time>
    </li>
  ))}
</ul>

第 5 步:孤岛——选择性水合

默认情况下,UI 框架组件渲染为静态 HTML,不带任何 JavaScript。使用 client: 指令进行水合:

---
import Counter from '../components/Counter.tsx';  // React 组件
import VideoPlayer from '../components/VideoPlayer.svelte';
---

<!-- 静态 HTML——不向浏览器发送 JavaScript -->
<Counter initialCount={0} />

<!-- 页面加载时立即水合 -->
<Counter initialCount={0} client:load />

<!-- 组件滚动到视口内时水合 -->
<VideoPlayer src="/demo.mp4" client:visible />

<!-- 仅当浏览器空闲时水合 -->
<Analytics client:idle />

<!-- 仅针对特定媒体查询水合 -->
<MobileMenu client:media="(max-width: 768px)" />

第 6 步:布局

---
// src/layouts/BaseLayout.astro
interface Props {
  title: string;
  description?: string;
}
const { title, description = 'My Astro Site' } = Astro.props;
---

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>{title}</title>
    <meta name="description" content={description} />
  </head>
  <body>
    <nav>...</nav>
    <main>
      <slot />  <!-- 页面内容在此处渲染 -->
    </main>
    <footer>...</footer>
  </body>
</html>
---
// src/pages/about.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---

<BaseLayout title="关于我们">
  <h1>关于我们</h1>
  <p>欢迎来到我们的公司...</p>
</BaseLayout>

第 7 步:SSR 模式(按需渲染)

通过设置适配器启用 SSR 以处理动态页面:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'hybrid',  // 'static' | 'server' | 'hybrid'
  adapter: vercel(),
});

通过 export const prerender = false 将单个页面切换为 SSR。

示例

示例 1:带 RSS 订阅的博客

// src/pages/rss.xml.ts
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';

export async function GET(context) {
  const posts = await getCollection('blog');
  return rss({
    title: '我的博客',
    description: '最新文章',
    site: context.site,
    items: posts.map(post => ({
      title: post.data.title,
      pubDate: post.data.date,
      link: `/blog/${post.slug}/`,
    })),
  });
}

示例 2:API 端点(SSR)

// src/pages/api/subscribe.ts
import type { APIRoute } from 'astro';

export const POST: APIRoute = async ({ request }) => {
  const { email } = await request.json();

  if (!email) {
    return new Response(JSON.stringify({ error: '需要邮箱' }), {
      status: 400,
      headers: { 'Content-Type': 'application/json' },
    });
  }

  await addToNewsletter(email);
  return new Response(JSON.stringify({ success: true }), { status: 200 });
};

示例 3:作为孤岛的 React 组件

// src/components/SearchBox.tsx
import { useState } from 'react';

export default function SearchBox() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  async function search(e: React.FormEvent) {
    e.preventDefault();
    const data = await fetch(`/api/search?q=${query}`).then(r => r.json());
    setResults(data);
  }

  return (
    <form onSubmit={search}>
      <input value={query} onChange={e => setQuery(e.target.value)} />
      <button type="submit">搜索</button>
      <ul>{results.map(r => <li key={r.id}>{r.title}</li>)}</ul>
    </form>
  );
}
---
import SearchBox from '../components/SearchBox.tsx';
---
<!-- 立即水合——这个孤岛是可交互的 -->
<SearchBox client:load />

最佳实践

  • ✅ 将大多数组件保持为静态的 .astro 文件——只水合必须交互的部分
  • ✅ 对所有 Markdown/MDX 内容使用内容集合——它提供类型安全和自动验证
  • ✅ 对于首屏以下的组件,优先使用 client:visible 而非 client:load,以减少初始 JavaScript
  • ✅ 使用 import.meta.env 进行环境变量管理——使用 PUBLIC_ 前缀公开公共变量
  • ✅ 添加来自 astro:transitions 的 <ViewTransitions /> 以实现平滑页面导航,无需完整的 SPA
  • ❌ 不要在每个组件上都使用 client:load——这会破坏 Astro 的性能优势
  • ❌ 不要在面向客户端的模板中使用 .astro frontmatter 中的秘密信息
  • ❌ 在静态模式下不要跳过动态路由的 getStaticPaths——否则构建会失败

安全与注意事项

  • .astro 文件中的 Frontmatter 代码仅在服务器端运行,永远不会暴露给浏览器。
  • 仅对非敏感值使用 import.meta.env.PUBLIC_*。私有环境变量(无 PUBLIC_ 前缀)永远不会发送到客户端。
  • 使用 SSR 模式时,在数据库查询或 API 调用之前,验证所有 Astro.request 输入。
  • 在使用 set:html 渲染之前,对任何用户提供的内容进行消毒——它会绕过自动转义。

常见陷阱

  • 问题: React/Vue 组件的 JavaScript 在浏览器中不运行 解决方案: 添加一个 client: 指令(client:load、client:visible 等)——没有它,组件仅渲染为静态 HTML。

  • 问题: 开发过程中内容更新后 getStaticPaths 数据已过时 解决方案: Astro 的开发服务器会监视内容文件——如果对 content/config.ts 的更改未反映,请重启服务器。

  • 问题: Astro.props 的类型是 any——没有自动补全 解决方案: 在 frontmatter 中定义一个 Props 接口或类型,Astro 将自动推断它。

  • 问题: .astro 组件中的 CSS 泄漏到其他组件 解决方案: .astro <style> 标签中的样式会自动作用域化。仅在有意针对子元素时使用 :global()。

相关技能

  • @sveltekit —— 当你需要一个具有响应式 UI 的全栈框架时(相较于 Astro 的内容导向)
  • @nextjs-app-router-patterns —— 当你需要一个以 React 为先的全栈框架时
  • @tailwind-patterns —— 使用 Tailwind CSS 样式化 Astro 网站
  • @progressive-web-app —— 为 Astro 网站添加 PWA 能力

限制

  • 仅当任务明确符合上述范围时使用此技能。
  • 不要将输出视为针对特定环境的验证、测试或专家审查的替代方案。
  • 如果缺少所需的输入、权限、安全边界或成功标准,请停下来请求澄清。

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

anubhavg-icpl/vibe

|. Use when you need help with 8 bit orbit video template. Hyperframes-based video template for retro pixel deck motion design. Use when users want a high-fidelity, multi-scene HTML-to-video composition with advanced transitions, interactive preview controls, and ready-to-render default style.

anubhavg-icpl/vibe

Reference DESIGN.md for luxury automotive editorial that needs to feel engineered. White slabs, full-bleed performance photography, BMW corporate blue rising into a deeper blue at active states, restrained Helvetica-grade typography. Use when building UI components, applying design tokens, or implementing visual styles for cinematic bmw.

anubhavg-icpl/vibe

Reference DESIGN.md for enterprise-AI brands that need to feel premium, dark, and quietly futuristic. Ink canvas, Unica grotesque type, saturated coral-to-violet brand gradient deployed as backdrop and accent rule, full-pill buttons, gen. Use when building UI components, applying design tokens, or implementing visual styles for cinematic cohere.

anubhavg-icpl/vibe

Reference DESIGN.md for performance brands that need to feel theatrical. High-contrast black-and-white frames cut by Rosso Corsa red, sharp 0-radius components, FerrariSans across the entire page, photography that treats the car as sculp. Use when building UI components, applying design tokens, or implementing visual styles for cinematic ferrari.

anubhavg-icpl/vibe

Reference DESIGN.md for hyper-luxury that needs to feel forged. True-black canvas, oversized LamboType nameplates at 120px+, hexagonal angle motifs, single warm-gold accent for primary actions, photography lit like a vault. Use when building UI components, applying design tokens, or implementing visual styles for cinematic lamborghini.

anubhavg-icpl/vibe

Reference DESIGN.md for AI-lab cinematic: pure black canvas, neon-lime accent on charcoal chrome, geometric DM Sans / Outfit type, pill-shaped CTAs. Use when building UI components, applying design tokens, or implementing visual styles for cinematic minimax.

anubhavg-icpl/vibe

Reference DESIGN.md for GPU-vendor cinematic: chrome-black canvas, signature green action, video-led hero, hard-edged grotesque headlines. Use when building UI components, applying design tokens, or implementing visual styles for cinematic nvidia.

anubhavg-icpl/vibe

Skill for discovering and researching autonomous AI agents, tools, and ecosystems using the AgentFolio directory. Use when you need help with agentfolio.

anubhavg-icpl/vibe

Expert in building portfolios that actually land jobs and clients -. Use when you need help with interactive portfolio. not just showing work, but creating memorable experiences. Covers developer portfolios, designer portfolios, creative portfolios, and portfolios that convert visitors into opportunities.

anubhavg-icpl/vibe

Generates high-converting Next.js/React landing pages with Tailwind CSS. Uses PAS, AIDA, and BAB frameworks for optimized copy/components (Heroes, Features, Pricing). Focuses on Core Web Vitals/SEO. Use when you need help with landing page generator.

anubhavg-icpl/vibe

Generate walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays. Use when you need help with remotion.

anubhavg-icpl/vibe

Writes complete, structured landing pages optimized for SEO ranking, AEO citation, and visitor conversion. Activate when the user wants to write or generate a landing page for a product, service, or offer.

anubhavg-icpl/vibe

Project scaffolding - generate boilerplate for common project types with best-practice defaults. Use for: scaffold, boilerplate, template, new project, init, create project, starter, setup, project structure, directory structure, monorepo, microservice, API template, web app template, CLI tool template, library template.

anubhavg-icpl/vibe

Automate Klipfolio tasks via Rube MCP (Composio). Always search tools first for current schemas. Use when you need help with klipfolio automation.

anubhavg-icpl/vibe

>. Use when you need help with kami landing. Produce a print-grade single-page kami (紙 / 纸) document — warm parchment canvas, ink-blue accent, serif at one weight, no italic, no cool grays. The output reads like a professional white paper or studio one-pager, not an app UI. Multilingual by design (EN · zh-CN · ja). One self-contained HTML file, zero dependencies.

anubhavg-icpl/vibe

>. Use when you need help with open design landing deck. Produce a single-file slide deck in the Atelier Zero visual language (warm-paper background, italic-serif emphasis spans, coral terminating dots, surreal collage plates) — Open Design's brand deck recipe. The deck uses **horizontal magazine-style swipe pagination** (←/→, wheel, swipe), a per-slide chrome strip with brand mark and slide counter, an ESC overview grid, a coral progress bar, and inherits the canonical stylesheet + 16-slot image library from the sister `open-design-landing` skill.

anubhavg-icpl/vibe

>. Use when you need help with open design landing. Produce a world-class single-page editorial landing site in the Atelier Zero visual language (Monocle / Apartamento / Études editorial collage) — the same aesthetic Open Design uses for its own marketing surface. The agent fills a typed `inputs.json` from a brand brief, optionally generates 16 collage assets via gpt-image-2, then runs a pure-function composer that emits a self-contained HTML file; a separate path can mirror the Astro marketing site in `apps/landing-page/`. Drop-in scroll-reveal motion and a Headroom-style sticky nav are wired automatically.

anubhavg-icpl/vibe

>. Use when building UI with epic design language and visual style. Build immersive, cinematic 2.5D interactive websites using scroll storytelling, parallax depth, text animations, and premium scroll effects — no WebGL required. Use this skill for any web design task: landing pages, product sites, hero sections, scroll animations, parallax, sticky sections, section overlaps, floating products between sections, clip-path reveals, text that flies in from sides, words that light up on scroll, curtain drops, iris opens, card stacks, bleed typography, and any site that should feel cinematic or premium. Trigger on phrases like "make it feel alive", "Apple-style animation", "sections that overlap", "product rises between sections", "immersive", "scrollytelling", or any scroll-driven visual effect. Covers 45+ techniques across 8 categories. Always inspects, judges, and plans assets before coding. Use aggressively for ANY web design task.

anubhavg-icpl/vibe

Generates high-converting landing pages as complete Next.js/React (TSX) components with Tailwind CSS. Creates hero sections, feature grids, pricing tables, FAQ accordions, testimonial blocks, and CTA sections using proven copy frameworks (PAS, AIDA, BAB). Outputs SEO meta tags, structured data, and performance-optimised code targeting Core Web Vitals (LCP < 1s, CLS < 0.1). Use when the user asks to create a landing page, marketing page, homepage, single-page site, lead capture page, campaign page, promo page, or conversion-optimised web page — or when they want to A/B test landing page variants or replace a static page with one designed to convert.

anubhavg-icpl/vibe

Generates a premium single-page HTML landing page with 3D CSS animations, GSAP scroll effects, and mouse-parallax depth. Forcing intake (product + elevator pitch, audience register, brand overrides, tone) locks down positioning before any copy or markup is written, so the page reflects the actual product rather than generic boilerplate. Use whenever the user says 'landing for X', 'create a landing page', 'build a landing page', 'make a landing page for X', 'I need a web page for Y', or provides product/service details and wants a polished website. Also triggers on 'promotional page', 'product page', 'one-pager', 'web presence', 'sales page'. Outputs a single self-contained HTML file (Claude Code) or HTML artifact (Claude.ai). Supports configurable brand colors via CSS custom property overrides.

相关技能