agentsclimarketplace

Tutorial writer web

Skill morning-start/agent-skills/process/tutorial-writer/skills/tutorial-writer-web

AI 编程助手的专业技能库,涵盖 30+ 技能,按 6 类组织

Install
npx -y skills add morning-start/agent-skills --skill tutorial-writer-web

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Use when configuring Astro + Starlight for tutorial websites in a Monorepo environment, developing components (interactive/charts/code/ui), implementing Islands Architecture, managing build-time enhancement pipelines (Mermaid pre-rendering, component injection), or optimizing web package performance. Triggers on "Astro 配置", "Starlight 定制", "组件开发", "Islands Architecture", "内容增强管道", "构建优化", or "Web 包配置". Assumes standard Turbo project with apps/web/ and packages/content/. This is a high-frequency skill called repeatedly during development iterations.

SKILL.md

23.9 KB, as published. Nobody here has run it

🌐 Tutorial Writer Web — Web 应用配置指南 v1.0

父技能: tutorial-writer 独立可用: ✅ 可通过 /web/tutorial-writer/web 直接触发(L1 直达) 架构: L1 独立子技能 — 标准 Turbo 结构 (apps/web) 基于版本: Astro 6.3(2026年5月最新版)+ Starlight 最新版 使用频率: 🔴 高频 — 开发过程中反复迭代调用 前置依赖: 需要先使用官方工具完成项目初始化(见根路由器"🚀 项目初始化"章节 Step 1-3)


前置条件

  • Monorepo 项目已初始化(含 turbo.json, pnpm-workspace.yaml) 详见根路由器 SKILL.md Step 1
  • apps/web/ 已通过 Starlight 模板创建
    • 推荐命令: 在项目根目录运行 bun create astro apps/web --template starlight --install --yes
    • 该命令会自动创建 apps/web/ 目录并安装依赖
    • 详见根路由器 SKILL.md Step 3
  • @repo/content 包存在且已在 package.json 中声明依赖
    { "dependencies": { "@repo/content": "workspace:*" } }
    

注意: 本子技能专注于 Astro + Starlight 配置和组件开发不包含项目创建逻辑。

项目初始化请参考根路由器的 "🚀 项目初始化" 章节。

Monorepo 目录结构概览

tutorial-project/
├── apps/                            ← 应用层
│   └── web/                    ← 🌐 教程网站(本技能聚焦)
│       ├── src/
│       │   ├── components/
│       │   ├── layouts/
│       │   ├── styles/
│       ├── astro.config.mjs
│       └── package.json
├── packages/                        ← 库层
│   ├── content/                     ← 📝 内容包(由 content 子技能管理)
│   │   ├── chapters/
│   │   ├── config.ts
│   │   └── package.json
│   └── book/                        ← 📖 电子书(由 book 子技能管理)
├── pnpm-workspace.yaml
└── package.json

与 Content 包的集成

// apps/web/astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';

export default defineConfig({
  // 引用 content 包的内容目录
  contentDir: '../../packages/content',
  
  integrations: [
    starlight({
      sidebar: [
        { label: '首页', slug: 'index' },
        {
          label: '章节',
          autogenerate: { directory: 'chapters' },
        },
      ],
    }),
  ],
});

关键集成点

集成项说明配置位置
内容源引用 packages/content/ 目录contentDir 字段
Schema 定义由 content 包的 config.ts 管理无需重复定义
Workspace 依赖@repo/contentpackage.json 声明dependencies

🎯 职责范围

✅ 负责❌ 不负责
Astro + Starlight 配置与定制项目初始化 → 官方工具链 (create-astro)
组件开发(Islands + 静态,按功能分组)Content Collections schema → content 子技能
内容增强管道(Mermaid 预渲染、组件注入)部署配置 → /github-pages
样式系统(全局样式、主题变量、响应式)CI/CD 流水线 → /github-pages
构建优化(性能调优、图片优化、Lighthouse)多格式发布 → 可选
本地开发和调试(Dev Server、HMR、DevTools)文件命名规范 → content 子技能

设计理念: 本技能是 Tutorial Writer 流程中调用频率最高的子技能之一,专注于 Web 包的技术实现细节。


🔧 核心配置:Astro + Starlight(Monorepo 版)

astro.config.mjs 完整示例

// apps/web/astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';

