最近一直在用 Claude Code 的可视化工具写代码,不得不说,比起命令行那种敲来敲去的操作,图形化界面真的友好太多了。作为一个有点代码基础的博主,忍不住扒了扒它的源码,发现里面藏着不少有意思的设计,今天就随便聊聊,权当和大家交流。
一、跨平台这点,源码里藏着巧思
用这款工具的时候,最直观的感受就是不管在我那台老 Windows 笔记本,还是公司的 mac 上,运行起来都挺流畅。后来看源码才知道,它用了 Tauri 2 加 React 的组合,这大概就是跨平台的秘诀。
在src-tauri/src/main.rs里,有段代码特别关键,大概意思就是搭建前端和后端的通信桥梁。前端用户点个按钮、输段指令,就是通过这段代码传给后端处理的,处理完了再把结果送回来。
#[tauri::command]
async fn invoke_claude(command: String) -> Result<String, String> {
let client = ClaudeClient::new();
client.execute(command).await.map_err(|e| e.to_string())
}
对比之前用过的一些 Electron 框架的工具,这个组合明显轻快不少。实测下来,内存占用少了将近一半,启动速度也快,基本点一下图标,两秒内就能打开,这点真的很加分。
前端用 React 做界面,组件化的好处就是改起来方便。就像聊天框的输入框,源码里加了个 300 毫秒的防抖处理,这样打字的时候不会每敲一个字就触发一次请求,用着就很顺滑。
二、几个好用的功能,源码是这么实现的
1. 聊天式界面:把代码交互变成聊天
刚开始用命令行操作 Claude Code 时,查之前的对话记录得翻半天,特别麻烦。可视化工具做成聊天界面后,就像和 AI 在微信上聊天一样,舒服多了。
看源码里的实现,其实就是用 React 的状态管理来维护对话列表。每次 AI 有回复,就把新内容加到列表里,界面跟着更新。每条消息还会标清楚是用户发的、AI 回的,还是系统提示,连用了多少 Token 都写着,心里有数。
const [messages, setMessages] = useState([]);
const handleResponse = (data) => {
setMessages([...messages, { role: 'assistant', content: data }]);
};
2. 检查点恢复:编程也能 “后悔”
写代码最怕改来改去,最后发现还不如上一版。这个工具的检查点恢复功能就像后悔药,源码里用 SQLite 数据库存着每次输入后的快照。
建表的代码大概是这样,每次输入都会存一条记录,包括会话 ID、内容和时间。想恢复的时候,点一下按钮就能调出来,比自己手动备份省事多了。
CREATE TABLE checkpoints (
id INTEGER PRIMARY KEY,
session_id TEXT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. 一键配服务器:不用再记复杂命令
配置 MCP 服务器以前是个头疼事,命令行参数多,稍微输错一个就不行。可视化工具把常用的服务器做成了按钮,点一下就搞定,源码里就是预设了参数。
const handleAddMCP = (server) => {
const config = {
"Context7": { type: "HTTP", url: "https://context7.example.com" },
"Sequential": { type: "SSE", url: "https://seq.example.com" }
};
saveConfig(config[server]);
};
还支持自己加服务器,三种连接类型都有校验,不用担心填错参数。
三、数据存在本地,用着踏实
作为开发者,总担心数据泄露。看源码发现,这个工具把会话记录、配置啥的都存在本地的 SQLite 数据库里,路径是在系统的数据目录下。
fn init_db() -> Result<Connection, Error> {
let path = tauri::api::path::data_dir()
.unwrap()
.join("claude-code")
.join("data.db");
Connection::open(path)
}
就算断网了,之前的聊天记录也能看,这点比网页版让人放心。
四、一些值得学的小技巧
扒源码的时候,发现几个挺实用的小设计,值得记下来:
输入框用防抖,避免频繁请求,界面更流畅;
常用配置存在本地缓存,不用每次都重新设置;
全局数据用状态管理工具,界面更新不卡顿;
每个接口调用都加了错误处理,出问题会明确提示。
总的来说,这款工具的源码不算特别复杂,但能感觉到开发者是真的在为用户考虑,把复杂的逻辑藏在后面,给用户一个简单好用的界面。对于想学习跨平台开发或者优化交互的朋友,看看它的源码说不定能有不少启发。
你们用这个工具的时候有啥特别的感受?或者对源码有啥不一样的解读?欢迎在评论区聊聊~