Yank Note 系列 01 - 为什么要自己写笔记软件?

Yank Note (opens new window) 是我编写的一款面向程序员的笔记应用。这里我将会写下一些关于 Yank Note 的文章

tl;dr

我想做一款我自己(用户)可以完全掌控的笔记软件

# 缘起

从大学开始,我就一直在尝试使用各种笔记软件,从 Sublime Text 直接编辑文件,到使用印象笔记、OneNote等各种云笔记,最后我选择了为知笔记。

但是后来,为知笔记开始收费,越来越臃肿,反应慢,Bug 也多。最终,我放弃了它。备份笔记花了一些功夫,我开始不再相信云产品,自己电脑上的才是真正属于自己的。

于是我开始寻找一款本地笔记软件,断断续续是用了不少产品,这些当中只有 Joplin 让我使用时间最长,但也不是完全满意。后面,我还是回退到了使用 Sublime Text 写 Markdown 的方案。

最终在三年前的某一天,我决定自己写一个供自己使用的笔记工具。花了一个下午时间,我拼凑出了第一个可以使用的版本。使用 Node.js 做服务端,Vue 做前端。功能简陋到什么程度呢?只有读取和写入文件的功能;没有按钮,只有快捷键;界面随意搭在一起。完完全全就是一个功能简陋且丑陋的记事本。

Img

我当时也不知道自己需要什么,要做出什么。后来我才慢慢找到这样的目标

  • 界面字大不费眼 😃
  • Markdown 撰写
  • 图片文件保存在本地,导出 Markdown 文件可简单处理离线工作
  • 支持一些流程图表绘制 plantuml mermaid
  • 支持加密解密,用来保存账号等隐私文件,文件可单独设置密码
  • 不需要更多花哨功能,简单够用就行
  • 尽量少依赖三方库,也不花心思维护,杂凑在一起的功能,恰好工作即可 ^_^
  • 在文档中运行 PHP Python Node.js 代码块

而这时候,界面长这样
Img

总的来说,这时候我还是都是按照自己想法来做这个应用,完全不考虑是否美观,是否方便,只要功能满足自己需求即可。

后来,我的一位同事觉得这个应用很实用,开始使用它。我在掘金上发了一篇文章 Markdown 编辑器 (自家用) (opens new window),掘友 @KDA (opens new window) 评论道:“求更新完善,很好用”。于是我开始想,这个东西除了我自己,是不是可以再完善完善,给其他人使用。

但是这时,才发现我还没给这个编辑器取一个名字。GitHub 仓库名是随意起的“yn”,所以顺着这个,正式起名 “Yank Note”

为了方便其他人使用,也决定采用 Electron 开发,方便启动运行。

# 进化

这里再思考一下,我究竟需要一款怎样的笔记应用,最后我定了下面几点原则,按照重要性排序

  1. 拒绝云服务: 数据要保存在本地,应用也要在本机运行,备份和同步的需求可以走 Git 或者云盘,私人笔记,无需协作功能。甚至于图床之类,也不要使用,就存本地。
  2. 拒绝专有格式: 使用 Markdown 文件保存所有信息,不要给我什么 json 格式或者其他格式的,万一我哪一天弃用这个软件,要能很方便迁移。
  3. 开源: 一款软件,我要长久使用,那么不能是封闭的。如果哪一天应用作者不更新了,我要能自己 fork 一份来自己维持基本的运行。
  4. 可拓展: 这款应用要具备足够的拓展性,我遇到一些自己特定的需求,或者使用软件有不顺手的地方,我要能自己写插件或者拓展来修改和实现。
  5. 克制: 应用需要保持简单,不要太臃肿,不要太花哨,不要有过多动画干扰我的操作。比如 Notion 的菜单动画,第一时间感觉很炫酷,但是使用一下就会觉得很拖沓。而它的一些工具提示又展示太快,变成操作的干扰项。这里我非常认同 Sublime Merge (opens new window) 的理念。Sublime Merge 是我使用过的体验最好的 Git 客户端,使用它是一种享受。
  6. 跨平台: 我同时使用 Windows,macOS,Android,iOS。我需要让这款应用是跨平台的,至少在桌面端是要跨平台的。不过我的大部分笔记和文章都是在电脑上完成,手机上只需要记录一些灵感即可,这种需求很多软件都能完成得很好,比如 iOS 自带的备忘录。另外既然文件格式也不是专属,也不绑定云服务,那么很多移动端的 Markdown 编辑器也能很好的工作,在移动端跨平台的需求就没那么强烈。

上面的原则都是为了让我可以长久使用一款软件。如果你认同上面的观点,那么 Yank Note 或许是你的菜。

