Back to Blog

想把 Obsidian 插件上架?Auto Scan 这关,我先帮你踩了

林小卫很行

前几天打开 Obsidian 的社区插件后台,扫了一眼自动扫描报告。

过去密密麻麻的 warning,现在只剩下一条了:

README does not appear to contain English text

对,就是那个「你的 README 只有中文」的 warning。

我盯着它看了几秒,笑了一下,然后决定:这个 warning 我不修。

原因很简单:我的插件 Wechat Converter 主要就是给中文用户用的,在国内场景里跑。README 全中文,对我的用户来说反而是最自然的事。保留这个 warning,是我刻意选的。

但你千万不要以为,从「满屏飘红」到「只剩一条我故意不修」,是一条轻松的路。

这中间踩了不少坑。有些坑是 Obsidian 自动扫描特有的,有些是 AI 辅助开发这个模式下特有的。我觉得现在这个时间点,把这些坑分享出来,可能正是时候。


为什么是现在

Obsidian 插件上架的流程,最近有两个变化我觉得很值得聊。

第一个变化:自动扫描取代了人工排队。

以前你要上架,得去 obsidian-releases 提 PR,然后排队等人工 review,基本上是几个月起步,因为排队等待审核的插件实在太多了。关于这一段,我之前写过一篇[[被官方 Bot 打回 10 次后,我终于摸清了 Obsidian 插件上架的所有"潜规则"]],讲的就是上架前的那些坑。

自从 Obsidian 上线自动扫描机制以来,每个版本提交上去,机器就会自动检查安全性、代码质量和恶意行为风险。上架速度确实快了很多。但也意味着第一道门槛变成了「能不能先过 Scan」,而不是「能不能等到 reviewer 有空」。

那篇旧文讲的是 PR 校验流程的坑,这篇来讲 Auto Scan 代码审查的坑。两篇凑一起,差不多就是完整的上架避坑指南了。

第二个变化:AI 让插件开发的门槛降到了地板。

我自己就是个典型。我不是程序员,以前做产品经理,现在做 BA。这个 Wechat Converter,几乎整份代码都是在 AI 帮助下写出来的。放在两年前,我想都不敢想一个非科班的人能做出一款上架到 Obsidian 市场的插件,而且现在已经有 1 万多的下载量了。

但这两个变化叠加,也带来一个尴尬的局面:AI 擅长的是写「能跑」的代码,而不是写「能过 Scan」的代码。 因为它默认学到的是一般 Web 开发范式,不是 Obsidian 插件市场的扫描规范。

以后会有越来越多的人,用 AI 做出插件,然后想上架分享。而 Auto Scan 会是他们遇到的第一堵墙。这篇文章,就是我把这堵墙拆开给你看。


自动扫描到底在看什么

第一次跑 scan 的时候,我盯着满屏的 warning 报错愣住了。我的代码本地跑得好好的,功能也没问题,但它就是不让你过。

后来我才理解:自动扫描看的不是「你能不能跑」,而是四件完全不同的事:

  • 你的实现方式是否足够安全
  • 你的 API 使用是否符合 Obsidian 生态的约束
  • 你的 DOM 操作、样式赋值、HTML 注入是否会触发风险
  • 你的代码是否可维护、可被第三方信任

所以会出现一种很典型的情况:某段代码在一般的前端项目里非常普通,甚至是你下意识就会那么写的;但一进 Obsidian 的自动扫描,它就是 warning,甚至是 error。

因为你的写法没有对齐 Obsidian 的规则。

当然,如果你从一开始就按 Obsidian 的规范来写,很多坑是可以避开的。但如果你和我一样,是先靠 AI 把功能跑通、回头再修 Scan 的。那下面这些应该很适合你。

想把 Obsidian 插件上架?Auto Scan 这关,我先帮你踩了 - 配图 1


我们踩过的那些高频坑

下面这些是我们这轮反复撞到、改了一遍又一遍的地方。

1. 普通前端写法,在 Obsidian 里可能就是雷

这些写法,在一般前端项目里再常见不过:

element.style.padding = '12px';
element.innerHTML = '...';
confirm('确定删除?');
fetch() 传 data: 之类的复杂参数

但在 Obsidian 插件 Scan 里,这些都很容易被盯上。

我们这轮遇到最多的两类报错是:

  • obsidianmd/no-static-styles-assignment —— 静态样式赋值
  • @microsoft/sdl/no-inner-html —— HTML 注入风险

表面看是 lint 规则,背后其实是 Obsidian 在逼你想清楚一件事:你的代码能不能和 Obsidian 的生态共存?你的样式会不会破坏主题兼容性?你的 HTML 操作是否可控?

2. innerHTML 要极度克制

这个点很容易被误解。有些人看到扫描规则禁 innerHTML,就一刀切全部干掉。但实际上有些场景它就是必须的,比如 Markdown 渲染后的 HTML,Mermaid 图表的渲染输出。

我们的策略不是「不用」,而是:

  • 能不用就不用
  • 必须用的时候,把范围锁死在渲染边界
  • 在上一行加清晰的 ESLint 注释说明原因
  • 补上测试,确保这个行为是有意的、可回归验证的

关键是先区分「危险的偷懒写法」和「功能必须的窄边界用法」。

3. 样式赋值这个雷区,踩得最密集