export default defineConfig({
  site: 'https://username.github.io',
  base: '/repo-name/',
  trailingSlash: 'always',

  // 指向 Monorepo 中的 content 包
  contentDir: '../../packages/content',

  integrations: [
    starlight({
      title: '教程标题',
      description: '教程描述',

      social: {
        github: 'https://github.com/username/repo',
      },

      sidebar: [
        { label: '首页', slug: 'index' },
        {
          label: '章节',
          autogenerate: { directory: 'chapters' },
        },
      ],

      editLink: {
        baseUrl: 'https://github.com/username/repo/edit/main/',
      },
      lastUpdated: true,
      pagination: true,
      search: { mode: 'auto' },
    }),
  ],
});

Monorepo 特有配置项

配置项说明
contentDir'../../packages/content'相对路径指向 content 包
site完整 URL影响 SEO、sitemap、OG 图片路径
base'/repo-name/'GitHub Pages 项目站点必填
trailingSlash'always'避免 GitHub Pages 404

package.json(Workspace 依赖)

{
  "name": "@repo/web",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "astro dev",
    "build": "astro build",
    "preview": "astro preview",
    "enhance": "mmd2svg -i ../../packages/content/chapters -o .enhanced"
  },
  "dependencies": {
    "@astrojs/starlight": "^0.30.0",
    "astro": "^6.3.0",
    "@repo/content": "workspace:*"
  }
}

🎨 组件开发:按功能分组

推荐的组件目录结构

apps/web/src/components/
├── interactive/              ← 🎮 3D、可视化、交互式组件
│   ├── Architecture3D.tsx    # 3D 架构展示
│   ├── DataPipeline3D.tsx    # 数据流 3D 动画
│   ├── ChunkComparison3D.tsx # 分块策略对比 3D
│   └── KnowledgeGraph3D.tsx  # 知识图谱 3D
│
├── charts/                   ← 📊 图表、仪表盘、指标
│   ├── PerformanceDashboard.tsx
│   ├── MetricGauge.tsx
│   └── ComparisonChart.tsx
│
├── code/                     ← 💻 代码相关组件
│   ├── InteractiveCodeDemo.tsx  # 运行时代码沙盒
│   ├── CodeComparison.tsx      # 代码对比展示
│   └── TerminalEmulator.tsx     # 终端模拟器
│
└── ui/                        ← 🎨 通用 UI 组件
    ├── FeatureGrid.astro
    ├── DifficultyBadge.astro
    └── ReadingTime.astro

分组原则

分组包含使用频率Islands/Static
interactive/3D、动画、复杂可视化中(特定章节使用)✅ Islands(需要 JS)
charts/图表、数据展示中(数据密集章节)✅ Islands(需要 JS)
code/代码演示、沙盒高(技术章节常用)✅ Islands(需要 JS)
ui/通用 UI 元素高(全局复用)⚡ Static(零 JS)

⚡ Islands Architecture 最佳实践

核心原则

┌─────────────────────────────────────────┐
│           HTML/CSS(零 JavaScript)        │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐   │
│  │ Static  │  │ Static  │  │ Static  │   │
│  │ Component│  │ Component│  │ Component│   │
│  └─────────┘  └─────────┘  └─────────┘   │
│                                           │
│  ┌─────────────┐  ┌─────────────┐         │
│  │   Island    │  │   Island    │         │
│  │ ( hydrated) │  │ ( hydrated) │         │
│  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────┘

使用指南

✅ 应该使用 Islands 的场景

  • 3D 可视化(Three.js、React Three Fiber)
  • 交互式图表(Chart.js、D3.js)
  • 代码沙盒(CodeMirror、Monaco Editor)
  • 复杂表单验证
  • 实时数据更新

❌ 不应该使用 Islands 的场景

  • 纯展示性 UI(卡片、徽章)
  • 导航栏、侧边栏
  • 页脚、版权信息
  • 静态文本内容

示例:Island vs Static 对比

---
// ✅ 正确:静态组件使用 .astro 扩展名
import FeatureGrid from '../components/ui/FeatureGrid.astro';
import DifficultyBadge from '../components/ui/DifficultyBadge.astro';

// ✅ 正确:交互组件使用 .tsx 并添加 client:* 指令
import InteractiveDemo from '../components/code/InteractiveCodeDemo.tsx';
---

<article>
  <!-- 静态渲染,零 JavaScript -->
  <FeatureGrid features={features} />
  <DifficultyBadge difficulty="intermediate" />

  <!-- 仅此部分 hydrate 为 React -->
  <InteractiveDemo client:load />
</article>

Hydration 指令选择

指令行为适用场景
client:load页面加载时立即 hydrate首屏关键交互元素
client:idle浏览器空闲时 hydrate非首屏但重要的交互
client:visible进入视口时 hydrate折叠内容、长页面底部
client:media匹配媒体查询时 hydrate响应式特定组件

