马克沁机枪上阵(二):前线开辟—Claude Code 如何用一天打通前端
1. 从后端到前端为什么用 Claude Code 一天打通 Vue 3 页面后端接口跑通之后我盯着终端里那一串 curl 返回的 JSON 发了好一会儿呆。词条搜索、自动填写、定时提交、截图存档逻辑全对但整个系统只有 REST API 裸调——查任务状态要开 MySQL 客户端看执行日志要 SSH 翻文件出了问题只能对着终端猜。这套东西自己用还行一旦要给运营同学看就完全没法交付。所以前端必须开。技术选型没花太多时间Vue 3 Vite Element Plus。Vue 3 的 Composition API 写组件直观Element Plus 的 Table/Form/Dialog 开箱即用能省掉大量 UI 工作量Vite 的热重载在调试 SSE 这种长连接场景时特别舒服。工具越熟悉AI 辅助的杠杆就越大——这不是玄学是弹药选择问题。这篇文章要交付的东西很具体一份可以直接复制的 Claude Code 项目配置骨架含settings.json与统一 Key/API 通道接入示例以及一次完整的前端联调验证动作目标是在一天内跑通页面渲染与 SSE 流式数据展示。适合正在验证 AI 辅助前端开发链路、或者想把 Claude Code 真正用进日常项目的工程师。下面按我实际操作的顺序来每一步都有可复制的命令和配置。2. TaoToken 前置给 Claude Code 配一条稳定的 API 通道在写第一行 Vue 代码之前得先把 Claude Code 的模型通道配好。我试过直接在环境变量里塞各种 Key切换模型时改来改去很容易乱后来统一走 TaoToken 的 API 通道一个 Key 管所有模型配置也集中。TaoToken 在这里的角色是统一 API 入口Claude Code、Cline、Codex 这些工具都可以指向同一个 Base URL用同一个 Key模型 ID 按需切换。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 这个不加 UTM直接填进配置里。具体操作分三步。第一步去控制台创建一个 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完复制出来后面配置里要用。第二步确认你要用的模型 IDClaude Code 场景下一般用 claude-sonnet 系列具体以文档为准文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。第三步把 Key 和 Base URL 写进 Claude Code 的配置。这里有个容易踩的坑Claude Code 读取配置的优先级是 项目级.claude/settings.json 用户级~/.claude/settings.json 环境变量。如果你在多个项目里用不同的 Key建议项目级配置单独写避免互相覆盖。我一开始把 Key 写在全局环境变量里后来换项目时忘了改排查了半天才发现请求打到了旧通道。配置完成后可以用一个最小请求验证通道是否通。Claude Code 本身没有独立的 ping 命令但你可以直接在项目目录里让它读一个文件、生成一段代码如果能正常返回说明通道没问题。如果返回 401基本就是 Key 写错或者没生效如果返回 model not found就是模型 ID 填错了。这两个错误后面排障章节会详细说。另外提一句如果你同时用 Cline 或者 Codex它们的配置格式不一样但 Base URL 和 Key 是同一套。Cline 在 VS Code 设置里填Codex 走auth.json后面配置章节我会把三件套Base URL Key Model ID都列出来方便对照。3. 可复制配置settings.json 与项目骨架这一节是全文最核心的部分所有配置都可以直接复制。先建项目再写 Claude Code 配置最后把 Vue 3 Vite Element Plus 的骨架搭起来。3.1 创建 Vue 3 Vite 项目打开终端执行npm create vitelatest baike-frontend -- --template vue cd baike-frontend npm install npm install element-plus axios vue-router4装完之后目录结构大概是src/main.js、src/App.vue、src/components/这些。接下来改src/main.js把 Element Plus 和路由挂上去import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vue import router from ./router const app createApp(App) app.use(ElementPlus) app.use(router) app.mount(#app)路由文件src/router/index.js里配两个主模块任务管理和账号管理import { createRouter, createWebHistory } from vue-router import TaskList from ../views/TaskList.vue import AccountList from ../views/AccountList.vue const routes [ { path: /, redirect: /tasks }, { path: /tasks, component: TaskList }, { path: /accounts, component: AccountList } ] export default createRouter({ history: createWebHistory(), routes })3.2 Claude Code 项目级 settings.json在项目根目录建.claude/settings.json这是 Claude Code 读取项目配置的地方。内容如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [ Read, Write, Bash(npm run dev), Bash(npm install) ] } }这里三件套对应关系要记清楚Base URL 是https://taotoken.net/apiKey 是你从控制台复制的那串Model ID 按文档填。如果你用 Cline在 VS Code 的 Cline 设置里填同样的 Base URL 和 KeyModel ID 选对应的 Claude 模型如果用 Codex配置写在~/.codex/auth.json里结构类似也是 Base URL Key Model 三件套。注意settings.json里的 Key 不要提交到 Git。建议在.gitignore里加上.claude/settings.local.json把敏感配置放本地文件项目级文件只留结构。3.3 Vite 代理配置前端调后端接口要跨域在vite.config.js里配代理把/api转发到后端 8080import { defineConfig } from vite import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], server: { port: 5173, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } })配完之后前端里所有 axios 请求都走/api前缀Vite 会自动转发。这样本地开发不用处理 CORSSSE 连接也能正常建立。3.4 axios 封装与 SSE 连接建一个src/api/request.js统一 axios 实例import axios from axios const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.response.use( res res.data, err { console.error(请求失败, err) return Promise.reject(err) } ) export default requestSSE 连接单独封装因为EventSource不走 axios。建src/api/sse.jsexport function connectSse(taskNo, onLog, onDone) { const es new EventSource(/api/tasks/${taskNo}/sse) es.addEventListener(log, e { onLog(JSON.parse(e.data)) }) es.addEventListener(done, e { onDone(JSON.parse(e.data)) es.close() }) es.onerror () { es.close() } return es }这套骨架搭完npm run dev能起来页面能渲染路由能跳转SSE 通道也预留好了。接下来就是联调验证。4. 验证请求一次完整的 SSE 流式联调配置写完不算数得跑一次真实请求确认链路通。这一节记录我从启动到看到流式数据的完整过程。4.1 启动前后端后端先起确保 8080 端口在监听。前端执行npm run dev终端会输出Local: http://localhost:5173/浏览器打开能看到任务列表页。如果页面白屏先看控制台报错大概率是 Element Plus 样式没引入或者路由没挂上。4.2 触发一次任务并建立 SSE在任务列表页点「运行」前端会调POST /api/tasks/{taskNo}/run然后立刻调connectSse建立连接。后端每完成一个 Playwright 步骤就推一条log事件任务结束推done。我在TaskDetail.vue里这样接import { connectSse } from ../api/sse const logs ref([]) const taskStatus ref(RUNNING) function startTask(taskNo) { connectSse( taskNo, log { logs.value.push(log) }, result { taskStatus.value result.status if (result.status SUBMITTED) { ElMessage.success(已提交等待审核) } } ) }4.3 观察流式结果任务跑起来后页面上时间线会一条条出现LOGIN、SEARCH、CREATE、FILL、SUBMIT每条带步骤名、消息、耗时。绿色是成功红色是失败。运行中末尾有个旋转的 loading 节点done事件到达后消失状态更新为 SUBMITTED。实测下来从点击到第一条 log 事件大约 1 到 2 秒整个流程视词条复杂度在 20 到 60 秒之间。SSE 连接稳定没有出现断流。如果中途刷新页面连接会断需要重新触发——这是 EventSource 的固有行为不是 bug。4.4 验证发布结果任务状态变成 SUBMITTED 后详情页会出现绿色「验证发布」按钮。点击后调POST /api/tasks/{taskNo}/verify后端重新打开浏览器搜索词条通过 SSE 推回结果。如果已通过弹窗显示绿色大勾和词条链接如果未通过显示橙色警告和提示文案。整个交互不刷页面、不轮询接口闭环完成。到这一步页面渲染和流式数据展示都跑通了一天的目标达成。5. 常见报错排查401、proxy failed、reading choices联调过程中我踩了几个坑这里按报错原文对照排查都是真实遇到的。5.1 401 Unauthorized报错长这样{error:{type:authentication_error,message:invalid x-api-key}}原因有三种Key 写错、Key 没生效、Base URL 配错。排查顺序是先确认.claude/settings.json里的ANTHROPIC_API_KEY和 TaoToken 控制台里的一致注意不要有多余空格再确认ANTHROPIC_BASE_URL是https://taotoken.net/api末尾不要加斜杠最后重启 Claude Code因为环境变量是启动时读取的改了配置不重启不生效。5.2 local proxy failed报错Error: connect ECONNREFUSED 127.0.0.1:8080这是 Vite 代理转发失败后端没起来或者端口不对。先curl http://localhost:8080/api/tasks确认后端在跑再看vite.config.js里target是不是 8080。如果后端换了端口代理配置也要同步改。另外注意SSE 请求走代理时Vite 默认会缓冲响应需要在代理配置里加ws: false和configure关掉缓冲否则 log 事件会攒着一起推看不到流式效果。5.3 reading choices of undefined报错TypeError: Cannot read properties of undefined (reading choices)这个通常出现在模型返回格式和预期不一致时。如果你用的是 OpenAI 兼容格式的通道返回结构是data.choices[0].message.content如果通道返回的是 Anthropic 原生格式结构是data.content[0].text。排查方法是把原始响应打印出来看结构然后调整解析代码。用 TaoToken 统一通道时确认 Model ID 和通道支持的格式匹配不要混用。5.4 OAuth 相关报错报错OAuth token expired or invalidClaude Code 某些版本会走 OAuth 流程如果你用的是 API Key 模式需要在配置里显式指定ANTHROPIC_API_KEY并且确保没有残留的 OAuth 凭证。检查~/.claude/目录下有没有旧的凭证文件有的话清掉再重启。如果同时装了多个 Claude 相关工具注意它们可能共用配置目录互相覆盖。5.5 SSE 连接建立但收不到事件页面显示连接成功但时间线一直不动。先看后端日志有没有推送再看浏览器 Network 面板里 SSE 请求的响应内容。常见原因是后端SseEmitter超时时间设太短或者前端EventSource被浏览器缓存。后端把 timeout 设成 0不超时前端在 URL 后面加个时间戳参数避免缓存。6. 把这条链路用起来从验证到日常一天打通前端不是终点而是把 Claude Code 真正用进日常开发的起点。这套配置骨架搭好之后后面加页面、加接口、调样式都可以直接让 Claude Code 在现有结构上改不用每次从零描述项目背景。如果你主要做长期编码和 Agent 类任务建议了解一下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频、长会话的场景。如果只是想先验证模型对话效果可以去模型对话页试试 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后说一个我实际用下来的技巧把项目的目录结构、关键文件路径、常用命令写进项目根目录的CLAUDE.mdClaude Code 每次启动会读这个文件省掉大量重复描述。比如写上「前端在 baike-frontend用 Vite接口走 /api 代理到 8080SSE 封装在 src/api/sse.js」后面让它改代码时就不用再解释一遍。这个文件不用长十几行就够但效果立竿见影。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →