0x00 序
作为一个效率成瘾者和数据本地存储强迫症,自从发现了思源这款笔记软件就十分感兴趣,得益于其完全开源,作为程序员的我也热衷于阅读这款程序的代码,并且在集市中贡献自己的挂件。阅读过程中逐渐发现思源的源码的优点和自认为可以改进的地方,故写下此思源源码系列文章,一边分享阅读源码的见解,一边也能从整体架构上分析总结未来的改进方向。
本系列文章基于的版本为 2.7.2,并主要分析桌面端程序。
0x01 整体架构
访问思源在 Github 上的工程主页(https://github.com/siyuan-note/siyuan),右下角就显示了其语言结构。

根据源码结构和本地实际桌面端的运行状况可以了解,思源的桌面端为基于 electron 实现的应用程序,并且使用了 Golang 编写的后端程序提供 http 接口实现文件操作、索引等各种功能。这与目前常见的前后端分离架构类似,只不过前端放到了 electron 中。得益于此架构,思源同时可以提供 docker 容器为主的服务端部署以及局域网网络伺服功能。移动端目前还尚未研究,不过根据代码贡献指导文档,同样是需要将此 go 程序编译为移动端程序用于调用。

源码目录结构
siyuan ├── .github // Github相关内容,包括Issue模板、PR模板等内容 ├── app // 前端部分源码(Typescript) ├── kernel // 后端部分代码(Golang) ├── screenshots // 功能截图 ├── scripts // 相关自动化脚本 ├── API.md // API文档 ├── API_zh_CN.md // API中文文档 ├── CHANGELOG.md // 版本修改历史 ├── Dockerfile // Docker镜像构建文档 ├── .gitattributes ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md └── README_zh_CN.md
根据目录结构,我们称呼后端为“Kernel”,前端为“app”。
0x02 APP
app 的目录结构为
app ├── appearance // 外观,包含emoji、多语言、引导界面、主题等内容 ├── appx // Appx相关静态资源,应该是移动端用的 ├── electron // electron的主线程源码 ├── guide // 帮助的块数据,我们在思源中自动生成的“帮助”就来自于此 ├── pandoc // 强大的文档转换工具的安装包,包含三大桌面操作系统 ├── src // APP的主源码 ├── stage // 部分静态资源源码 ├── electron-builder-darwin-arm64.yml // electron macos(arm)构建配置文件 ├── electron-builder-darwin.yml // electron macos(intel)构建配置文件 ├── electron-builder-linux.yml // electron linux构建配置文件 ├── electron-builder.yml // electron windows构建配置文件 ├── .eslintignore // eslint忽略配置 ├── .eslintrc.js // eslint配置文件 ├── installer.nsh ├── .npmrc ├── package.json ├── pnpm-lock.yaml // pnpm锁文件 ├── tsconfig.json // typescript配置文件 ├── webpack.api.js ├── webpack.config.js ├── webpack.desktop.js ├── webpack.export.js └── webpack.mobile.js
在这部分的文件名,我们可以猜出很多技术细节:
- 桌面端基于 electron,并且支持 linux、macos、windows 桌面操作系统
- 使用 eslint 作为代码风格检查工具
- pnpm 作为依赖包管理器
- 基于 Typescript 源码
- 使用 webpack 打包,同时支持了桌面端、移动端等内容,并且对配置文件进行了多文件拆分
- 使用了 pandoc 作为桌面端的文档转换工具
从 webpack 的文件内容和 package.json 中,我们可以了解到,思源并没有采用 React、Vue、Svelte 等主流前端框架或者库,使用 SCSS 作为 CSS 预处理器处理样式。入口文件为 app/src/index.ts。后续我们在 App 的详解中可以继续解析这部分内容。
0x03 Kernel
Kernel 使用 Golang,一门 Google 开发的跨系统语言,支持编译为各种操作系统和架构的程序。在 Readme 最下面,我们可以看到思源也是基于各种开源库。入口为 kernel/main.go。
kernel ├── api // 各类api的注册及model调用 ├── bazaar // 集市模块 ├── cache // 资源缓存 ├── cmd ├── conf // 配置与类型声明 ├── filesys ├── job // cron任务调度 ├── mobile ├── model // 各个模块的功能实现 ├── resource ├── search ├── server // server服务创建、端口管理 ├── sql ├── task ├── treenode ├── util ├── go.mod ├── go.sum ├── main.go └── versioninfo.json
Golang 部分代码尚未阅读很多,目前简单列出来,后续在实际了解业务时也可以详细解析。
0x04 小结
以上为基于 Github 源码的粗略分析,在了解整体结构的情况下,下一篇我们将从系统启动入口开始,分析桌面端是如何启动引导的。
首发 b3log 社区,转载请事先沟通。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于