🎨 样式系统

全局样式结构

apps/web/src/styles/
├── global.css              ← 全局重置和基础样式
├── variables.css            ← CSS 自定义属性(主题变量)
├── typography.css           ← 排版系统
└── responsive.css           ← 响应式断点工具类

主题变量(CSS Custom Properties)

/* variables.css */
:root {
  /* 颜色系统 */
  --color-primary: #3b82f6;
  --color-secondary: #64748b;
  --color-accent: #06b6d4;
  --color-background: #ffffff;
  --color-text: #1e293b;

  /* 排版 */
  --font-sans: 'Inter', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
  --font-size-base: 16px;
  --line-height: 1.6;

  /* 间距 */
  --spacing-unit: 0.25rem;
  --container-max: 1200px;

  /* 圆角 */
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 12px;
}

/* Dark mode */
[data-theme='dark'] {
  --color-background: #0f172a;
  --color-text: #e2e8f0;
}

响应式断点

/* responsive.css */

/* Mobile first approach */
.container {
  width: 100%;
  padding: 0 var(--spacing-4);
  margin: 0 auto;
}

/* Tablet */
@media (min-width: 768px) {
  .container {
    max-width: 720px;
  }
}

/* Desktop */
@media (min-width: 1024px) {
  .container {
    max-width: var(--container-max);
  }
}

/* Large desktop */
@media (min-width: 1280px) {
  .grid-cols-4 {
    grid-template-columns: repeat(4, 1fr);
  }
}

断点速查表

断点宽度设备类型
sm≥640px大屏手机/小平板
md≥768px平板竖屏
lg≥1024px平板横屏/小笔记本
xl≥1280px桌面显示器
2xl≥1536px大屏桌面

⚡ 内容增强管道(Build-time Enhancement)

什么是增强管道?

在构建时自动处理 Markdown 内容,注入交互组件、预渲染图表等。

核心功能 1:插槽标记系统

在 Markdown 中使用标记

<!-- packages/content/chapters/06-retrieval-optimization.md -->

# 第六章:检索质量优化

## 分块策略对比

| 策略 | Token 数 | 召回率 |
|-------|---------|--------|
| 固定 512 | 512 | **78%** |
| 语义分块 | ~43 | **70%** |

<!-- @interactive: ChunkComparison3D -->
<!-- 同步后此处自动插入 3D 对比可视化组件 -->

## RRF 公式

$$ \text{RRF}(d) = \sum_{i=1}^{k} \frac{1}{k + r_i(d)} $$

<!-- @mermaid -->
```mermaid
flowchart LR
  A[查询] --> B[关键词检索]
  A --> C[向量检索]
  B --> D[RRF 融合]
  C --> D
<!-- @mermaid-end -->

**构建时处理** (`apps/web/src/scripts/enhance-content.mts`):

```typescript
// apps/web/src/scripts/enhance-content.mts
import type { AstroConfig } from 'astro/config';

export default function enhanceContent(astroConfig: AstroConfig) {
  return {
    name: 'content-enhancer',
    hooks: {
      'astro:build:start': () => {
        console.log('🔄 开始内容增强...');
      },
      'astro:build:done': ({ dir }) => {
        console.log('✅ 内容增强完成:', dir);
      },
    },
  };
}

核心功能 2:Mermaid 预渲染

为什么需要预渲染?

  • ❌ 浏览器端渲染 mermaid.js 会增加加载时间
  • ✅ 构建时预渲染为 SVG,零运行时开销

实现方式

# 安装 mermaid CLI
cd apps/web && bun add -D @mermaid-js/mermaid-cli

# 在 apps/web/package.json 中添加脚本
{
  "scripts": {
    "enhance": "mmd2svg -i ../../packages/content/chapters -o .enhanced",
    "prebuild": "bun run enhance && astro build"
  }
}

核心功能 3:组件自动注入

布局级别处理 (apps/web/src/layouts/BaseLayout.astro):

---
// 自动检测并替换插槽标记
import ChunkComparison3D from '../components/interactive/ChunkComparison3D.tsx';
---

<!doctype html>
<html>
  <head><title>{title}</title></head>
  <body>
    <!-- 使用 slot 渲染原始内容 -->
    <slot />

    <!-- 后处理:查找并替换插槽标记为实际组件 -->
    <script define:vars={{}} is:inline>
      document.querySelectorAll('[data-enhance-slot]').forEach(el => {
        const componentName = el.dataset.enhanceSlot;
        // 动态导入并渲染对应组件
      });
    </script>
  </body>
