6.4 KiB
6.4 KiB
CC Switch(Electron → Tauri)代码走查与优化建议
- 目的:记录此次针对前后端(React/TypeScript + Tauri/Rust)的全面走查结论与可落地优化点。
- 方法:从项目结构、主进程逻辑、前端状态与交互、持久化与文件操作、构建与配置一致性等维度逐项审查,输出问题清单与具体改动建议。
逻辑正确性
- 自动导入 default 的重复路径风险:
- 现状:Rust
setup内自动导入,前端在供应商为空时也会调用import_default_config;若两端先后成功,可能对同一id: "default"重复写入(虽为覆写但无必要)。 - 建议:
import_default_config命令中先检查providers是否已有default,存在则直接Ok(true)返回。
- 现状:Rust
- 配置路径显示可能误导:
- 现状:前端用
getClaudeCodeConfigPath显示“配置文件位置”,即使文件不存在也显示候选路径。 - 建议:用
getClaudeConfigStatus(含exists)替换,并在 UI 显示“未创建,切换或保存时自动创建”。
- 现状:前端用
- 打开外链健壮性:
- 现状:
open_external对缺少协议的 URL(如example.com)可能失败。 - 建议:Rust 端规范化,未以
http:///https://开头则自动补https://。
- 现状:
- 复制主配置前的目录兜底:
- 现状:
switch_provider复制到主配置文件前未确保父目录存在(大多已存在,但存在边界风险)。 - 建议:在复制前创建
settings_path.parent()目录。
- 现状:
类型与健壮性
- 定时器类型:
- 现状:
useRef<NodeJS.Timeout | null>;在浏览器环境setTimeout返回number,类型不一致。 - 建议:改为
useRef<ReturnType<typeof setTimeout> | null>并统一clearTimeout。
- 现状:
- Provider 配置最小校验:
- 现状:仅校验是否为合法 JSON。
- 建议:前端提交前检查
env.ANTHROPIC_BASE_URL、env.ANTHROPIC_AUTH_TOKEN等关键字段类型;Rust 端add/update_provider可再做一层基础校验,返回友好错误。
- 供应商文件名清洗:
- 现状:仅替换非法字符并小写化。
- 建议:
- 空白替换为
-,连续-合并为单个。 - 过长名称截断,降低跨平台文件系统问题概率。
- 空白替换为
用户体验
- “打开官网”语义与失败反馈:
- 现状:
<a href="#" onClick>伪链接;失败只console.error。 - 建议:使用按钮或
role="button",失败时显示通知(沿用全局浮动通知组件)。
- 现状:
- 通知淡出时长硬编码:
- 现状:JS 用
300ms与 CSS 动画强绑定。 - 建议:提取为常量或用动画结束事件,避免样式变更导致时间不一致。
- 现状:JS 用
- 自动填充官网地址:
- 现状:
extractWebsiteUrl仅在匹配https://api.时去前缀,策略合理。 - 建议:保留现状,并在 UI 旁提示“自动推断,可手动修改”。
- 现状:
前端结构与可维护性
- 自动导入策略统一:
- 现状:Rust 与前端均可能触发默认导入。
- 建议:前端仅展示“导入当前 Claude Code 配置为 default”的按钮(或保留静默导入但配一次性提示);避免重复路径与认知负担。
- 预设与 API Key 注入:
- 现状:选择预设后,输入 Key 会实时写入
settingsConfig。 - 建议:在保存时再进行一次注入校验,UI 加只读提示“保存时写入”,避免误解已永久保存。
- 现状:选择预设后,输入 Key 会实时写入
- 打开配置目录按钮文案:
- 现状:固定为“打开”。
- 建议:依据
exists显示“打开配置目录”或“创建并打开配置目录”。
Rust 侧结构与持久化
- 错误上下文:
- 现状:大多数错误已包含路径信息。
- 建议:保持现状,确保关键 I/O 错误信息包含“目标路径 + 具体原因”。
- 锁粒度:
- 现状:命令中修改后释放锁再保存,合理。
- 建议:保持现状。
- 日志:
- 现状:
tauri-plugin-log仅在 debug 下启用。 - 建议:release 也输出 Warn 级别到
~/.cc-switch/app.log,便于用户反馈问题。
- 现状:
配置与构建
- 版本一致性:
- 现状:
package.json版本2.0.3,src-tauri/tauri.conf.json为3.0.0-beta.1。 - 建议:统一版本号,避免混淆。
- 现状:
- 依赖清理:
- 现状:
@tauri-apps/plugin-shell未被使用。 - 建议:移除无用依赖,保持最小化。
- 现状:
- 产物目录:
- 现状:
dist/存在,本仓库.gitignore已忽略。 - 建议:保持忽略,避免误提交产物。
- 现状:
建议的具体改动(示例)
- 防重导入 default:
- 文件:
src-tauri/src/commands.rs - 位置:
import_default_config内加锁后 - 变更:若
manager.providers.contains_key("default")则直接返回Ok(true)。
- 文件:
- 复制主配置前确保目录存在:
- 文件:
src-tauri/src/provider.rs - 位置:
switch_provider在copy_file前 - 变更:
create_dir_all(settings_path.parent())兜底。
- 文件:
- 规范化外链 URL:
- 文件:
src-tauri/src/commands.rs - 位置:
open_external - 变更:非
http(s)://开头自动补https://。
- 文件:
- 配置路径展示基于存在性:
- 文件:
src/App.tsx - 位置:配置路径加载逻辑
- 变更:改用
getClaudeConfigStatus,结合exists决定展示文案与按钮态。
- 文件:
- 定时器类型修正:
- 文件:
src/App.tsx - 位置:
timeoutRef定义处 - 变更:
useRef<ReturnType<typeof setTimeout> | null>(null)。
- 文件:
- 文件名清洗增强:
- 文件:
src-tauri/src/config.rs - 位置:
sanitize_provider_name - 变更:空白替换为
-、连续-合并、过长截断。
- 文件:
可选优化
- 前端轻量校验:使用本地校验(或 zod)检查关键字段格式与类型,错误在表单内联展示。
- 按钮可用态与提示:
ProviderList的三按钮增加title提示,失败提示复用浮动通知。 - 日志落盘:release 模式按 Warn 级别落盘,便于排障。
结论与建议
- 当前代码结构清晰,核心逻辑(供应商 CRUD、文件持久化、切换备份)正确,能够可靠完成从 Electron 到 Tauri 的迁移目标。
- 建议优先落地的改动:
- 防重导入 default;
- 定时器类型与外链规范化;
- 复制主配置前的目录兜底;
- 用
getClaudeConfigStatus驱动配置路径 UI; - 版本号统一与依赖清理。
- 如需我直接按上述方案修改代码并提交,请告知优先级或指定改动范围。