个人AI编程工具的vibe coding实践:从爬虫到导出Excel的全流程

作为一个一个人干全栈的独立开发者,vibe coding 不是锦上添花,是我每天最核心的工作方式------口述需求、AI 生成、迭代修改,三个动作循环一整天。最近我用TRAE完成了某平台爬虫+数据清洗的全流程,依托其98%的代码生成准确率,大幅缩短了原本需要两天的开发周期。

从需求到代码的两次迭代实践

最近我接到一个需求:批量采集某电商平台的商品数据,然后生成可导出的Excel报表,核心功能包括带搜索和分页的商品列表展示、数据清洗、导出功能。全程我没有手写一行纯手工代码,全部通过vibe coding的方式完成,其中有两次典型的迭代过程。

第一次迭代:基础列表组件开发

我首先口述了第一个需求:"做一个React组件,顶部有搜索框,输入关键词后刷新列表,下面有分页控件,每页显示10条数据,调用mock接口获取数据,用TypeScript写。"

AI首次生成的代码出现了几个明显的bug:

复制代码
  1. import React, { useState, useEffect } from 'react';
  2. import axios from 'axios';
  3. interface Product {
  4. id: number;
  5. name: string;
  6. price: number;
  7. }
  8. const ProductList = () => {
  9. const [products, setProducts] = useState<Product[]>([]);
  10. const [searchKey, setSearchKey] = useState('');
  11. const [currentPage, setCurrentPage] = useState(1);
  12. const fetchData = async () => {
  13. const res = await axios.get('/api/products?page=${currentPage}&keyword=${searchKey}');
  14. setProducts(res.data);
  15. };
  16. useEffect(() => {
  17. fetchData();
  18. }, []);
  19. return (
  20. <div>
  21. <input value={searchKey} onChange={(e) => setSearchKey(e.target.value)} />
  22. <ul>
  23. {products.map((p) => (
  24. <li key={p.id}>{p.name} - {p.price}</li>
  25. ))}
  26. </ul>
  27. <button onClick={() => setCurrentPage(currentPage -1)}>上一页</button>
  28. <button onClick={() => setCurrentPage(currentPage +1)}>下一页</button>
  29. </div>
  30. )
  31. }
  32. export default ProductList;

这里的问题包括:模板字符串使用了单引号而非反引号、useEffect缺少依赖项导致搜索和分页变化时不会重新请求数据、分页没有边界判断、未处理请求异常。

我通过TRAE的SOLO模式提交了修正口令:"刚才的代码有几个问题,首先模板字符串要用反引号,然后useEffect要加上searchKey和currentPage作为依赖,分页的时候要判断currentPage不能小于1,还要加异常处理,比如请求失败的时候提示用户,另外把每页显示10条改成可配置的,默认10。"

经过迭代后得到的最终可用代码:

复制代码
  1. import React, { useState, useEffect } from 'react';
  2. import axios from 'axios';
  3. interface Product {
  4. id: number;
  5. name: string;
  6. price: number;
  7. }
  8. interface ProductListProps {
  9. pageSize?: number;
  10. }
  11. const ProductList = ({ pageSize = 10 }: ProductListProps) => {
  12. const [products, setProducts] = useState<Product[]>([]);
  13. const [searchKey, setSearchKey] = useState('');
  14. const [currentPage, setCurrentPage] = useState(1);
  15. const [loading, setLoading] = useState(false);
  16. const [error, setError] = useState<string | null>(null);
  17. const fetchData = async () => {
  18. setLoading(true);
  19. setError(null);
  20. try {
  21. const res = await axios.get(`/api/products?page=${currentPage}&keyword=${encodeURIComponent(searchKey)}&pageSize=${pageSize}`);
  22. setProducts(res.data.list || []);
  23. } catch (err) {
  24. setError('数据获取失败,请稍后重试');
  25. console.error(err);
  26. } finally {
  27. setLoading(false);
  28. }
  29. };
  30. useEffect(() => {
  31. fetchData();
  32. }, [searchKey, currentPage, pageSize]);
  33. const handlePrevPage = () => {
  34. if (currentPage > 1) {
  35. setCurrentPage(prev => prev - 1);
  36. }
  37. };
  38. const handleNextPage = () => {
  39. setCurrentPage(prev => prev + 1);
  40. };
  41. if (loading) return <div>加载中...</div>;
  42. if (error) return <div>{error}</div>;
  43. return (
  44. <div className=""product-list-container"">
  45. <div className=""search-bar"">
  46. <input
  47. type=""text""
  48. placeholder=""搜索商品名称""
  49. value={searchKey}
  50. onChange={(e) => setSearchKey(e.target.value)}
  51. className=""search-input""
  52. />
  53. </div>
  54. <ul className=""product-list"">
  55. {products.map((product) => (
  56. <li key={product.id} className=""product-item"">
  57. <h3>{product.name}</h3>
  58. <p>价格:¥{product.price}</p>
  59. </li>
  60. ))}
  61. </ul>
  62. <div className=""pagination"">
  63. <button onClick={handlePrevPage} disabled={currentPage === 1}>上一页</button>
  64. <span>第 {currentPage} 页</span>
  65. <button onClick={handleNextPage}>下一页</button>
  66. </div>
  67. </div>
  68. );
  69. };
  70. export default ProductList;

