新闻详情

新闻详情

首页 / 资讯中心 / 详情

我用 Claude Code 写了 2 万行 Node.js 代码,然后亲手删掉:一次 Vibe Coding 的工程能力复盘

发布时间:2026/10/2 12:29:26来源:尧图网络
我用 Claude Code 写了 2 万行 Node.js 代码,然后亲手删掉:一次 Vibe Coding 的工程能力复盘
1. 当 2 万行 Node.js 代码变成烫手山芋我用 Claude Code 给一个 Node.js 项目生成了 21000 行代码测试全绿覆盖率 92%ESLint 零告警。六个月后我把它们全部删了只保留了 3000 行手写核心。这不是标题党是我在 Vibe Coding 这条路上踩过最深的坑。先说清楚这篇文章能帮你做什么如果你正在用 Claude Code、Cursor 或类似工具生成 Node.js 代码并且开始怀疑“这些代码到底该留还是该删”我会给你一套可复制的项目结构检查清单和代码质量验证动作。适合谁看适合那些已经让 AI 写了超过 5000 行代码、但每次改需求都心里发虚的开发者。事情是这样的。去年底我接了一个内部工具的重构任务核心是一个任务调度模块涉及并发控制、失败重试、状态持久化。按我自己的节奏大概三周。我打开 Claude Code用自然语言描述了需求六个小时后仓库里躺着 21000 行代码。目录结构清晰TypeScript 类型完整甚至帮我写好了 JSDoc。那天晚上我没睡着。不是兴奋是我突然意识到这 21000 行里我能逐行讲清楚的不到 2000 行。第二天同事问我“这个重试策略为什么用指数退避而不是固定间隔”我张了张嘴说“AI 选的”。他又问“这个并发锁在进程崩溃时怎么释放”我说“测试过了”。他笑了笑没再问。那个笑容让我后背发凉。接下来的三个月每次需求变更都像在拆炸弹。改一个状态机的分支三个不相关的测试挂了。加一个字段序列化层报错。我让 Claude Code 去修它又生成了 800 行新代码。到第六个月代码量涨到 34000 行而我越来越不敢动它。真正压垮我的是一次线上事故。一个边界条件导致任务重复执行排查了六个小时最后发现是 AI 生成的一段 Promise 链在特定时序下会跳过错误捕获。那段代码我读过三遍每次都觉得“没问题”。因为它写得太像正确的代码了。删掉重写花了四周。手写版本 12000 行核心调度逻辑 3000 行。上线后三个月零事故。这篇文章就是这次复盘的完整记录包括我怎么判断哪些代码该留、哪些该删以及一套你可以直接用的检查清单。2. TaoToken 前置给 Claude Code 一个稳定的接入层在讲代码质量之前得先解决一个工程问题Claude Code 的接入稳定性。我早期直接用官方 API遇到过高频请求被限流、长上下文超时、以及最头疼的——OAuth 令牌过期导致会话中断。对于一个要连续生成几千行代码的场景接入层不稳定等于白干。我现在的做法是通过 TaoToken 做统一接入。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 端点是 https://taotoken.net/api。它的作用是提供一个兼容 Anthropic 协议的转发层让你在 Claude Code 里配置一次 Base URL 和 Key后续所有模型调用都走这个通道。为什么要在“删代码”的文章里讲接入因为我的教训是接入不稳定会诱导你接受低质量生成。当请求频繁失败时你会不自觉地降低对输出质量的审查标准只求“能跑就行”。这种心态下生成的代码就是未来要删的那 2 万行。具体配置分三步。第一步在 TaoToken 控制台创建一个 API Key地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。第二步在 Claude Code 的配置里设置环境变量。第三步验证模型 ID 是否正确。这里有个关键点Claude Code 的配置文件和普通 CLI 工具不同它读取的是~/.claude/settings.json。你需要写入以下内容{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-taotoken-key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }注意ANTHROPIC_MODEL这个字段。很多人只配了 Base URL 和 Key忘了指定 Model ID结果 Claude Code 回退到默认模型生成质量波动很大。我实测下来Sonnet 4 在代码生成任务上的稳定性明显优于 Haiku尤其是在处理超过 500 行的文件时。如果你用的是 Claude Code 的 coding-plan 模式还需要在项目根目录放一个.claude/settings.json覆盖全局配置{ model: claude-sonnet-4-20250514, maxTokens: 8192, temperature: 0.2 }temperature设成 0.2 是我踩坑后的选择。默认值 1.0 会让 AI 在生成代码时“发挥创意”比如给你引入一个没在依赖里的库或者用了一个你项目里不存在的工具函数。0.2 更保守生成的代码更贴近你已有的代码风格。配置完成后用一条简单请求验证curl https://taotoken.net/api/v1/messages \ -H x-api-key: sk-your-taotoken-key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 100, messages: [{role: user, content: 回复 OK}] }如果返回{content:[{type:text,text:OK}]}说明接入层通了。这一步看起来简单但我见过太多人跳过验证直接进 Claude Code 写代码结果生成到一半报 401前功尽弃。接入层稳定之后你才有资格谈代码质量。因为只有生成过程可控你才能把精力放在审查上而不是反复重试。3. 可复制配置项目结构检查清单与质量门禁这一节是全文的核心。我把我删掉 2 万行代码后总结的检查清单完整写出来你可以直接拿去用。这套清单分三个层次项目结构、代码质量、认知负担。先说项目结构。AI 生成代码最大的问题是“扁平化”——它倾向于把所有逻辑塞进少数几个大文件因为这样生成时上下文更连贯。但维护时这是灾难。我的检查清单第一条任何单个文件超过 400 行标记为待拆分。具体怎么查在项目根目录跑find src -name *.ts -o -name *.js | xargs wc -l | sort -rn | head -20这条命令列出最长的 20 个文件。如果前 5 个都超过 500 行说明 AI 在生成时没有做模块划分。我的经验是一个健康的 Node.js 项目核心业务文件应该在 150 到 300 行之间。第二条检查目录深度。AI 生成的代码往往只有两层src/和src/utils/。但真实项目需要按领域划分。我用的检查命令是find src -type d | awk -F/ {print NF-1, $0} | sort -rn | head -10如果最大深度只有 2说明缺少领域分层。我现在的项目结构是这样的src/ modules/ scheduler/ scheduler.service.ts scheduler.types.ts scheduler.repository.ts task/ task.service.ts task.state-machine.ts shared/ errors/ logger/ infra/ db/ queue/每个模块内部再分 service、types、repository。这样 AI 生成时你可以按模块给它上下文而不是把整个项目塞进去。第三条检查循环依赖。AI 生成代码时经常出现 A 引用 B、B 引用 A 的情况因为它在生成每个文件时只看到局部。用 madge 检查npx madge --circular --extensions ts src/如果有循环依赖输出会列出环。我删掉的那 2 万行里有 7 个循环依赖其中一个涉及 5 个文件。这种结构下任何修改都可能引发连锁反应。再说代码质量门禁。我在package.json里加了三个脚本每次 AI 生成代码后必须全部通过{ scripts: { check:complexity: npx ts-complexity-checker src/ --max 15, check:duplication: npx jscpd src/ --min-tokens 50 --threshold 5, check:types: tsc --noEmit --strict } }check:complexity检查圈复杂度超过 15 的函数标记出来。AI 生成的代码经常有复杂度 30 的函数因为它把所有分支都塞进一个函数里。check:duplication检查重复代码块阈值设 5% 是因为 AI 在不同文件里生成相似逻辑的概率很高。check:types开 strict 模式能抓出 AI 常用的any逃逸。这三个脚本跑完如果任何一项失败代码不允许合入。我实测下来AI 首次生成的代码通过率只有 40% 左右。也就是说2 万行里有 1.2 万行需要返工。这个数字本身就是“该删”的信号。最后是认知负担检查。这一条没有自动化工具只能手动做。方法很简单随机挑一个 AI 生成的函数关掉编辑器在白板上画出它的执行流程。如果你画不出来或者画到一半发现“这里为什么这样跳”这个函数就是认知负担过高的。我给自己定的规则是核心调度模块的每个函数我都要能画出流程图。画不出来的重写。这条规则让我删掉了 8000 行“看起来没问题”的代码。4. 验证请求与成功结果怎么判断代码该留还是该删有了检查清单接下来是决策。不是所有 AI 生成的代码都要删我的标准是“三留三删”。先说什么该留。第一胶水代码留。比如配置文件解析、日志格式化、HTTP 客户端封装这些代码逻辑简单、边界清晰、测试容易覆盖。AI 生成这类代码的质量很高而且维护成本低。我保留了大约 2000 行这类代码。第二测试代码留。AI 生成测试用例的能力很强尤其是边界条件覆盖。我让 Claude Code 为手写核心逻辑生成测试它找出了 3 个我没想到的边界情况。这类代码留但要做一件事每个测试用例必须能讲清楚“它在验证什么”。讲不清楚的测试删掉重写。第三类型定义留。TypeScript 的 interface 和 type 定义AI 生成得又快又准。这部分我基本全留大约 1500 行。再说说什么该删。第一核心业务逻辑删。调度、并发、状态机、重试策略这些必须手写。原因不是 AI 写得不好而是这些逻辑的每个决策都需要你理解“为什么”。AI 可以告诉你“用指数退避”但它不知道你的业务场景里重试间隔和下游服务恢复时间的关系。第二跨模块的协调逻辑删。AI 生成代码时是文件级的它看不到模块间的隐式契约。比如任务调度模块和状态持久化模块之间的时序假设AI 不会主动处理。这类代码我全部重写大约 6000 行。第三任何你“讲不出来”的代码删。这是最狠的一条也是最有效的一条。我删掉的 2 万行里有 9000 行属于这一类。它们测试通过、类型正确、复杂度达标但我讲不清楚它们为什么这样写。具体操作上我用一个“讲解测试”来决策。每周五下午我随机抽 5 个 AI 生成的函数向同事口头解释。解释内容包括这个函数在做什么、为什么这样做、如果出问题最可能在哪里。如果 5 个里有 2 个讲不清楚这个模块整体标记为待重写。这个测试听起来主观但它抓住了核心代码的可维护性不取决于它有多“正确”而取决于维护者有多“理解”。AI 生成的代码最大的问题不是 bug是它让你失去了理解的机会。验证请求方面我建议你做一个“删除实验”。挑一个 AI 生成的模块把它删掉然后尝试手写。如果你手写时发现“我完全不知道从哪开始”说明这个模块你从来没真正拥有过。如果你手写时发现“原来这么简单”说明 AI 把它复杂化了。我做过这个实验。删掉调度模块的 8000 行 AI 代码后我手写了 3000 行。代码量少了 62%但每个决策我都能讲清楚。上线后三个月这个模块零事故。而之前 AI 版本运行六个月出了两次线上问题。成功的结果不是“代码能跑”而是“你能改”。判断标准很简单需求变更时你是打开编辑器直接改还是先让 AI 理解需求再生成如果是后者这段代码就不属于你。5. 本篇常见错排查401、local proxy failed 与 reading choices这一节列出我在接入 Claude Code 和验证代码时遇到的高频报错以及对应的排查路径。每个报错都附上真实日志片段你可以对照自己的情况。第一个401 Unauthorized。完整报错通常是{type:error,error:{type:authentication_error,message:invalid x-api-key}}原因有三个。一是 Key 复制时带了空格检查settings.json里的ANTHROPIC_API_KEY值确保没有首尾空格。二是 Key 已过期或被撤销去 TaoToken 控制台重新生成。三是 Base URL 写错了注意是https://taotoken.net/api不要加/v1Claude Code 会自动拼接路径。第二个local proxy failed。报错长这样Error: connect ECONNREFUSED 127.0.0.1:8080这是 Claude Code 尝试走本地代理但失败了。检查你的环境变量里有没有HTTP_PROXY或HTTPS_PROXY如果有先 unset 掉。另外检查~/.claude/settings.json里有没有proxy字段有的话删掉。Claude Code 默认直连不需要额外代理配置。第三个reading choices 相关报错。这个通常出现在流式响应解析时TypeError: Cannot read properties of undefined (reading choices)原因是响应格式不匹配。Claude Code 期望 Anthropic 格式的流式响应但如果 Base URL 指向了一个 OpenAI 兼容的端点就会报这个错。确认你的ANTHROPIC_BASE_URL是https://taotoken.net/api这个端点返回的是 Anthropic 原生格式。第四个OAuth token expired。报错OAuth token has expired. Please re-authenticate.如果你用的是 Claude Code 的 OAuth 登录模式令牌默认 8 小时过期。解决方案是改用 API Key 模式在settings.json里配置ANTHROPIC_API_KEY不要用claude login。API Key 模式没有过期问题适合长时间生成任务。第五个模型 ID 不匹配。报错model: claude-sonnet-4-20250514 not found检查 Model ID 拼写。常见错误是把20250514写成20250515或者把sonnet写成sonet。去 TaoToken 的文档页 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 查最新的模型列表。第六个生成到一半中断。没有明确报错但 Claude Code 停止输出。这通常是maxTokens设得太小。在项目级.claude/settings.json里把maxTokens调到 8192 或更高。如果还是中断检查网络稳定性长连接容易被中间设备切断。排查顺序建议先验证 curl 请求通不通再检查 Claude Code 配置最后看项目级配置。80% 的问题出在配置层而不是网络层。6. 语义一致 CTA从删代码到建能力删掉 2 万行代码这件事让我重新理解了 AI 编程的边界。Claude Code 是一个极强的生成器但它不是决策者。它能写出测试通过的代码但写不出“你知道为什么这样写”的代码。如果你正在经历类似的困境我的建议是先用 TaoToken 把接入层稳定下来地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。接入稳定后你才有精力做代码审查而不是反复重试。具体行动上我建议你按这个顺序来。第一步去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 创建一个 Key配置到 Claude Code 里。第二步用 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里的文档确认模型 ID 和参数。第三步跑一遍我上面给的三个检查脚本看看你现有项目里有多少代码触发了告警。如果你需要长期做代码生成和重构可以考虑 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。它适合那种每天都要生成和审查大量代码的场景比按量计费更可控。验证模型是否正常工作可以用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 发一条测试消息。如果你在用 Claude Code 的 Anthropic 兼容模式参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_code_anthropicutm_campaignrewrite 里的配置说明。最后说一个我自己的习惯。每次让 AI 生成超过 200 行代码我会在提交信息里加一行reviewed-by: human。这不是形式主义是提醒自己这段代码我读过、我理解、我负责。如果某次提交我加不上这行说明我还没准备好拥有它。删代码不是目的建立判断力才是。AI 可以帮你写但只有你能决定什么该留。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

