思源源码解析(一):整体架构

本贴最后更新于 637 天前,其中的信息可能已经渤澥桑田

0x00 序

作为一个效率成瘾者和数据本地存储强迫症,自从发现了思源这款笔记软件就十分感兴趣,得益于其完全开源,作为程序员的我也热衷于阅读这款程序的代码,并且在集市中贡献自己的挂件。阅读过程中逐渐发现思源的源码的优点和自认为可以改进的地方,故写下此思源源码系列文章,一边分享阅读源码的见解,一边也能从整体架构上分析总结未来的改进方向。

本系列文章基于的版本为 2.7.2,并主要分析桌面端程序。

0x01 整体架构

访问思源在 Github 上的工程主页(https://github.com/siyuan-note/siyuan),右下角就显示了其语言结构。

image

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

image

源码目录结构

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 社区,转载请事先沟通。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22012 引用 • 87776 回帖 • 2 关注

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • xxl

    学习学习。

  • 其他回帖
  • littletalent

    感谢大佬分享,诚切希望大佬可以继续更新这个专题。😭 😭 🙏

  • RaistlinD

    终于有人系统解析 siyuan 了,真不错,搬个板凳持续学习。楼主加油~

  • qifengle1998

    牛啊,我之前听别人说思源是半开源。 所以思源现在是完全开源了吗?

  • 查看全部回帖