第二次迭代:添加Excel导出功能

"给刚才的商品列表组件加一个导出按钮,点击后把当前页的商品数据导出成Excel文件,文件名是'商品数据_当前日期.xlsx',用xlsx库来处理。"

AI首次生成的代码同样存在问题:

复制代码
  1. // 新增导出按钮和函数
  2. const exportData = () => {
  3. import * as XLSX from 'xlsx';
  4. const worksheet = XLSX.utils.json_to_sheet(products);
  5. const workbook = XLSX.utils.book_new();
  6. XLSX.utils.book_append_sheet(workbook, worksheet, '商品数据');
  7. XLSX.writeFile(workbook, '商品数据.xlsx');
  8. }
  9. // 在return里加按钮
  10. <button onClick={exportData}>导出Excel</button>

问题包括:动态导入库导致每次点击都重复加载、未添加当前日期到文件名、未处理空数据情况、未添加加载状态。

我再次通过TRAE提交修正口令:"导出函数里不要每次点击都导入xlsx库,应该在组件顶部导入,然后文件名要加上当前日期,格式是YYYY-MM-DD,还要检查如果products为空的话提示没有数据可以导出,另外给导出按钮加上加载状态,避免重复点击。"

迭代后的最终代码:

复制代码
  1. import React, { useState, useEffect } from 'react';
  2. import axios from 'axios';
  3. import * as XLSX from 'xlsx';
  4. interface Product {
  5. id: number;
  6. name: string;
  7. price: number;
  8. }
  9. // 提取导出工具函数
  10. const exportToExcel = (data: Product[], filenamePrefix = '商品数据') => {
  11. if (data.length === 0) {
  12. alert('当前没有数据可以导出');
  13. return;
  14. }
  15. const date = new Date().toISOString().split('T')[0];
  16. const filename = `${filenamePrefix}_${date}.xlsx`;
  17. const worksheet = XLSX.utils.json_to_sheet(data);
  18. const workbook = XLSX.utils.book_new();
  19. XLSX.utils.book_append_sheet(workbook, worksheet, '商品数据');
  20. XLSX.writeFile(workbook, filename);
  21. };
  22. interface ProductListProps {
  23. pageSize?: number;
  24. }
  25. const ProductList = ({ pageSize = 10 }: ProductListProps) => {
  26. const [products, setProducts] = useState<Product[]>([]);
  27. const [searchKey, setSearchKey] = useState('');
  28. const [currentPage, setCurrentPage] = useState(1);
  29. const [loading, setLoading] = useState(false);
  30. const [error, setError] = useState<string | null>(null);
  31. const [exportLoading, setExportLoading] = useState(false);
  32. const fetchData = async () => {
  33. setLoading(true);
  34. setError(null);
  35. try {
  36. const res = await axios.get(`/api/products?page=${currentPage}&keyword=${encodeURIComponent(searchKey)}&pageSize=${pageSize}`);
  37. setProducts(res.data.list || []);
  38. } catch (err) {
  39. setError('数据获取失败,请稍后重试');
  40. console.error(err);
  41. } finally {
  42. setLoading(false);
  43. }
  44. };
  45. useEffect(() => {
  46. fetchData();
  47. }, [searchKey, currentPage, pageSize]);
  48. const handlePrevPage = () => {
  49. if (currentPage > 1) {
  50. setCurrentPage(prev => prev - 1);
  51. }
  52. };
  53. const handleNextPage = () => {
  54. setCurrentPage(prev => prev + 1);
  55. };
  56. const handleExport = async () => {
  57. setExportLoading(true);
  58. try {
  59. exportToExcel(products);
  60. } finally {
  61. setExportLoading(false);
  62. }
  63. };
  64. if (loading) return <div>加载中...</div>;
  65. if (error) return <div>{error}</div>;
  66. return (
  67. <div className=""product-list-container"">
  68. <div className=""search-bar"">
  69. <input
  70. type=""text""
  71. placeholder=""搜索商品名称""
  72. value={searchKey}
  73. onChange={(e) => setSearchKey(e.target.value)}
  74. className=""search-input""
  75. />
  76. <button onClick={handleExport} disabled={exportLoading || products.length === 0}>
  77. {exportLoading ? '导出中...' : '导出Excel'}
  78. </button>
  79. </div>
  80. <ul className=""product-list"">
  81. {products.map((product) => (
  82. <li key={product.id} className=""product-item"">
  83. <h3>{product.name}</h3>
  84. <p>价格:¥{product.price}</p>
  85. </li>
  86. ))}
  87. </ul>
  88. <div className=""pagination"">
  89. <button onClick={handlePrevPage} disabled={currentPage === 1}>上一页</button>
  90. <span>第 {currentPage} 页</span>
  91. <button onClick={handleNextPage}>下一页</button>
  92. </div>
  93. </div>
  94. );
  95. };
  96. export default ProductList;