企业级大模型网关:可编排、可计量、可审计的中枢操作系统 2026/10/2 13:12:46

企业级大模型网关:可编排、可计量、可审计的中枢操作系统

1. 这不是“又一个API代理层”,而是企业级大模型能力的中枢操作系统“大模型网关”这四个字,最近半年在技术团队会议里出现的频率,已经快赶上“降本增效”了。但说实话,我见过太多团队把网关简单理解成“给OpenAI API加个Nginx反向…

阅读更多 →
RT-Thread Studio外设驱动配置避坑:WDT看门狗实例详解 2026/10/2 13:12:46

RT-Thread Studio外设驱动配置避坑:WDT看门狗实例详解

做嵌入式开发这几年,我见过太多在 RT-Thread Studio 里配外设驱动翻车的新手。大家普遍觉得:图形化配置不是把引脚一勾、时钟一选,生成代码就完事了吗,怎么一到板子上跑就各种怪问题?串口打印乱码、外设没反应、系统反…

阅读更多 →
Selenium驱动自动更新:ChromeDriver版本匹配与CI/CD集成 2026/10/2 13:12:46

Selenium驱动自动更新:ChromeDriver版本匹配与CI/CD集成

简介:这是一份面向Python自动化测试工程师与Web开发者的Selenium驱动管理工具包,专为解决ChromeDriver、GeckoDriver等浏览器驱动版本频繁更新、手动适配耗时易错的痛点而设计。selenium_driver_updater-3.9.0作为轻量级Python库,支持一键自动…

阅读更多 →
AI工程从零起步:不做套壳API,用系统思维落地大模型应用 2026/10/2 13:12:40

AI工程从零起步:不做套壳API,用系统思维落地大模型应用

1. 先别急着写代码:AI工程和调接口完全是两回事我从去年开始带一个AI工程方向的小团队,招进来的新人里,十个有九个都跟我说过同一句话:“我天天在用大模型,会调API,也会写提示词,这不就是AI工程…

阅读更多 →
产品管理制度落地指南:从PDF到可执行流程的拆解方法 2026/10/2 13:12:40

产品管理制度落地指南:从PDF到可执行流程的拆解方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于BW16与ESP32-CYD的脑电信号无线采集与可视化系统设计 2026/10/2 13:12:40

基于BW16与ESP32-CYD的脑电信号无线采集与可视化系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