本文介绍一款面向 React 前端开发者的本地开发工具 SpotPatch。它可以在浏览器中直接选择页面元素,一键定位到对应的 JSX/TSX 源码,收集有限且脱敏的上下文,并通过可审阅、可回滚的 AI 工作流辅助修改前端代码。
一、前端开发中一个经常被忽略的问题
在开发 React、Vite 或 Next.js 页面时,我们经常会遇到这样的需求:
- "把这个按钮改成蓝色。"
- "调整这个卡片的间距。"
- "修改页面右上角这个区域。"
- "把这个弹窗的标题字体调大。"
- "这个元素对应的是哪个 React 组件?"
听起来都是小改动,但传统流程往往是这样一套完整链路:
- 在浏览器中找到页面元素;
- 打开 DevTools 查看 DOM;
- 根据 class、文本或组件结构反向搜索项目源码;
- 在多个 JSX/TSX 文件中来回确认真正的组件位置;
- 手动把上下文复制给 AI 编程工具;
- 检查 AI 修改是否影响了其他文件;
- 再回到浏览器确认效果。
对于中大型前端项目,这个过程非常耗时。尤其当项目中出现以下情况时,定位难度会进一步上升:
- 组件层级较深;
- 页面由多个业务组件组合而成;
- className 经过封装或动态生成;
- 页面同时存在 Server Component 和 Client Component;
- 同一个组件在多个页面复用;
- AI 只拿到一张截图,无法确定真实源码位置。
SpotPatch 要解决的,就是缩短"页面反馈"到"源码修改"之间的距离。
二、SpotPatch 是什么?
SpotPatch 是一个本地优先、仅开发期运行的 React 页面反馈工作台。它的核心流程如下:
浏览器选择元素
↓
获取元素对应的源码标记
↓
定位 JSX/TSX 文件、行号和列号
↓
收集有限且脱敏的上下文
↓
生成结构化修改请求
↓
复制 Prompt 或运行可审阅的 AI Agent
↓
查看 Diff、执行检查并决定是否应用
需要特别说明:SpotPatch 不是"截图转代码"工具,也不是直接修改生产网站的工具。它更关注以下几个问题:
- 页面上的这个元素,到底对应哪个源码位置?
- 如何让 AI 获得准确的 JSX/TSX 上下文,而不是猜测?
- 如何避免 AI 直接、无审阅地修改当前工作区?
- 如何在应用修改前,看到完整的 Diff?
- 如何保证生产构建中不残留任何开发工具代码?
三、SpotPatch 的核心能力
1. 从页面元素直接定位到 JSX/TSX 源码
在开发环境中,SpotPatch 会为范围内的 JSX/TSX 元素添加开发期源码标记。用户在页面中选中某个元素后,SpotPatch 可以直接返回:
- 源码文件路径
- 行号 / 列号
- 元素名称
- DOM 信息
- CSS 上下文
- 组件上下文
- 有边界限制的源码片段
例如,选中一个元素后可能直接得到:
src/components/HeroSection.tsx:42:8
不再需要手动从 DOM 结构反向搜索源码。
2. 支持多目标反馈
一次任务可以同时选择多个页面元素,且每个目标保留独立说明,例如:
目标 1:修改导航栏背景色
目标 2:调整主按钮圆角
目标 3:增大卡片之间的间距
每个目标都有独立的源码位置和修改要求,避免把多个页面反馈揉进一段模糊的自然语言描述里。
3. 不配置 AI 也可以正常使用
SpotPatch 不强制要求配置 AI。即使没有配置任何 AI Provider,也可以正常使用:
- 元素选择
- 源码定位
- 上下文查看
- 跳转到 Cursor 或 VS Code 对应位置
- 结构化 Prompt 生成与复制
AI 只是一个可选的增强能力,不是使用 SpotPatch 的前提条件。
4. AI 修改默认需要人工审阅
当用户配置了 OpenAI-compatible Provider 后,SpotPatch 可以运行一个受限权限的 AI Agent,整个工作流包含:
- Provider 能力检测
- 有边界限制的文件读取
- 有边界限制的文件修改
- 项目检查(Lint / Build 等)
- Git worktree 隔离
- Diff 审阅
- Apply(应用修改)
- Revert(一键回滚)
默认情况下,AI 的修改不会直接写入当前工作区,必须经过 Diff 审阅后手动 Apply。
四、在 Vite + React 项目中接入
1. 安装
pnpm add -D @spotpatch/vite
也可以使用 npm:
npm install --save-dev @spotpatch/vite
2. 配置 Vite 插件
在 vite.config.ts 中添加配置:
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";
import { spotPatch } from "@spotpatch/vite";
export default defineConfig({
plugins: [spotPatch(), react()],
});
注意:
spotPatch()需要放在 React 插件之前,这样才能确保开发期源码标记在 React 转换之前完成处理。
3. 启动开发服务器
pnpm dev
打开页面后,可以通过以下两种方式进入元素选择模式:
- 点击页面右下角的 Select element 按钮;
- 使用快捷键
Mod+Shift+S。
选中页面元素后,SpotPatch 会自动显示对应的源码位置和上下文信息。
五、配置 AI Agent
SpotPatch 的 AI 能力默认关闭。如果需要开启,需要配置完整的 Provider 环境变量:
SPOTPATCH_AI_BASE_URL=https://your-relay.example/v1
SPOTPATCH_AI_MODEL=your-model-name
SPOTPATCH_AI_API_KEY=your-api-key
可选配置项:
SPOTPATCH_AI_PROTOCOL=chat-completions
SPOTPATCH_AI_AUTHENTICATION=bearer
当前支持的协议包括 chat-completions、responses;支持的认证方式包括 bearer、x-api-key。
⚠️ 安全注意事项
API Key 必须只保留在 Node.js 开发进程中,绝对不要使用以下前缀,否则可能导致敏感信息被打包进浏览器端代码:
# 错误示范,不要这样做
VITE_SPOTPATCH_AI_API_KEY=...
NEXT_PUBLIC_SPOTPATCH_AI_API_KEY=...
正确做法是使用不带公开前缀的变量名,并将 .env.local 加入 .gitignore:
SPOTPATCH_AI_API_KEY=...
SpotPatch 不会向模型开放任意 Shell 权限,也不会让模型直接执行未受限制的系统命令。
六、在 Next.js 项目中接入
SpotPatch 提供了专门的 Next.js 适配器:
pnpm add -D @spotpatch/next
初始化项目:
pnpm exec spotpatch-next init
检查接入结果:
pnpm exec spotpatch-next check
启动开发环境:
pnpm dev
初始化命令会根据项目实际情况,自动处理以下内容:
next.config配置instrumentation-client- 开发脚本
- SpotPatch Sidecar 生命周期
- Loader 配置
建议在干净的 Git 工作区中执行初始化,并检查生成的文件差异后再提交。
七、Next.js 当前支持边界(务必了解)
这里需要特别说明一点:@spotpatch/next 目前是 0.x public preview 版本,不代表已经完成全部 Next.js 正式支持矩阵,请不要仅凭 peerDependencies 的版本范围推断全部兼容性。
目前已验证可用的方向:
- Next.js App Router
- Server Component 与 Client Component
- webpack
- Turbopack
- 开发期 Loader
- Source Map
- HMR / Fast Refresh
- Runtime bootstrap
- 源码注册
- 生产构建隔离
以下范围仍在持续补齐中:
- Pages Router
- App Router 与 Pages Router 混合项目
- 全量 Next.js 小版本覆盖
- 全量 Node.js 与操作系统组合
- 更复杂的 RSC streaming 场景
- 特殊 basePath
- 复杂 rewrites
- standalone 和 static export
- 特殊 webpack / Babel / MDX 配置
因此,当前更准确的定位是:
| 框架 | 当前状态 |
|---|---|
| Vite | 正式公共接入 |
| Next.js | 可安装的开发期公共预览(public preview) |
八、生产环境隔离设计
SpotPatch 只在开发期运行,生产构建中不会包含以下任何内容:
- SpotPatch Runtime
- JSX/TSX 源码标记
- 本地开发 API
- Sidecar 进程
- 源码注册状态
- 内部会话密钥
- AI Provider 凭据
生产环境依然使用框架原生命令即可:
pnpm build
pnpm start
在 Next.js 项目中,spotpatch-next 只负责开发期生命周期管理,不应被当作生产服务器使用。
九、项目结构与核心模块
SpotPatch 采用多包架构,职责划分清晰:
| 包名 | 作用 |
|---|---|
@spotpatch/vite |
Vite + React 开发期接入 |
@spotpatch/next |
Next.js 开发期适配 |
@spotpatch/compiler |
JSX/TSX 源码标记与 Source Map |
@spotpatch/dev-server |
本地开发服务、源码注册、编辑器与 Agent 编排 |
@spotpatch/runtime |
浏览器选择器、上下文采集与工作台 |
@spotpatch/react-adapter |
React / Fiber 兼容边界 |
@spotpatch/agent |
Provider、受限工具、worktree 与检查流程 |
@spotpatch/shared |
协议、模型与错误码 |
整体数据流可以理解为:
React / Vite / Next.js
↓
开发期源码转换
↓
源码标记与 Source Map
↓
浏览器 Runtime
↓
本地 Dev Server
↓
源码上下文与编辑器
↓
可选 AI Agent
十、常见问题 FAQ
1. 页面中没有出现"选择元素"按钮?
Vite 项目请先确认插件顺序:
plugins: [spotPatch(), react()]
并确认当前运行的是 pnpm dev,而不是生产预览命令。
Next.js 项目需要通过 pnpm dev 启动经过 SpotPatch 初始化的开发脚本,不要绕过初始化脚本直接运行普通的 next dev。
2. 无法定位到源码怎么办?
SpotPatch 默认处理 src 目录下的 .jsx 和 .tsx 文件。如果组件来自以下位置,可能无法获得精确的源码定位:
node_modules- 构建生成目录
- 测试文件
- 未注册的源码目录
- 不在 include 范围内的文件
3. AI 显示"不可用"?
请确认以下三个变量是否完整存在:
SPOTPATCH_AI_BASE_URL=...
SPOTPATCH_AI_MODEL=...
SPOTPATCH_AI_API_KEY=...
配置不完整时,SpotPatch 会安全地将其视为 AI 不可用状态,而不会报错崩溃。
4. React 出现 hydration 警告怎么办?
如果警告信息中出现类似 cz-shortcut-listen="true" 的属性,通常说明是浏览器扩展在 React hydration 之前修改了页面 HTML。建议先用一个干净的浏览器 Profile 测试,不要直接把此类警告归因于 SpotPatch。
十一、项目地址
- GitHub:https://github.com/huanglvjing/spotpatch
- Vite 插件:https://www.npmjs.com/package/@spotpatch/vite
- Next.js 适配器:https://www.npmjs.com/package/@spotpatch/next
如果在实际项目中遇到问题,建议提交 issue 时附上以下信息,方便快速定位:
- Node.js 版本
- React 版本
- Vite 或 Next.js 版本
- Router 类型(App Router / Pages Router)
- webpack 或 Turbopack
- 操作系统
- 最小复现项目
- 终端错误信息
- 浏览器控制台信息
十二、总结
SpotPatch 解决的是一个非常具体的前端开发问题:
如何从浏览器中的页面元素,快速回到真实的 JSX/TSX 源码,并让 AI 在明确上下文和 Diff 审阅的前提下辅助修改代码。
它不依赖截图猜测,也不要求把整个项目源码上传到第三方服务。目前推荐的使用路径是:
- 在 Vite + React 项目中安装
@spotpatch/vite; - 使用页面元素选择功能定位源码;
- 不配置 AI 时,直接复制结构化 Prompt 交给你习惯的 AI 工具;
- 配置 AI 后,使用隔离 worktree 和 Diff 审阅机制安全应用修改;
- 在 Next.js 项目中,可以尝试
@spotpatch/next的 public preview; - 生产构建始终使用普通框架命令,不受 SpotPatch 影响。
对于经常进行页面调整、组件定位、设计还原和 AI 辅助开发的前端团队来说,SpotPatch 可以把"看页面、找源码、写需求、审阅修改"连接成一条完整的开发闭环。