开发指南

本文档涵盖 TimeLens 完整开发环境搭建、项目架构理解、日常调试技巧及脚本参考。无论你是初次接触 Tauri 还是经验丰富的 Rust 开发者,都能在这里找到所需信息。


前置条件

工具最低版本安装方式
Node.js18nodejs.org
Rust1.77rustup.rs
Tauri CLI2.xcargo install tauri-cli --version "^2"
WebView2 (Windows)任意Windows 11 已内置;Win10 独立安装包
Xcode CLI Tools (macOS)最新稳定版xcode-select --install

验证安装

node --version   # v18.x.x
npm --version    # 9.x.x
rustc --version  # 1.77.x
cargo --version  # 1.77.x

项目初始化

# 1. 克隆仓库
git clone https://github.com/PythonSmall-Q/TimeLens.git
cd TimeLens

# 2. 安装前端依赖(package.json)
npm install

# 3. 安装浏览器扩展依赖(可选)
cd browser-extension && npm install && cd ..

开发模式

TimeLens 使用 Tauri 开发模式,该模式会同时启动 Vite 开发服务器和 Tauri 桌面窗口。

# 启动完整开发环境(推荐)
npm run tauri:dev

# 仅启动 Vite 前端服务器(用于纯 UI 调试,无后端)
npm run dev

开发服务器默认运行在 http://localhost:1420。热模块替换(HMR)对所有前端代码生效;Rust 代码修改需要完整重启。

开发时常见问题

架构概览

TimeLens 采用经典的双层架构:Rust 后端负责系统级操作和数据持久化,React 前端负责用户界面和状态管理。

┌─────────────────────────────────────────────────┐
│  Tauri Process (Rust)                            │
│                                                  │
│  ┌──────────────┐  ┌──────────────────────────┐  │
│  │  monitor/    │  │  db/ (SQLite)            │  │
│  │  (tokio task)│  │  app_usage               │  │
│  │  Win32/      │  │  todos                   │  │
│  │  AppleScript │  │  widget_configs          │  │
│  └──────┬───────┘  └──────────┬───────────────┘  │
│         │  emit events        │ queries          │
│  ┌──────▼───────────────────┐ │                  │
│  │  commands/ (invoke)      ◄─┘                  │
│  │  monitor_cmd.rs          │                    │
│  │  storage_cmd.rs          │                    │
│  │  widget_cmd.rs           │                    │
│  └──────┬───────────────────┘                    │
└─────────│───────────────────────────────────────┘
          │ IPC (invoke / emit)
┌─────────▼────────────────────────────────────────┐
│  React Frontend (WebView)                         │
│                                                   │
│  App.tsx → 窗口标签检测                            │
│    "main"    → MainApp (HashRouter)               │
│    "clock-*" → WidgetWindow                │
│    "todo-*"  → WidgetWindow                 │
│    "timer-*" → WidgetWindow                │
│                                                   │
│  stores/  → Zustand (statsStore, widgetStore,     │
│             settingsStore)                        │
│  services/ → tauriApi.ts wrappers                │
└───────────────────────────────────────────────────┘

关键文件速查

文件职责
src-tauri/src/lib.rs应用初始化、数据库初始化、系统托盘、监控启动、窗口恢复
src-tauri/src/monitor/mod.rs后台窗口轮询 + 数据库写入
src-tauri/src/db/mod.rsSQLite 表结构定义与所有查询
src/App.tsx窗口标签路由(main vs widget)
src/MainApp.tsx主仪表盘壳 + 全局事件监听
src/services/tauriApi.ts所有 invoke 调用的前端封装
src/i18n/config.tsi18next 初始化配置、语言列表

调试技巧

Rust 日志

设置 RUST_LOG 环境变量以查看详细日志:

# Windows PowerShell
$env:RUST_LOG = "debug"; npm run tauri:dev

# macOS / bash / zsh
RUST_LOG=debug npm run tauri:dev

前端 DevTools

在任意 Tauri 窗口中按 F12 即可打开 Chromium DevTools(仅开发构建)。

SQLite 数据库检查

数据库文件位置:

可使用 DB Browser for SQLite 等工具直接打开查看。

小组件窗口不显示

检查 capabilities/default.json 中窗口标签模式是否匹配(clock-*todo-*timer-*)。

脚本速查

命令说明
npm run dev仅启动 Vite 前端开发服务器
npm run build前端生产构建
npm run tauri:dev完整 Tauri 开发模式(推荐)
npm run tauri:build完整生产构建(输出安装包)
npm run lintESLint 检查
npm run typecheckTypeScript 类型检查(不输出文件)
npm run formatPrettier 格式化
npm run testVitest 单元测试

添加测试

前端测试放置于 src/__tests__/,使用 Vitest + @testing-library/react。

Rust 单元测试与模块并存:

// Rust 测试示例
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_format_seconds() {
        assert_eq!(format_seconds(3661), "1h 1m");
        assert_eq!(format_seconds(59), "0m");
    }
}

发布流程

# 1. 先推送 master(仓库约定)
git push origin refs/heads/master:refs/heads/master

# 2. 创建并推送版本标签
git tag -a v1.1.0 -m "release: v1.1.0"
git push origin v1.1.0

推送 v* 标签会自动触发 .github/workflows/release.yml 工作流,构建并发布各平台安装包。

贡献代码

我们欢迎所有形式的贡献!在提交 PR 前,请:

  1. 阅读 CONTRIBUTING.md
  2. 确保代码通过 npm run lintnpm run typecheck
  3. 保持提交信息简洁清晰(推荐遵循 Conventional Commits)
  4. 为重大变更更新相关文档

最后更新:2025-05-03 · TimeLens v1.1.0