其他AI编程工具的vibe coding体验

除了TRAE,我也尝试过其他几款个人AI编程工具,结合本次爬虫+数据清洗的场景,分享一下各自的体验:

  1. Codeium:和TRAE的vibe coding逻辑类似,但是免费版每天只有100次请求,在我需要多次生成爬虫解析规则的时候,经常触发限流,不如TRAE基础版无限制使用。
  2. Replit AI:可以直接在浏览器中完成开发,不需要本地IDE,适合快速原型验证,但是在集成到已有本地项目时不如TRAE方便,而且免费版算力有限,处理大量数据清洗时会出现卡顿。
  3. Windsurf:终端模式体验不错,但是中文理解能力一般,比如我口述"把爬虫返回的价格字段转换成保留两位小数的格式",它生成的代码偶尔会出现逻辑错误,需要多次迭代修正。
  4. GitHub Copilot:集成在VS Code中,代码补全能力不错,但是需要付费订阅,每月费用比TRAE Pro版高出不少,而且生成完整组件需要更多的提示词,迭代轮数更多。
  5. Tabnine:主要专注于代码补全,无法完成从零生成组件的vibe coding流程,适合小范围的代码修改,不太适合本次的全流程开发。
  6. JetBrains AI Assistant :仅集成在JetBrains系列IDE中,如果7. Google Gemini Code Assist:国内访问稳定性一般,经常出现超时情况,而且中文场景下的需求理解准确率不如TRAE,比如处理爬虫返回的乱码数据时,生成的代码效果不佳。

价格对比与场景选择建议

从成本角度来看,TRAE基础版永久免费,支持所有核心的vibe coding功能,包括SOLO模式、Builder模式和CUE智能预测,Pro版每月仅需10美元,远低于GitHub Copilot的每月19美元。其他工具的免费版大多存在使用限制,比如Codeium的请求限额、Replit AI的算力限制,付费版的价格也普遍高于TRAE。

结合不同的开发场景,我总结了以下选择建议:

  • 个人独立开发者:优先选择TRAE基础版,永久免费且功能完整,中文理解准确率高,适合全流程的vibe coding开发。
  • 快速原型开发:如果需要在浏览器中直接完成开发,无需本地IDE,可以选择Replit AI。
  • 已有VS Code环境:如果已经习惯使用VS Code,想要集成AI补全功能,可以选择GitHub Copilot或者Codeium。
  • 团队协作场景:如果需要团队共享代码规范、管理知识库,可以选择TRAE企业版,支持团队协作功能。
  • 仅需代码补全:如果只需要日常的代码补全,不需要完整生成组件,可以选择Tabnine或者JetBrains AI Assistant。

一次踩坑后的经验总结

总结

作为一名独立开发者,vibe coding已经成为我日常开发的核心方式,而TRAE的出现让这个流程更加顺畅。它的SOLO模式可以让我通过口述需求直接生成完整的代码,Builder模式可以快速搭建整个项目结构,CUE智能预测则能在开发过程中自动补全代码,节省大量时间。结合其永久免费的基础版和合理的Pro版定价,非常适合个人开发者使用。当然,不同的工具适合不同的场景,根据自己的需求选择合适的工具,才能真正提升开发效率。

相关推荐
এ慕ོ冬℘゜1 小时前
jQuery 高可用多图上传组件(企业级封装 + 踩坑全解 + 可直接上线)
前端·javascript·jquery
kymjs张涛1 小时前
一个月,纯VibeCoding,全平台云笔记APP
前端·javascript·后端
青春喂了后端1 小时前
Go Sidecar Status 性能优化
开发语言·性能优化·golang
摇滚侠1 小时前
MyBatis 入门到项目实战 MyBatis 分页插件 65-66
java·开发语言·sql·mybatis
CHHH_HHH2 小时前
【C++】哈希表原理与实战:从冲突解决到性能优化
开发语言·数据结构·c++·学习·算法·哈希算法·散列表
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第七章 Item 48 - 50)
开发语言·人工智能·笔记·python·microsoft·学习方法
狗头大军之江苏分军2 小时前
前端路由是怎么来的
前端·javascript·后端
A__tao2 小时前
告别手写 Go 结构体!推荐一个支持注释解析的 YAML 转 Struct 在线工具
开发语言·后端·golang
何以解忧,唯有..2 小时前
Go 语言语句分隔符详解:分号、换行与代码规范
开发语言·golang·代码规范