这轮改了大量直接操作 element.style.xxx 的代码。

以前写的时候图省事,padding、display、color 直接在 JS 里塞。后来统一改成了:

setCssStyles(element, { ... })

不只是为了过 Scan。改完之后我发现,那些以前在 JS 里凌乱的样式,其实本来就应该沉到 styles.css 里去。JS 里堆一堆 inline style,说明结构和样式的职责还没有分清楚。

想把 Obsidian 插件上架?Auto Scan 这关,我先帮你踩了 - 配图 2

4. confirm() 换成 Obsidian 原生 Modal

把删除/清空操作的 confirm() 换成 Obsidian 风格的确认弹窗。说实话,改完我自己都没想到。不只是扫过了 Scan,交互也更统一了,跟 Obsidian 本身的风格更像了。

后来我想通了一件事:Scan 规则很多时候不是在刁难你,而是在逼你把插件做得更像一个「真正的 Obsidian 插件」。

5. 关于 warning,不要觉得「没有 error 就行」

我们一开始也有过这种想法:error 必须修,warning 先放着吧。

但后来很快发现,warning 太多有三个问题:

  • 扫描报告很长,看起来很吓人
  • 用户如果点开看,会觉得「这个插件风险很多」
  • 在插件越来越多的情况下,「看起来值不值得装」会成为用户的选择依据

所以我们后来定了三条原则:

  • error 必须修
  • 低风险、行为等价的 warning 尽量修
  • 可能伤及核心功能的 warning,明确评估后再动

真正花时间的,是修「边界」

如果只看提交记录,你会以为我们做了很多零碎的修复:改样式赋值、补注释、换 Modal、调 manifest 版本号、修图片处理、拆模块……

但站在更高一层看,所有这些修复指向的是同一件事:

把「随手可写的实现」,改造成「边界清晰、可解释、可测试、可过 Scan 的实现」。

这也是为什么中途我们不断在拆文件、拆模块、解耦逻辑。因为如果一个文件越来越大,自动扫描暴露出来的问题会越来越难修:你已经说不清哪一段是业务,哪一段是渲染边界,哪一段是兼容补丁。

后来我们给 Codex 立了一条硬原则:

不要往单个文件里继续堆代码。优先模块化和职责解耦。

这条原则,对过 Scan 本身也有帮助。

想把 Obsidian 插件上架?Auto Scan 这关,我先帮你踩了 - 配图 3


如果你也准备上架插件,我的建议

1. 把 Scan 当作开发流程的一部分

不要等到准备发 release 了才第一次跑扫描。

更好的做法是:

  • 日常开发时跑一个快的检查命令
  • 合并前跑完整的扫描
  • CI 里也跑同一套检查
  • 发版时再验证一次

这样能避免一种特别痛苦的情况:你已经写完了一大堆功能,才发现你的实现方式和扫描规则根本冲突。

2. 给项目留一份 Obsidian Scan Checklist

这次踩过的坑,我们后来在项目里留了一份 checklist.md,列了十几条规则,每次 release 前对着跑一遍。

它的价值不在于「记规范」,而在于给三类人看:

  • 未来的自己
  • 一起协作的 AI
  • 其他协作者

很多坑踩过一次,就应该把它固化下来,不要靠记忆。

说到这个,我其实还有一个小建议。

3. 不要让 AI 自由发挥

AI 很适合加速开发,但前提是你给了它足够明确的约束。

至少你要告诉它:

  • 不要直接写 innerHTML,除非明确说明原因
  • 不要静态写 element.style.xxx
  • 不要用浏览器原生 confirm()
  • 优先用 Obsidian 原生 UI 组件
  • 新逻辑尽量拆模块,不要继续往入口文件里堆
  • 改核心逻辑必须补测试

如果没有这些约束,AI 很容易生成「在 Web 世界里合理、但在 Obsidian 市场里高危」的代码。

想把 Obsidian 插件上架?Auto Scan 这关,我先帮你踩了 - 配图 4


以前,插件作者最大的难题是「怎么做出来」。

现在,越来越多人的难题会变成「怎么做得能上架、能被信任、能长期活下去」。

但 Wechat Converter 这一路走过来,意味着 Obsidian 的插件生态正在从一个「野蛮生长」的阶段,进入「基础设施化」的阶段。

而自动扫描,就是这套基础设施里最关键的一层。

如果你愿意把它当成一种倒逼,你最后得到的,往往不只是一个「通过审核的插件」,而是一套更成熟的开发习惯:

  • 更清晰的边界
  • 更克制的实现
  • 更稳定的架构
  • 更可信的交付

嗯,和一个你可以刻意保留的 warning,哈哈哈


Wechat Converter 是一个将 Obsidian Markdown 转为公众号格式、并可一键发送到微信后台的插件。如果你恰好也在写公众号、同时用 Obsidian 做笔记,可以在 Obsidian 插件市场搜索「Wechat Converter」找到它。

这篇文章是「踩坑系列」的一部分。之前写过上架时被 Bot 打回 10 次的经历、插件被误下架的来龙去脉,感兴趣的话可以翻翻历史记录。

继续系统学习 Obsidian

这篇属于 Obsidian 相关教程。想按顺序学习,可以回到完整的 Obsidian 入门教程路径。