Joplin GSoC 2023 项目提案全解:九个开发方向、选题建议与源码落点
【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin
本文为 Joplin 参加 2023 年 Google Summer of Code(第三次参与)时官方发布的九个项目提案做逐条拆解,结合开源仓库中的实际源码目录与实现文件,说明每个提案对应的技术现状、预期产出与难度要求。读完后你将清楚这些提案分别落在 Joplin 的哪个代码区域、需要具备哪些技能栈,以及如何按照官方规范完成选题、沟通与 Pull Request 提交。
一、2023 年的总体主题与提案机制
Joplin 在 2023 年第三次参加 GSoC。官方在 GSoC 2023 提案文档 中明确:文档中列出的条目全部是提案(proposals),官方欢迎学生提出文档之外的新想法,但前提是尽早与导师(mentor)取得联系,并确认项目在 Joplin 的范围内且具备可行性。
当年的选题主题有四类:
- Plugins(插件)——利用 Joplin 插件 API 添加新能力;
- External apps(外部应用)——利用 Joplin 公开 API 创建外部应用;
- Independent modules(独立模块)——在核心应用内创建自包含的模块;
- 学生自提想法(welcome to suggest your own ideas)。
官方在贡献者须知中特别强调:这些想法来自开发者与用户,有时模糊或不完整;如果基于某个想法提交申请,应主动联系开发者了解更多细节。官方还直接点明:单纯"复制粘贴"文档里的想法是无法通过评审的,而被录取的贡献者通常是对所提项目技术做了彻底调研、并与潜在导师保持频繁沟通的人。
与提案配套的两份文档值得与本文配合阅读:
- GSoC 2023 总览:规定了技术栈——新应用或插件一律使用TypeScript,UI 使用React/Redux(新组件要求使用 React Hooks),样式使用SASS,桌面端基于Electron,移动端基于React Native,且所有应用共享同一套本地运行的 TypeScript/JavaScript(Node.js)后端;
- Pull Request 规范:只允许同时开一个 PR、PR 必须附带单元测试、不接受 WIP 状态、禁止 force push、不得自行创建 issue 再提交修复等硬性规则。
下表汇总九条提案的难度、技能要求与预估工时(文档中仅部分条目标注了工时):
| 编号 | 提案 | 难度 | 技能要求 | 预估工时 |
|---|---|---|---|---|
| 1 | 移动端插件系统 | 高 | TypeScript, React Native | 350 小时 |
| 2 | 桌面端无缝自动更新 | 中 | TypeScript, React, Electron/electron-builder | 175 小时 |
| 3 | 改进 PDF 导出 | 中 | TypeScript, JavaScript | 350 小时 |
| 4 | 桌面端集成测试 | 高 | TypeScript, JavaScript, Electron | 350 小时 |
| 5 | OCR 插件 | 高 | JavaScript, 图像处理 | 未标注 |
| 6 | 移动端语音转文字 | 高 | JavaScript, React Native | 未标注 |
| 7 | PDF 批注 | 高 | JavaScript | 未标注 |
| 8 | 插件检查器(inspector) | 高 | JavaScript, Electron | 未标注 |
| 9 | 模板插入工具 | 高 | JavaScript, Windows/macOS 编程 | 未标注 |
二、提案 1:移动端插件系统(Plugin system on mobile)
文档原文要点:插件系统当时只在桌面端和 CLI 端可用;官方判断移动端也可以支持,但需要两方面工作——让插件 API 在移动端兼容,以及增加加载插件的机制。预期产出是"允许在移动端加载并运行插件",难度高,要求 TypeScript 与 React Native,预估 350 小时。
源码落点:
- 插件机制的桌面端实现位于 插件服务目录,这是移动端要"对齐"的主要对象;
- 官方示例插件 ToggleSidebars 展示了插件的最小工程结构(含 manifest、TypeScript 源码与资源),可作为研究插件 API 的起点;
- 移动端应用整体位于 app-mobile 包,从目录结构看,它由
components/(约 257 个 React Native 组件文件)、utils/、locales/与 Android/iOS 原生工程组成,插件加载机制若落地,需要在这套 React Native 环境中运行插件沙箱,这正是文档所说"API 兼容性工作"的难点所在。
从源码结构看,提案的合理性在于:桌面端已经验证了"插件作为隔离进程运行"的模式,移动端要复用它,核心挑战是把 Electron 下的进程隔离方案替换为 React Native 环境下的等价机制。
三、提案 2:桌面端无缝自动更新(Seamless desktop application updates)
文档原文要点:当时的更新流程是"弹窗提示 → 用户点击 Download → 打开默认浏览器下载安装包 → 手动运行安装程序",体验割裂。期望改进为三点:
- 安装程序在后台自动下载;
- 下次启动时自动完成安装;
- 至少覆盖Windows 与 macOS(Linux 因发行版分发方式差异可能特殊处理)。
预期产出还要求探索"live update"(免重启热更新)是否可行,以及在用户正在使用文件的情况下如何替换文件、如何解决冲突。难度中等,要求 TypeScript、React,以及对 Electron 和 electron-builder 的了解,预估 175 小时。
源码落点:这条提案在当前仓库中已有对应实现主体,可作为"提案如何演进为实际代码"的范本:
- AutoUpdaterService.ts 是基于
electron-updater的自动更新服务。其中可以看到与提案高度呼应的三个开关:enableAutoDownload(发现更新后自动下载)、autoInstallOnAppQuit(用户关闭应用时自动安装已下载的更新)、以及AutoUpdaterEvents事件枚举(UpdateAvailable、DownloadProgress、UpdateDownloaded等),完整覆盖了"后台下载 + 启动/退出时安装"的交互链路; - 同文件中定义了平台-架构到版本清单文件的映射
supportedPlatformAssets:darwin的x64/arm64分别对应latest-mac.yml/latest-mac-arm64.yml,win32的x64/ia32对应latest.yml——这正是提案中"至少支持 Windows 和 macOS"在代码层面的体现(见 第 28-37 行); - 检查更新的主入口在 checkForUpdates.ts,它从远端发布清单接口拉取 release 列表并比较版本(第 27-37 行),并用 KvStore 维护"已跳过版本"列表,避免对同一旧版本反复提示;
- 该服务配有单元测试 AutoUpdaterService.test.ts,符合 GSoC PR 规范中"必须附带单元测试"的要求。
四、提案 3:改进 PDF 导出(Improve PDF export)
文档原文要点:Joplin 当时使用 Chrome 内置的 print-to-PDF 能力,功能受限。改进思路是改用第三方库把笔记转换为 PDF,适用范围为桌面端与 CLI 端。文档列出了三项潜在收益:
- 将多篇笔记导出为单个 PDF;
- 嵌入附件(原文引用了一个 GitHub issue 讨论);
- 延迟导出直到笔记渲染完成(方便插件先把内容渲染好再导出)。
预期产出是"PDF 导出不再依赖 Chrome print-to-pdf",难度中等,要求 TypeScript/JavaScript,预估 350 小时。
源码落点:桌面端调用打印能力的桥接入口在 InteropServiceHelper.ts 中(可检索printToPDF相关调用),说明"走 Chromium 打印管线"的现状确实存在于此;CLI 端则共享同一套@joplin/lib后端(见 lib 包),任何导出管线的改造都需要同时照顾两端。这条提案的价值点在于:导出质量(字体嵌入、分页、多笔记合并、附件图片内联)本质上是一个独立于 UI 的渲染管线问题,适合作为"独立模块"主题下的高内聚项目。
五、提案 4:桌面端集成测试(Desktop application integration testing)
文档原文要点:桌面端前端当时只有一些针对 React hooks 和工具函数的单元测试,没有集成测试来验证"某个组件的改动没有破坏另一个组件"。项目内容是搭建桌面应用的集成测试体系,并完成 setup、再写若干测试证明体系可用。预期产出包括对自动化测试方法的掌握,以及至少覆盖一部分应用(文档点名了Markdown 编辑器与 WYSIWYG 编辑器)。难度高,要求 TypeScript、JavaScript、Electron,预估 350 小时。
源码落点:这条提案在当前仓库中留下了非常完整的"落地痕迹",几乎可以视为该提案(或同类提案)成果的直接延续:
- Playwright 配置 playwright.config.ts 将
testDir指向./integration-tests,只匹配*.spec.ts,开启fullyParallel并行(注释说明每个 Joplin 实例使用独立 profile 目录以避免状态串扰),CI 上失败重试 2 次、单 worker 串行执行,并对 CI 机器放宽了超时(测试 70s、断言 15s,本地 60s/5s),失败重试时自动收集 trace(trace: 'on-first-retry'); - 集成测试目录 中的用例与文档点名的目标高度吻合:
markdownEditor.spec.ts(Markdown 编辑器)、richTextEditor.spec.ts(WYSIWYG 编辑器),以及pluginApi.spec.ts(插件 API 场景)、noteList.spec.ts、sidebar.spec.ts、settings.spec.ts、multiWindow.spec.ts、wcag.spec.ts(无障碍)等十余个 spec 文件,并配有 CI 运行脚本run-ci.sh; - 桌面端单测与集成测并存的结构(顶层
app.test.ts、app.reducer.test.ts等 Jest 单测 + 上述 Playwright 集成测试),恰好对应文档中"单元测试 + 集成测试"双层验证的设想。
从源码结构看,这套 Playwright 体系正是"对真实启动的 Electron 应用做端到端验证"的典型实现,是研究该提案从 0 到 1 如何落地的最佳参照。
六、提案 5:OCR 插件(OCR plugin)
文档原文要点:通过 Tesseract 库为 Joplin 增加 OCR 能力。第一步是可行性评估——把库集成进桌面应用并成功识别一张图片。OCR 应实现为桌面应用的一个服务:从图片中提取文字,并以纯文本形式追加到笔记中。预期产出是"一个能从图片提取文字并附到笔记上的桌面插件"。难度高,要求 JavaScript 与图像处理。
源码落点:这条提案在后来的版本中演进为内置 OCR 服务,当前仓库中可以对照:
- OcrService.ts 位于共享后端
@joplin/lib中,印证了"OCR 作为服务"的设计方向——服务放后端而不是某个 UI 层,桌面/CLI 才能复用; - OcrDriverTesseract.ts 基于
tesseract.js,按语言维护 worker 池(workers_: Record<string, WorkerWrapper[]>),并设置了置信度阈值minConfidence(第 37 行),源码注释记录了阈值从 70 调整到 55 的实验过程,是"识别结果过滤"这一 OCR 工程细节的真实案例; - 用户侧文档见 OCR 使用说明。
对想复现该提案的学生而言,这个演进路径说明了官方期待的"先评估可行性再服务化"的路线:先在桌面端打通 Tesseract 识别链路,再抽象为可测试的 driver/service 结构。
七、提案 6:移动端语音转文字(Voice to text on mobile)
文档原文要点:在移动端增加语音转文字能力。交互描述很具体:打开笔记 → 选择"Voice to text"功能 → 开始录音 → 音频自动转成文字并追加到笔记。难度高,要求 JavaScript 与 React Native。
源码落点:当前仓库存在独立的语音输入包 whisper-voice-typing,从目录结构看它同时提供了 Android(Kotlin)、iOS 桥接头文件与 C++ 核心(cpp/下含 Whisper 相关实现),并通过nitro.json配置跨平台绑定——这表明"移动端本地语音转写"方向已经从提案演进为仓库内的独立原生模块,其跨平台架构(JS 层 + 原生桥接 + C++ 核心)正是当年提案落地后最值得研究的形态。移动端集成点则位于 app-mobile 的 React Native 组件树中。
八、提案 7:PDF 批注(PDF annotations)
文档原文要点:为桌面端的 beta PDF 查看器增加批注功能,工具形态参照 Apple Preview:在 PDF 上自由绘制、添加文本框、画线与箭头等,且批注必须保存到文件中。难度高,要求 JavaScript。
源码落点:PDF 查看器是一个独立的渲染端 pdf-viewer 包,包含PdfDocument.ts(文档加载与源处理)、Page.tsx(单页渲染,含textLayer.css文本层)、VerticalPages.tsx、FullViewer.tsx与miniViewer.tsx(完整/内嵌两种查看形态),并有 pdfSource.test.ts 验证 PDF 源逻辑。"批注保存到文件"意味着不能只在查看器层画 overlay,而需要把标注写回 PDF 字节流——这是该提案的核心技术难点,也是其被定为"高"难度的原因。
九、提案 8:插件检查器(Plugin inspector)
文档原文要点:利用 Electron 可以检查其派生子进程的 API,监控每个插件的 CPU、内存等资源占用;并且当某个插件在较长时间内占用过多资源时,在应用内弹出告警。预期产出三件:一个与 Electron API 交互、收集插件进程信息的模块;一个展示插件列表及 CPU/内存信息的窗口;一个资源超限告警机制。难度高,要求 JavaScript 与 Electron。
源码落点:插件在桌面端以独立进程运行(服务位于 services/plugins),主进程负责拉起与回收这些子进程,因此"从 Electron 主进程枚举子进程并采样资源"的 API 触达点在 app-desktop 主进程 一侧已经具备基础;检查器要做的增量工作是:把每个插件进程与其资源指标关联起来、周期性采样,并在 UI 层(React)呈现列表与告警。从源码结构看,这是一个典型的"Electron 主进程能力 + 前端展示"的跨层项目,与 2023 年"Independent modules"主题契合。
十、提案 9:模板插入工具(Template insertion tool)
文档原文要点:Joplin 可以把通用模板存为笔记,用于各种上下文(如插入 Thunderbird 邮件的代码片段、插入文本编辑器)。文档给出的交互流程是:
- 用户在任意文本编辑器(邮件客户端、代码编辑器等)中按下全局快捷键(例如
Ctrl+Alt+T); - 弹出一个浮动窗口,用户从中选择一个笔记;
- 选中后,笔记内容被插入到当前文本编辑器中。
预期产出说明这可以作为外部应用开发,也可能并入核心应用(但核心需要相应改造),至少要在 Windows 与 macOS 上工作。难度高,要求 JavaScript 与 Windows/macOS 编程。
源码落点:这条提案直接落在 2023 年的"External apps"主题上——通过 Joplin 公开 API 与 Joplin 数据交互、但自身独立运行的应用形态。仓库中的 app-clipper 包(带manifest.json、service_worker.mjs的浏览器扩展)是"外部应用通过 Joplin API 集成"的一个现实样例,展示了外部客户端与 Joplin 通信的工程骨架。而提案本身的难点在操作系统层:全局热键监听、无焦点浮动窗口、以及把文本注入目标编辑器的剪贴板/模拟输入方案,都超出 Web 技术栈,需要平台编程能力,这也是其技能要求中特别列出 Windows/macOS 编程的原因。
十一、从提案文档看选题方法
九条提案虽然方向各异,但官方文档的写法本身传递了几条选题方法,值得归纳:
- 每条提案都给出可验收的 Expected Outcome——例如提案 2 明确到"下次启动时后台完成安装"、提案 6 明确到"录音自动转写并追加进笔记"。写自己的提案时,应把"完成"定义到这种粒度,而不是停留在"改进更新体验"这类模糊表述;
- 难度与工时匹配——175 小时的条目(提案 2)只要求中等难度且复用 Electron 成熟生态,350 小时的条目要么是平台级改造(移动端插件、PDF 导出管线),要么需要建设新体系(集成测试)。学生应据此评估自己的时间预算;
- 技能要求都锚定仓库技术栈——TypeScript 是基线,Electron(桌面)、React Native(移动)、图像处理/平台编程(专项)。对照 GSoC 2023 总览中的技术栈规定,任何偏离该栈的语言选择都必须在提案中专门说明理由;
- 流程约束要提前内化——PR 规范要求同一时间只能有一个 PR、必须附单元测试、禁止 WIP 与 force push、不得引用他人代写代码而不披露。这些规则意味着项目计划里要为"评审往返"预留时间,而不是把编码排满整个周期。
最后重申文档原文对贡献者的告诫:这些提案"有时模糊或不完整",提交基于某条提案的申请前,务必先与开发者建立联系;而完全绕开导师自造新想法的路径"很少奏效"。九条提案加上仓库中它们的后续演进代码(自动更新服务、Playwright 集成测试、OCR 服务、语音输入模块、PDF 查看器),共同构成了一份从"开源选题"到"工程落地"的完整研究样本。
【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考