Skip to content
Go back

Vibe Coding:用 GitHub Copilot 五分钟构建应用的完整指南

Published:  at  12:00 AM

Vibe Coding:用 GitHub Copilot 五分钟构建应用的完整指南

什么是 Vibe Coding

想象这样一个场景:你面对着一个包含 492 集播客数据的 CSV 文件,里面记录着播放量、留存率、各类表现指标等多年积累的数据,这些数字都在等待被挖掘、被可视化。但你并不想花上几天时间去搭建仪表板、处理数据格式。

在这种时候,现代开发者会怎么做?打开 VS Code,启动 GitHub Copilot,选择 Claude Sonnet 4.5 作为推理模型,然后通过”Vibe Coding”的方式,仅用 5 分钟就搭建出第一版可运行的分析平台原型,再花 10 分钟将其打磨至完美。

这不是科幻,而是 AI 辅助开发的现实。Vibe Coding 是一种以结果为导向的开发方式:你专注于描述想要什么,AI 负责决定如何实现;你识别问题,AI 提供解决方案;你掌控愿景,AI 处理细节。

为什么选择 Claude Sonnet 4.5

在这个项目中,选择 Claude Sonnet 4.5 作为 GitHub Copilot 的推理模型并非随意。这不仅仅是代码补全的需求,更需要深度架构推理能力。Sonnet 4.5 在以下方面表现出色:

对于全栈项目而言,需要的是能够通盘思考整个系统设计的模型,而不仅仅是自动补全下一行代码的工具。

第一步:以结果为导向的提示词

Vibe Coding 的关键不在于模糊描述,而在于聚焦结果。无需编写技术规格文档、无需绘制线框图、无需指定”请使用 React 18.2、TypeScript 5.3 和 Tailwind 3.4”,只需要清晰地告诉 AI 三件事:

  1. 你有什么:包含播客指标的 CSV 文件
  2. 你想要什么:一个美观、可搜索的网站
  3. 你希望如何部署:基于 Vite 构建,可发布到 GitHub Pages

实际的提示词是这样的:

“附件中的文件包含我们播客每集的所有指标数据。创建一个美观的网站来帮助可视化、搜索、发现主题等。为播客创作者设计一些实用功能并构建出来。使用基于 Vite 的应用,我可以在 GitHub Pages 上发布。”

就是这样,纯粹的”意图驱动”。GitHub Copilot(借助 Sonnet 4.5)自动做出了所有技术决策:

这一切在几秒钟内完成,没有选择困难症,没有关于使用 styled-components 还是 emotion 的争论。

构建过程:见证魔法发生

在两分钟内,GitHub Copilot 就搭建出了完整的项目结构:

├── src/
│   ├── App.tsx                    // 主应用与路由
│   ├── components/
│   │   ├── Dashboard.tsx          // 概览指标
│   │   ├── EpisodeList.tsx        // 搜索与筛选
│   │   ├── TopicAnalysis.tsx      // AI 提取的主题
│   │   ├── PerformanceCharts.tsx  // 深度分析图表
│   │   └── EpisodeDetail.tsx      // 单集详情
│   ├── utils.ts                   // 数据解析与辅助函数
│   └── types.ts                   // TypeScript 类型定义
├── package.json
├── vite.config.ts
└── tailwind.config.js

AI 不仅仅创建了文件,更是构建了解决方案的架构。以下是一些我不需要亲自决策的智能设计:

组件架构设计

AI 将关注点分离为仪表板、列表视图、分析页面、图表组件和详情视图,每个组件职责单一明确。

状态管理策略

使用 React Hooks 进行状态管理(对于这个使用场景,无需引入 Redux 的复杂性),数据流通过单一的 loadEpisodes() 函数加载,计算结果通过 useMemo 进行记忆化优化。

类型安全保障

完整的 TypeScript 覆盖,定义了清晰的接口:

export interface Episode {
  slug: string;
  title: string;
  published: Date;
  day1: number;
  day7: number;
  day14: number;
  day30: number;
  day90: number;
  spotify: number;
  allTime: number;
}

简洁、清晰,恰到好处。

第一个 Bug:CSV 解析问题

运行 npm run dev 并在浏览器中打开页面后,发现数字显示不对劲。这正是 Vibe Coding 有趣的地方。此时有三个选项:

  1. 自己深入代码调试
  2. 搜索”如何解析带引号逗号的 CSV”
  3. 安装一个 CSV 解析库

但实际操作是,直接在 Copilot Chat 中输入:

“请检查 CSV 解析,这里的数字似乎不准确”

问题根源:标题中的逗号

CSV 文件中有这样的条目:

477,"477: From Spark, To Blazor, To Mobile, To Production in 1 Day",2025-08-25,"1,781"

