第 48 章 源码阅读清单:Tauri / Tokio / Symphonia / Rodio
本章目标
从"会用库"到"懂原理"。给出一份有序的源码阅读地图,每个项目说明看什么、怎么看、收获什么。
一、为什么要读源码
- Debug 时能直达根因,而不是猜。
- 写业务代码时更有品味(错误处理、API 设计)。
- 面试时能讲"我读过它的 XX 模块"远胜空谈。
二、阅读方法
- 从 examples 入手:官方示例是最精炼的入口。
- 自底向上:从最底层类型(
struct、enum)开始,看字段和方法签名。 - 画模块图:模块 → 子模块 → 关键类型,用白板或 markdown。
- 标"你会改"的位置:想象自己要加一个功能,问"我得改哪里?"。
- 带着问题读:比如"Channel 怎么实现背压",而不是通读。
三、Tauri
仓库:https://github.com/tauri-apps/tauri
建议路线:
crates/tauri/src/app.rs:App/Manager初始化链。crates/tauri/src/ipc/:命令 invoke 的解析、序列化。crates/tauri/src/webview/mod.rs:WebviewWindow 怎么 wrap wry。crates/tauri/src/manager/event.rs:emit / listen 实现,消息分发。crates/tauri/src/protocol/:内置和自定义 URI scheme 的匹配链。
关键问题:
#[tauri::command]宏展开成什么?(用cargo expand)State<'_, T>如何在 invoke 里注入?
四、Wry & Tao
仓库:https://github.com/tauri-apps/wry,https://github.com/tauri-apps/tao
- Wry = 跨平台 WebView。看
src/webview2/(Windows)、src/wkwebview/(macOS)、src/webkit2gtk/(Linux)。 - Tao = 跨平台窗口。和
winit有分歧,专门服务 Tauri。
收获:理解三平台原生 WebView 的差异和统一抽象。
五、Tokio
仓库:https://github.com/tokio-rs/tokio
tokio/src/runtime/:多线程调度器核心。tokio/src/sync/mpsc/:最常用的 channel。tokio/src/io/util/:AsyncReadExt等扩展 trait。
建议:通读一次 runtime::task::harness 模块,理解 future 怎么被 poll。
六、Symphonia
仓库:https://github.com/pdeljanov/Symphonia
symphonia-core/src/formats/:抽象 Format/Track/Packet。symphonia-bundle-mp3/:完整 mp3 解码路径。examples/symphonia-play/:最完整的参考播放器,值得逐行看。
收获:音频解码的完整管线——demux → decode → resample → output。
七、Rodio
仓库:https://github.com/RustAudio/rodio
src/source.rs:Sourcetrait 的组合器模式(像迭代器)。src/sink.rs:播放句柄,控制 play/pause/stop。src/decoder/:基于 symphonia / hound / lewton 等的解码包装。
收获:组合器式的 DSL 在音频场景的应用。
八、Sqlx
仓库:https://github.com/launchbadge/sqlx
sqlx-core/src/pool/:连接池算法。sqlx-sqlite/src/statement/:语句缓存和执行。sqlx-macros-core/src/query/:编译期 SQL 检查。
收获:数据库驱动怎么在 async 世界里工作。
九、React(深入官方文档)
仓库:https://github.com/facebook/react
对前端新手,React 源码难度大。优先读官方文档的"内部工作原理"系列:Fiber、Hooks、Scheduler。源码浅尝即可,学会"怎么读"比"读完"重要。
十、Tanstack 系(Query、Router、Virtual)
风格统一且规模适中,是学习"库架构"的好例子:
- 状态机(
QueryObserver)。 - 订阅/通知(
QueryClient.subscribe)。 - SSR / Suspense 集成的关注点分离。
十一、Zustand
小到可以一下午读完整个核心(< 300 行)。理解"基于订阅的极小状态"是怎么做到的。
十二、一个六周计划
- 第 1 周:Tauri IPC 模块 + 事件分发。
- 第 2 周:Tokio runtime + mpsc。
- 第 3 周:Symphonia 例子 + 你自己的 audio engine 对比。
- 第 4 周:Sqlx 连接池 + 一次 query 的生命周期。
- 第 5 周:React Fiber 基础 + Scheduler。
- 第 6 周:Zustand + Tanstack Query 对比。
本章小结
- 读源码最好"有目的、分模块、带笔记"。
- 看完后写一篇 200 字总结,巩固记忆。
- 同一个库,做 CloudTone 进步一个阶段再来读,收获翻倍。
下一章:Tauri 的高级话题。