时间:2025-05-26 09:18
人气:
作者:admin
在信息爆炸的时代,RSS依然是高效获取结构化内容的重要方式,但市面上主流阅读器要么功能冗余(如集成社交属性),要么技术栈陈旧(依赖Electron导致内存占用高、性能差)。我们希望打造一款简约轻量、高效率、高性能、隐私安全的RSS阅读器,核心需求包括:
最终选择 Rust+Web 的技术组合,这一选择背后是对性能、开发效率与跨平台能力的深度权衡。
基于Tauri开发的开源AI驱动的智库式阅读器(前端部分使用Web框架),能根据用户指定的主题和偏好关键词自动从互联网上检索信息。它使用云端或本地大型模型进行总结和提供指导,并包括一个AI驱动的互动阅读伴读功能,你可以与AI讨论和交换阅读内容的想法。
这个项目我5月刚放到Github上(Github - Saga Reader),欢迎大家关注分享。????????码农????????开源不易,各位好人路过请给个小星星????Star????。
核心技术栈:Rust + Tauri(跨平台)+ Svelte(前端)+ LLM(大语言模型集成),支持本地 / 云端双模式
关键词:端智能,边缘大模型;Tauri 2.0;桌面端安装包 < 5MB,内存占用 < 20MB。
运行截图


传统前端框架(如React/Vue)依赖运行时支持,产物体积大且存在多余的性能开销,而更现代化的Svelte框架通过编译时转换代码,生成直接操作DOM的最小化JS包。在我们的项目中:
app/src/routes 目录下的页面组件编译后体积仅15KB(未压缩),对比同复杂度的React应用小40%;$: 自动追踪依赖)与Tauri的IPC(进程间通信)天然契合。前端通过 tauri.invoke 调用Rust接口后,可直接更新响应式状态(示例代码见 app/src/lib/store.ts)。RSS阅读器的核心瓶颈在于数据解析、网络IO与本地存储。Rust的 serde(序列化/反序列化)+ reqwest(HTTP客户端)+ sqlx(数据库ORM)组合完美解决了这些问题:
serde 配合自定义 Deserialize 实现,可兼容90%以上非标准Feed(代码见 crates/feed_api_rs/src/parser.rs);tokio 异步运行时让100+并发请求的延迟控制在200ms内;enum 错误类型)让前后端接口定义更严谨(crates/types/src/lib.rs 定义了统一的 FeedItem 结构体)。选择Tauri而非Electron的核心原因是资源占用,我们不想让用户因为一个工具应用消耗他的硬件资源以及宝贵的用户时间:
tauri-plugin 机制封装,前端调用Rust接口时,参数自动序列化/反序列化(示例:app/src/lib/api/feed.ts 中 updateFeed 函数调用 tauri.invoke('update_feed', { url }),对应 src-tauri/src/handlers.rs 的 update_feed 函数);src-tauri/tauri.conf.json 可定制各平台的打包参数(如Windows的图标、macOS的签名)。项目中 crates/tauri-plugin-feed-api 是核心插件,它通过以下步骤暴露Rust功能给前端:
src/lib.rs 中使用 tauri::command 宏标记可调用函数(如 fetch_feed(url: &str));src-tauri/src/main.rs 中通过 tauri::Builder::plugin 注册插件,确保前端能通过 tauri.invoke 访问;types.d.ts(app/src/app.d.ts)需与Rust的 crates/types/src/lib.rs 结构体完全一致(如 FeedItem 的 title、pub_date 字段),避免通信时类型错误。import.meta.glob 实现路由懒加载(app/src/routes/+page.svelte 中动态导入子页面);@apply 指令配合Svelte的 style 标签,避免全局样式污染(app/src/app.css 中定义基础样式,页面组件内使用局部类名);app/src/lib/store.ts 中通过 writable 存储当前选中的Feed,组件订阅该状态自动更新(对比Redux减少了30%样板代码)。std::path::PathBuf 处理不同系统的路径分隔符(crates/recorder/src/storage.rs 中 get_db_path 函数根据 std::env::consts::OS 动态拼接路径);Program Files 目录,通过Tauri的 before_quit 钩子检查权限(src-tauri/src/hooks.rs 中 check_permission 函数);NSUserNotification、Windows的 ToastNotification),通过 tauri-plugin-notification 实现跨平台调用(前端 app/src/lib/utils/notify.ts 封装了统一接口)。早期遇到部分Feed源返回带 CDATA 标签的描述字段,serde_xml_rs 默认无法解析。解决方案:
crates/feed_api_rs/src/parser.rs 中自定义 XmlDecoder,使用 regex 库匹配 CDATA 标签并提取内容;InvalidXml、MissingField)并返回给前端提示用户(crates/types/src/error.rs 定义了详细的错误枚举)。前端高频调用Rust接口(如滚动加载时批量获取历史记录)导致主线程阻塞。优化方案:
tokio::spawn 异步任务(src-tauri/src/handlers/history.rs 中 get_history 函数使用 async 标记);macOS打包时签名失败,原因是 tauri.conf.json 中 macOS.identity 配置错误。解决步骤:
security find-identity -p codesigning 命令获取正确的签名证书ID;src-tauri/tauri.conf.json 中设置 "identity": "ABCDEF123456",并添加 "entitlements": "src-tauri/entitlements.plist" 指定权限;build.macos 字段。resolve.alias 配置);tauri dev 命令同时输出两端日志)。beforeDevCommand 和 beforeBuildCommand 钩子(如 app/vite.config.ts 中配置 beforeDevCommand: 'cargo build --package tauri-plugin-feed-api',自动编译Rust插件)。希望这篇实践能为跨平台开发的同学提供参考,也欢迎在项目仓库(saga-reader)提Issue讨论更多细节!
![]() |
网名: |
无疆_炎戎 |
|
实名: |
姜萌 | |
| http://www.wjiangathpc.spaces.live.com/ | ||
| http://www.cnblogs.com/wJiang | ||