我是一枚标准的程序员,后端前端嵌入式都搞过,偶尔还做下白帽子,现在主要搞前端。这让我的笔记需求有一些特殊性,下面说下我使用 Yank Note 的一些具体场景。

  1. 做笔记: 这是基本需求,我需要做的笔记中有不少代码,代码最好能方便复制和运行。比如学习一些 js 特性的时候,我会将代码片段存下来,下次查看立马就能运行。
  2. 工作日志: 刚毕业那会儿,工作上什么事情基本都能记在脑子里,现在不行了,需要有个地方记录,安排一些待办事项,工作安排等。
  3. 写文章: 我发文章比较少,很多文章都是在工作时候写方案和文档。这时候笔记应用能支持嵌入图形就比较重要。
  4. 编写工具: 平时在工作中,有不少脚本工具,之前都比较散落在各处或者说明比较少,后续使用就比较麻烦。而现在它们都统一在 Yank Note 中组织关联。很多脚本和代码都能更方便打开,也能有更丰富的说明和 UI 界面。

经过上面这些场景洗礼后,Yank Note 长这样

Img

# 一些问题

完美不是没有什么可以增加的,而是没有什么可以减少的。

下面是一些用户问过我,和我做 Yank Note 的时候,考虑过的一些问题,大部分都是关于“为什么不”。

  1. Q: 为什么要采用 C/S 架构?
    A: 我喜欢浏览器,我平时都是在浏览器中使用 Yank Note,配合浏览器插件我可以做更多事情。现在的架构是重客户端轻服务端,未来还会继续精简服务端逻辑。
  2. Q: 为什么要使用编辑预览分开,而不是所见即所得?
    A: 一来是因为我喜欢文本,我喜欢控制文本,我更喜欢代码的方式来写东西。二是技术原因,富文本编辑器很难做好。我体验过不少富文本编辑器/组件,都很难达到我想要的体验,还不如直接文本来得直接。
  3. Q: 为什么没有工具条来调整格式?
    A: 和上一条一样,我喜欢文本,不喜欢过多的 UI。用户应该使用文本来控制格式,写 Markdown。使用 Yank Note 的用户应该是熟悉 Markdown 的。当然我也可以偷懒不做这个功能了。
  4. Q: 为什么不做成 VSCode 插件?
    A: VSCode 插件限制还是比较多,一些功能不能很方便实现,我还是更喜欢浏览器来得简单直接。如果你需要,这个 VSCode 插件 (opens new window) 很不错。
  5. Q: 为什么不集成 Git 功能,自动推送到 Github?
    A: 我自己的几个笔记仓库都是依托 Github 储存的,所以这个需求还是比较迫切的。但是我还是想要把 Git 集成排除在 Yank Note 功能之外。每个用户都有自己的习惯来管理 Git 仓库,比如我喜欢 Sublime Merge。当然为了便捷,我也写了一个 Yank Note 插件 (opens new window) 来快速提交和推送内容。
  6. Q: 为什么不做成在线版?
    A: Yank Note 从一开始就是 C/S 架构,只是现在多了 Electron 的一些功能,要做成在线版还是很容易。比如现在的 在线 Demo (opens new window) 就是屏蔽了接口请求的版本。但是做成 Web 服务,那么就违背了我的第一条原则,我不希望这个编辑器脱离用户的掌控。另外就是 Yank Note 因为异常开放,为了拓展性,安全问题很难考虑周全(我是业余白帽子)。
  7. Q: 为什么不做文件关联,可以直接打开 Markdown 文件的功能?
    A: 正如上面所说,Yank Note 异常开放,有代码运行,宏替换,HTML 解析等功能。为了更高的拓展性,几乎将内部能力完全放开,包括一些危险的能力如命令执行,任意文件读写等,因此我没做文件关联功能。只能从仓库打开,可以让用户更谨慎的打开外来文件。
  8. Q: 是否考虑做成双链笔记?
    A: 双链笔记很火,但是我体验过一些双链笔记软件,如 Obsidian,我发现我并不需要它。这篇文章的观点我比较赞同 请不要神化双链笔记 (opens new window)。我实际使用笔记的体验来看,我最需要文档之间的单向链接,但是粒度不需要到“块”,到标题即可。反向关联我只需要能知道当前文档被谁引用即可。我不赞同扁平的笔记结构,就像写代码,我不赞同所有逻辑都在一个文件。我需要层级,需要能引用模块,知道当前模块被谁引用就够了。这方面 Yank Note 还要加强。

# 未来

这几年来我一直使用 Yank Note,开发的功能也是因为自己和用户有需求。我在开发 Yank Note 的过程中,我的编程技能也提升不少,所以哪怕是出于学习的目的,我也还会继续开发维护下去。

现在能预计到的未来几个完善的点:

  1. 增强基础体验
  2. 精简服务端代码
  3. 强化文档之间的链接
  4. 开发简单的移动端应用

如果你对 Yank Note 感兴趣,想使用或者参与贡献,可以到 Github (opens new window) 了解更多。

本文由「Yank Note - 一款面向程序员的 Markdown 笔记应用 (opens new window)」撰写