跳转到主要内容
依人相的月光集市
← 返回首页2026-03-30· 约 5 分钟

2026-03-30

工作内容

  • bookmark 阅读器新增 AI 助手功能(侧边栏对话):
    • 支持 OpenAI 兼容 API 格式(DeepSeek / OpenAI / 通义千问等,切换 Base URL + Key 即可)
    • 一键生成文档摘要、基于文档内容自由问答
    • 选中文本一键翻译(所有阅读器格式均支持)
    • 流式输出(SSE Streaming),实时逐字显示 AI 回复
    • API 配置持久化(Zustand + localStorage),支持预设快捷切换
    • 未配置 API Key 时友好提示引导设置
    • AI 面板独立开关,支持拖拽调整宽度
    • 暗色主题完整适配
  • bookmark 阅读器新增网页剪藏功能:
    • 输入网页 URL,使用 @mozilla/readability 自动提取正文内容保存到书库
    • 通过 CORS 代理(allorigins)获取网页,无需后端
    • 自动提取标题、作者、og:image 封面,修正相对路径
    • 新增 web 格式阅读器,支持目录、高亮、笔记、搜索、进度保存
    • 书库顶栏新增「添加网页」按钮,抓取中显示加载状态
    • 导出/导入备份兼容 web 格式
  • 修复 GitHub Actions 部署覆盖博客仓库的问题:
    • peaceiris/actions-gh-pages 默认 force push 会清空仓库其他内容
    • 添加 keep_files: true 参数,只更新 bookmark/ 子目录
    • 手动恢复被覆盖的博客仓库内容
  • bookmark 新增 PWA 支持,可安装为桌面/手机应用:
    • 集成 vite-plugin-pwa,配置 Web App Manifest + Service Worker
    • 生成 192x192 / 512x512 应用图标
    • 支持从浏览器"安装"到桌面/主屏幕,全屏独立运行
    • Service Worker 离线缓存,断网也能使用
    • 添加 .npmrclegacy-peer-deps=true)解决 CI 中 peer dependency 冲突
  • bookmark 开始集成 Tauri 桌面端打包:
    • 初始化 src-tauri/ 项目,配置窗口、CSP、构建路径
    • 条件化 base 路径和路由 basename(Web 用 /bookmark/,Tauri 用 /
    • Tauri 构建时自动禁用 PWA 插件
    • 添加 Rust fetch_url 命令,桌面端直接抓取网页无需 CORS 代理
    • 前端 web-fetch.ts 自动检测 Tauri 环境切换抓取方式
  • 修复移动端/PWA 模式下点击导入文件无反应的问题(动态创建 input 改为真实 DOM ref)
  • 重写项目 README,补充完整功能说明、技术栈、项目结构、部署说明
  • 修复 Tauri 桌面端打包后白屏问题(两个原因):
    • window.__TAURI__ 在 production 中注入晚于 React 首次渲染,Router basename 错误匹配 /bookmark;改用 Vite define 构建时常量 __IS_TAURI__
    • CSP style-src 缺少 blob:,Tailwind 运行时通过 blob URL 生成样式被 WebKit 拦截
  • 修复笔记面板和 AI 面板高度与阅读区域不一致的问题(父容器缺少 h-full
  • 统一"添加到笔记"行为:引用块始终追加到笔记末尾,避免嵌套引用
  • 笔记面板改版 — 笔记/高亮 Tab 切换
    • 右侧面板从上下分栏改为 Tab 切换(笔记 / 高亮),高亮列表占满整个面板
    • 点击高亮条目自动跳转到文章对应位置(EPUB/PDF/Web 三种格式均支持)
    • 使用 Dexie liveQuery 实现高亮列表实时更新
  • PDF 阅读器新增输入页码跳转功能,输入页码回车瞬间定位
  • EPUB 阅读器新增页码跳转和字号缩放:
    • 使用 epubjs locations 生成虚拟页码,支持输入页码回车跳转
    • 字号缩放(A-/A+),支持 Cmd/Ctrl +/-/0 快捷键
  • 补充 README 桌面端安装和手动更新流程

学习内容

  • 学习了 OpenAI 兼容 API 的流式输出(SSE)实现方式,包括 AsyncGenerator 封装和 React 中的流式渲染模式 → 学习笔记
  • 学习了纯前端网页剪藏的实现方案:Readability 正文提取 + CORS 代理 + 相对路径修正 → 学习笔记
  • 学习了 PWA 的基本概念和 vite-plugin-pwa 的使用:Manifest 配置、Service Worker 注册、离线缓存策略、安装条件(HTTPS + 用户交互 30 秒) → 学习笔记
  • 学习了 Tauri v2 桌面应用开发:Rust 工具链(rustup/cargo)、tauri.conf.json 配置、Rust 命令(#[tauri::command])与前端 invoke 通信、Web/Tauri 双构建共存 → 学习笔记
  • 深入踩坑 Tauri v2 + WebKit 兼容性问题(8 个问题),总结了生产环境调试经验 → 学习笔记
  • 学习了 Dexie liveQuery 实现 IndexedDB 数据响应式订阅,替代手动轮询刷新
  • 学习了 epubjs locations API 为流式排版生成虚拟页码的方案

备注

  • AI 助手通过 Zustand store 的 pendingTranslation 机制实现跨组件通信(SelectionToolbar → AIChatPanel),避免了 prop drilling
  • peaceiris/actions-gh-pageskeep_files 参数是部署到外部仓库子目录时的必选项,否则每次部署都会清空整个仓库
  • bookmark 项目现已支持三种格式阅读(EPUB / PDF / Web)+ AI 辅助阅读
  • PWA 安装需要 HTTPS 环境(或 localhost),且用户需在页面交互 30 秒以上才会出现安装按钮
  • Tauri 通过 process.env.TAURI_ENV_PLATFORM(构建时)和 '__TAURI__' in window(运行时)区分环境,实现一套代码双平台构建
  • npm ci 的 peer dependency 冲突通过 .npmrclegacy-peer-deps=true 全局解决,避免每次安装新包都要手动处理
  • Tauri 生产环境白屏调试:必须在 Cargo.toml 添加 devtools feature 并在 setup 中调用 open_devtools() 才能看到 WebView 控制台错误
  • window.__TAURI__ 运行时检测在 Tauri 生产包中不可靠,应改用 Vite define 构建时常量
  • Dexie 的 liveQuery 返回 Observable,subscribe 后数据库有变更会自动推送,适合替代 useEffect + 手动 reload 模式
  • epubjs locations.generate(1024) 按每 1024 字符一个 location 切分全书,生成虚拟页码;通过 cfiFromLocation(n) 可跳转到指定"页"