</html>

📖 Content Collections 查询(Monorepo 版)

查询内容

---
import { getCollection } from 'astro:content';

// 获取所有章节(从 content 包)
const allChapters = await getCollection('chapters');

// 过滤:排除草稿
const publishedChapters = allChapters.filter(ch => !ch.data.draft);

// 排序:按文件名数字前缀
const sortedChapters = publishedChapters.sort((a, b) => {
  const numA = parseInt(a.slug.split('-')[0]) || 999;
  const numB = parseInt(b.slug.split('-')[0]) || 999;
  return numA - numB;
});
---

<h2>所有章节 ({sortedChapters.length})</h2>
{sortedChapters.map(chapter => (
  <article>
    <h3><a href={chapter.slug}>{chapter.data.title}</a></h3>
    <p>{chapter.data.description}</p>
    {chapter.data.difficulty && (
      <span class={`badge badge--${chapter.data.difficulty}`}>
        {chapter.data.difficulty}
      </span>
    )}
  </article>
))}

注意: Schema 定义由 packages/content/config.ts 管理,Web 包无需重复定义。


🌐 i18n 多语言配置(可选)

如果需要多语言支持:

packages/content/
├── chapters/                     ← 默认语言(如中文)
│   ├── 01-overview.md
│   └── ...
└── en/                          ← 英文版本
    ├── chapters/
    │   ├── 01-overview.md
    │   └── ...
    └── index.mdx

apps/web/astro.config.mjs

starlight({
  locales: {
    root: {
      label: '简体中文',
      lang: 'zh-CN',
    },
    en: {
      label: 'English',
      lang: 'en',
    },
  },
  defaultLocale: 'root',
}),

🛠️ 本地开发和调试

开发服务器启动

# 在项目根目录
bun run --filter @repo/web dev

# 或进入 web 应用目录
cd apps/web
bun run dev

访问地址: http://localhost:4321

HMR(热模块替换)

Astro 内置 HMR 支持:

  • ✅ CSS 修改即时生效(无需刷新)
  • ✅ Astro 组件修改即时更新
  • ✅ Islands 组件状态保持(尽可能保留)
  • ⚠️ astro.config.mjs 修改需重启 dev server

DevTools 调试技巧

1. Vue/React DevTools

对于 Islands 组件(React/Vue/Svelte):

# 安装浏览器扩展
# React Developer Tools
# Vue.js devtools
# Svelte DevTools

2. Astro Dev Toolbar

Astro 6.x 内置开发工具栏:

  • 显示组件边界(Component boundaries)
  • 性能指标(Performance metrics)
  • 可访问性检查(A11y audit)

启用方法:

// astro.config.mjs
export default defineConfig({
  devToolbar: {
    enabled: true,
  },
});

3. 构建产物分析

# 安装分析工具
cd apps/web && bun add -D rollup-plugin-visualizer
// astro.config.mjs
vite: {
  plugins: [visualizer({ open: true, gzipSize: true })],
},

运行构建后自动打开可视化报告。


🚀 构建优化

性能调优策略

1. 图片优化

---
import { Image } from 'astro:assets';
---

<!-- 自动优化:WebP/AVIF 格式转换、响应式尺寸、懒加载 -->
<Image
  src={coverImage}
  alt={title}
  widths={[400, 800, 1200]}
  loading="lazy"
/>

配置项

参数说明推荐值
widths生成多个尺寸[400, 800, 1200]
loading加载策略首屏 "eager",其余 "lazy"
formats输出格式默认 ['avif', 'webp']

2. 代码分割

// astro.config.mjs
build: {
  inlineStylesheets: 'auto',  // 小于 4KB 的 CSS 内联
},
vite: {
  build: {
    cssCodeSplit: true,       // CSS 按路由分割
    rollupOptions: {
      output: {
        manualChunks: {
          // 将第三方库分离到独立 chunk
          vendor: ['react', 'react-dom'],
          charts: ['chart.js'],
        },
      },
    },
  },
},

3. 字体优化(Astro 6.0+ Fonts API)

// astro.config.mjs
import { fontProviders } from 'astro/config';

export default defineConfig({
  fonts: [
    {
      name: 'Inter',
      cssVariable: '--font-inter',
      provider: fontProviders.fontsource(),  // 自托管(推荐)
    },
  ],
});

优势

  • ✅ 自动优化字体加载
  • ✅ 支持自托管(隐私友好)
  • ✅ 生成 <link rel="preload">
  • ✅ 设置 1 年 HTTP 缓存