原始的正则表达式解析器在处理引号内的逗号时出现了问题。GitHub Copilot 立即理解了问题所在,并重写了解析器:

const parseCSVLine = (line: string): string[] => {
  const result: string[] = [];
  let current = "";
  let inQuotes = false;

  for (let i = 0; i < line.length; i++) {
    const char = line[i];

    if (char === '"') {
      inQuotes = !inQuotes;
    } else if (char === "," && !inQuotes) {
      result.push(current.trim());
      current = "";
    } else {
      current += char;
    }
  }

  result.push(current.trim());
  return result;
};

这就是 Vibe Coding 的美妙之处:无需了解如何编写 CSV 解析器的细节,只需要识别出输出结果有误。AI 负责实现。热重载生效,数字修复完成,继续前进。

部署挑战:GitHub Actions 配置

接下来需要将应用部署到 GitHub Pages。由于在另一个仓库中有现成的工作流示例,直接向 Copilot 提问:

“能否为此创建 GitHub Pages 部署配置?参考:https://github.com/jamesmontemagno/PinkPuffQuest/blob/main/.github/workflows/deploy.yml

GitHub Copilot 获取了该工作流,理解了模式,并创建了配置:

name: Deploy to GitHub Pages

on:
  push:
    branches: ["main"]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Set up Node
        uses: actions/setup-node@v5
        with:
          node-version: lts/*
          cache: "npm"
      - name: Install dependencies
        run: npm ci
      - name: Build
        run: npm run build
      - name: Setup Pages
        uses: actions/configure-pages@v5
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: "./dist"
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

完美无瑕,但是……

TypeScript 报错处理

首次部署失败了:

Error: src/App.tsx(4,3): error TS6133: 'LineChart' is declared but its value is never read.
Error: src/App.tsx(5,3): error TS6133: 'PieChart' is declared but its value is never read.

这是典型的过度导入问题。AI 在搭建脚手架时引入了一些组件,然后重构时移除了这些组件的使用,但忘记清理导入语句。

向 Copilot 提交错误信息:

“当 Action 运行时我遇到了:[粘贴错误信息]”

GitHub Copilot 的修复非常精准:

// 修复前
import { BarChart, LineChart, PieChart, TrendingUp, TrendingDown, ... } from 'lucide-react';

// 修复后
import { BarChart, Radio, Calendar, Search, Tag, Activity } from 'lucide-react';

同时还修复了未使用变量的反模式写法:

// 修复前
performanceDistribution.map((entry, index) => (
  <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
))

// 修复后
performanceDistribution.map((_entry, index) => (
  <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
))

构建成功,应用部署上线。

最终构建的功能

让我们看看在无意识中构建出了哪些功能:

智能分析仪表板

高级搜索与筛选

实现了记忆化的响应式筛选逻辑:

const filteredAndSortedEpisodes = useMemo(() => {
  let filtered = episodes.filter(ep => {
    const matchesSearch =
      ep.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
      ep.slug.toLowerCase().includes(searchTerm.toLowerCase());
    const matchesMin = !minListens || ep.allTime >= parseInt(minListens);
    const matchesMax = !maxListens || ep.allTime <= parseInt(maxListens);
    return matchesSearch && matchesMin && matchesMax;
  });

  filtered.sort((a, b) => {
    // 动态排序逻辑
  });

  return filtered;
}, [episodes, searchTerm, sortField, sortOrder, minListens, maxListens]);

性能优化、响应式、优雅。

AI 主题提取

这是最喜欢的功能之一。AI 从单集标题中提取主题关键词:

export const extractTopics = (episodes: Episode[]): Map<string, Episode[]> => {
  const topics = new Map<string, Episode[]>();

  const keywords = [
    "AI",
    "iOS",
    "Android",
    "macOS",
    "Swift",
    "Kotlin",
    "C#",
    ".NET",
    "MAUI",
    "Blazor",
    "React",
    "Azure",
    "GitHub",
    "VS Code",
    "Xcode",
    "Apple",
    "Microsoft",
    // ... 以及 30 多个其他关键词
  ];

  episodes.forEach(episode => {
    const title = episode.title.toLowerCase();
    keywords.forEach(keyword => {
      if (title.includes(keyword.toLowerCase())) {
        if (!topics.has(keyword)) {
          topics.set(keyword, []);
        }
        topics.get(keyword)!.push(episode);
      }
    });
  });

  return topics;
};

现在可以看到:

留存率分析

应用会自动计算留存曲线:

export const calculateRetention = (
  episode: Episode
): {
  day1: number;
  day7: number;
  day30: number;
} => {
  if (episode.allTime === 0) {
    return { day1: 0, day7: 0, day30: 0 };
  }

  return {
    day1: (episode.day1 / episode.allTime) * 100,
    day7: (episode.day7 / episode.allTime) * 100,
    day30: (episode.day30 / episode.allTime) * 100,
  };
};

通过这个功能,现在知道平均而言:

这些都是之前无法获得的可行性洞察。

精美的图表

Recharts 让这一切变得简单:

<ResponsiveContainer width="100%" height={300}>
  <LineChart data={timelineData}>
    <CartesianGrid strokeDasharray="3 3" />
    <XAxis dataKey="name" angle={-45} textAnchor="end" height={80} />
    <YAxis />
    <Tooltip formatter={(value) => formatNumber(value as number)} />
    <Line type="monotone" dataKey="listens" stroke="#0ea5e9" strokeWidth={2} />
    <Line type="monotone" dataKey="day7" stroke="#10b981" strokeWidth={2} />
  </LineChart>
</ResponsiveContainer>

响应式、可交互、专业级。

Vibe Coding 方法论

让我们总结一下是什么让这一切成功的:

1. 以结果为导向的提示词

不要说:“创建一个带有数据属性的 React 组件” 而要说:“构建一个展示我的播客指标的仪表板”

2. 让 AI 做出技术决策

AI 选择了:

所有选择都很合理,而这些都是不需要亲自研究的。

3. 在 Bug 上迭代,而非功能

当出现问题时,描述症状即可:

无需知道解决方案,只需识别问题。

4. 引用自己的工作

将 Claude 指向其他 GitHub 仓库中的部署工作流,它理解了模式并进行了适配。这对于保持一致性至关重要。

5. 信任类型系统

TypeScript 在运行前捕获了问题:

interface Episode {
  slug: string;
  title: string;
  published: Date; // Date 类型,而非 string
  day1: number; // number 类型,处理解析
  // ...
}

AI 在整个过程中使用了正确的类型,这避免了一整类 bug。

GitHub Copilot 的魔力

GitHub Copilot 不仅仅是在建议代码——配合 Sonnet 4.5 作为推理模型,它成为了架构师和结对编程伙伴:

架构层面:

实现层面:

这种双模式操作——深度思考架构的同时仍然处理细节——正是现代 AI 辅助开发如此强大的原因。

时间线:5 分钟到生产环境

初始阶段:

后续完善:

关于 Vibe Coding 的思考

这不是懒惰

并没有逃避学习,而是避免重新学习已经掌握的内容。作为开发者,我们知道如何:

但为什么要花一个小时做 AI 几秒钟就能完成的事情呢?

这是关于杠杆效应

开发者的工作是:

  1. 定义结果
  2. 提供数据
  3. 识别问题
  4. 发布产品

AI 的工作是其他一切。

这是关于流畅体验

无需在以下事项之间进行上下文切换:

只有从想法到实现的纯粹创造性流程。

令人惊喜的代码

以下是 Claude 编写的一段我认为很巧妙的代码:

const getEpisodePerformance = (
  episode: Episode,
  avgAllTime: number
): "excellent" | "good" | "average" | "below-average" => {
  const ratio = episode.allTime / avgAllTime;

  if (ratio >= 1.5) return "excellent";
  if (ratio >= 1.1) return "good";
  if (ratio >= 0.9) return "average";
  return "below-average";
};

它创建了一个我甚至没有要求的性能分类系统。但这非常有意义——现在每一集都会获得一个徽章,显示它与平均水平的对比。

GitHub Copilot 预见了一个需求,而这个需求我有但尚未明确表达。这正是 Sonnet 4.5 深度推理能力的闪光点——它不仅仅响应你的要求,还会思考你将需要什么。

未来就是 Vibes

这不是未来——这就是现在。配备 Sonnet 4.5 等高级推理模型的 GitHub Copilot 已经从根本上改变了我们构建软件的方式。

问题不是”AI 能写代码吗?“(显然可以),而是:“如何与 GitHub Copilot 协作以更快地构建更好的软件?”

以下是协作框架:

  1. 你拥有愿景:我们要构建什么以及为什么?
  2. Copilot 拥有实现:我们如何构建它?
  3. 你拥有质量:这真的有效吗?
  4. 共同拥有结果:我们解决了问题吗?

亲自尝试

想要 Vibe Coding 自己的项目?以下是步骤:

  1. 使用 VS Code + GitHub Copilot(对于需要深度推理的复杂项目,选择 Sonnet 4.5)
  2. 编写以结果为导向的提示词:“为我构建能实现 Y 功能的 X”
  3. 让 Copilot 做技术选择:除非有强烈意见,否则不要过度指定细节
  4. 迭代问题而非解决方案:描述错误,让 Copilot 修复
  5. 快速发布,快速迭代:迅速进入生产环境,基于实际使用进行改进

参考资料



Next Post
Git Submodules 深度解析:跨仓库依赖管理的最佳实践