Obsidian多库管理GUI工作台复盘
我一开始没想着做什么插件,就是单纯想用 Obsidian 管好自己的知识。
但用着用着,两件事越来越不对劲。第一,我的知识天然分了好几摊——笔记、AI 素材、公开要发出去的内容,它们不该搅在一起,所以我开了好几个库。第二,Obsidian 一个窗口只能开一个库,想翻一眼别的库,就得切窗口、等加载、再切回来。库越多,不能在一个界面查看预览,就显得有些繁琐。
于是我动了个念头:能不能在 Obsidian 上,自己动手做一块图形化的工作台界面?一个能同时把多个库都管起来的 GUI,让我不切窗口就能浏览、预览、编辑所有库的东西。
这个念头最后落地成了 Vault Workbench——一个把「浏览、预览、编辑所有库」塞进一块面板的插件。它最近刚通过社区插件目录的自动化审核,正式上架。这篇文章就是一次完整复盘,从我为什么要做它讲起,到上架,中间踩过的坑我尽量都摊开讲。
这是篇复盘,不是教程。想装的话,插件市场搜「Vault Workbench」就有,源码在 GitHub:Bevis23/vault-hub。
一、先把痛点拆成四件事
动手之前,我先想清楚这块工作台到底要什么。四件事,一件不能少:
- 核心需求:一个 GUI 界面里,浏览、预览、编辑多个本地库,不切窗口。
- 约束需求:各库数据完全隔离,谁也不能污染谁。
- 特色需求:切到某个库时,插件自动把「自己」部署过去,不用手动装。
- 体验需求:界面得精致,交互得顺,还得跟着 Obsidian 的暗色/亮色主题走。
第四件事其实最难,也最容易被技术人忽略。我一开始没当回事,后来被主题兼容教育了好几次。
二、最硬的骨头:跨库文件怎么读
Obsidian 的 API 是有边界的。app.vault 看得到、摸得着的,只有当前打开的那个库。你想读写另一个库的文件,官方 API 帮不上忙,得自己想办法。
我最后走的是「自己直接读文件系统」这条路:
- 用 Node 的
fs去读写别的库的.md,原子写,改到一半出错不会写坏文件。 - 但移动、重命名、删除,一律交回给库自己的
fileManager——因为自己fs挪文件,[[双链]]不会跟着更新,回收站策略也会失效。
这里有个特别容易翻车的细节,我记一下:删除别的库的文件,不能真删,得先挪进那个库自己的 .trash/,还要在 .trash/.vwb-trash.json 里记一条「回收站名字 → 原路径」的映射,原路径必须落盘。不然 Obsidian 一重启,回收站里那个文件就还原不回去了。
一句话总结:读和写正文,自己来;动结构,交给库自己。边界划清楚,后面才不出岔子。
隔离这件事,本质不是「加密」那种隔离,而是别在库之间搞破坏。我的红线很早就定死了:不自动合并库、不帮用户同步、不做跨库双链、不做跨库移动。这四条,全是拿「笔记完整性」换「一时方便」的买卖,不划算。
三、切库自动装自己,是护城河也是坑
这个能力算是我觉得最拿得出手的:右键一个库 → 「切换到此库」,插件会先把自己装进那个库,再跳过去。切过去照样有工作台,而不是一个裸库。
但「装自己」这套逻辑,踩的坑全在细节里:
- 顺序铁律:先部署成功,再跳转。部署失败直接 return,绝不跳——跳过去是个没有工作台的裸库,用户一脸懵。
- 跳转要用
obsidian://open?path=,不能用?vault=库名。后者同名库会跳错,还会凭空建一个空库出来。 - 只在「已经确认是 Obsidian 库」的文件夹里自部署,判据是有没有
.obsidian目录。不能凭感觉往任意文件夹里塞东西。 - 目标库的
community-plugins.json有数组、对象两种格式,都得兼容。
还有一条躲不掉的:每个库第一次进,用户得手动关一次「受限模式」。这是 Obsidian 的安全设计,插件没法预置,只能在提示里写清楚。
四、UI 是磨出来的,不是写出来的
工作台的布局是左中右三段:左库导航、中文件区、右预览面板。文件区有网格/列表双视图,支持多选批量操作、框选、空白处右键;预览面板能看图、看 PDF、看音视频。
但真正磨人的是 CSS。我踩得最疼的坑,是层叠上下文:
filter、backdrop-filter、transform、will-change,这四样东西都会偷偷生成一个层叠上下文,里面的z-index写得再大也出不去。- 更坑的是,被盖住的元素,同时也收不到点击。弹层点了没反应,第一反应是去改业务逻辑,其实往往是层没压住。
这类问题我前后踩了四次,症状清一色「弹层被盖住 / 点了没反应」。最后总结成一句铁律记进项目文档:先怀疑层没压住,别急着改逻辑。
样式兼容这块,我的选择是用 Obsidian 的原生 CSS 变量,不硬编码颜色。这样用户换主题,界面跟着换肤,不用我维护一套独立皮肤。
五、上架,比想象中更严格
版本管理我用语义化版本,manifest.json 的 version → CHANGELOG → versions.json 三处必须同步,漏一处就出乱子。提交社区插件目录要 PR 到 obsidian-releases 仓库,然后等自动化安全审核。
审核比我以为的严,也逼我学了不少「隐性规范」:
- manifest 的
id只能是小写字母加连字符,不能含obsidian;name不能含Obsidian;description不能以插件名开头,还必须以./!/?结尾。 - 描述里不能写「this plugin / the plugin」这种自我指代——会被判 Warning,得直接描述功能。
- README 得有足够比例的英文,否则被判 “no English text”。我最后把 README 拆成了英文门面 + 中文完整文档。
审核报的 CSS Warning(!important × 7、:has × 5)我一条条评估过,最后保留了——!important 是用来压过 Obsidian 自身层级的,:has 是做文件夹卡差异化样式的,改别的方式风险大于收益。
六、回头看,值不值
这个项目逼我把一套完整流程走了一遍:需求 → 设计 → 模块化开发 → 多场景测试 → 上架。几个以前只在「听说」层面的事,现在是真的做过了——开源项目的发布规范、社区审核的隐性规则、CSS 层叠上下文的坑、跨文件系统读写的边界。
如果说有什么最想留给自己、也留给你的一句话,是这句:
写插件不难,难的是把「边界」想清楚——哪些交给自己,哪些交回给宿主,哪些干脆不做。边界清楚了,坑才绕得开。
源码与最新进度都在 GitHub:Bevis23/vault-hub,欢迎 star 和提 issue。