4. Lighthouse 优化目标

指标目标值优化策略
Performance≥ 90代码分割、图片优化、字体预加载
Accessibility≥ 90语义化 HTML、ARIA 标签、颜色对比度
Best Practices≥ 95HTTPS、安全头、无控制台错误
SEO≥ 90Meta 标签、结构化数据、sitemap

运行 Lighthouse

# 方式 1:Chrome DevTools(推荐)
# 打开 DevTools → Lighthouse 标签页 → Generate report

# 方式 2:CLI
npx lighthouse http://localhost:4321 --output html --output-path ./lighthouse-report.html

📂 Monorepo 工作流示例

日常开发流程

# 1. 启动开发服务器(监听 content 和 web 的变化)
bun run --filter @repo/web dev

# 2. 编辑内容(在 packages/content/ 中)
# vim packages/content/chapters/01-overview.md

# 3. 编辑组件(在 apps/web/src/components/ 中)
# vim apps/web/src/components/ui/FeatureGrid.astro

# 4. HMR 自动刷新,无需重启

# 5. 构建验证
bun run --filter @repo/web build

# 6. 预览构建结果
bun run --filter @repo/web preview

从根目录运行命令

// package.json(根目录)
{
  "scripts": {
    "dev": "turbo run dev",
    "build": "turbo run build",
    "preview": "turbo run preview",
    "build:all": "turbo run build"
  }
}

常用命令速查

操作命令说明
启动开发bun run dev监听所有包变化(调用 turbo)
构建教程网站bun run --filter @repo/web build仅构建 web 应用
构建全部bun run build构建所有包(调用 turbo)
添加依赖cd apps/web && bun add <pkg>添加到 web 应用
清理缓存cd apps/web && bunx astro clean清除 .astro 缓存

🔗 与发布阶段的衔接

构建完成后,进入 发布阶段 → 调用 /github-pages

构建阶段交付物

交付物说明验证方式
apps/web/dist/ 目录构建产物(HTML/CSS/JS)bun run --filter @repo/web build 成功
✅ 无构建错误终端返回 exit 0CI 自动检查
✅ 无内部死链所有页面可互相访问Starlink links-validator
✅ 响应式布局375px / 768px / 1280px 可用浏览器 DevTools
✅ Lighthouse 评分Perf ≥ 90, A11y ≥ 90Chrome DevTools

触发发布的条件

# 本地验证通过后
bun run --filter @repo/web build     # ✅ 成功
bun run --filter @repo/web preview   # ✅ 预览正常

# 准备就绪,调用发布技能
→ /github-pages               # 进入 GitHub Pages 部署流程

📂 本子技能结构

skills/tutorial-writer-web/
├── SKILL.md                              ← 本文件(~700行)
└── references/
    └── astro-development.md              ← Astro 6.x 深度开发指南

📚 参考文档索引

文档内容何时读取
astro-development.mdAstro 6.x 新特性、API 参考、调试技巧需要高级功能或排查问题时
tutorial-writer-suggest.mdMonorepo 架构设计理念需要深入理解整体架构时

🔗 相关资源

资源路径/链接用途
父技能../SKILL.mdTutorial Writer 主路由器
Content 子技能../skills/tutorial-writer-content/SKILL.md内容包管理与 Schema 定义
发布子技能../skills/tutorial-writer-github-pages/SKILL.mdGitHub Pages 发布流程
架构设计文档.trae/documents/tutorial-writer-suggest.mdMonorepo 架构完整设计
Astro 官方文档https://docs.astro.build/框架权威指南
Starlight 文档https://starlight.astro.build/主题完整参考

版本历史

版本日期变更
v1.0.02026-05-31🔄 Monorepo 架构重构 (Plan D): 从 build 重命名为 web;移除项目初始化逻辑(→ 官方工具链 create-turbo + create-astro);移除 Content-First 架构详细说明(→ content 子技能);新增 Monorepo 前置条件检查;新增与 content 包集成说明;新增 Monorepo 工作流示例;聚焦纯 Astro/Starlight 配置和组件开发;版本号重置为 1.0.0
v2.1.02026-05-31Content-First v2 升级(前版本,已废弃)— 包含项目创建、迁移脚本、包管理器对比等内容
v2.0.02026-05-30内容优先架构升级(前版本,已废弃)— 基于「内容优先 + 增强层分离」模式
v1.0.02026-05-30初始版本(前版本,已废弃)— 传统 src/content/ 结构

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.