Obsidian 插件开发规范
本技能提供一套源自 Obsidian 官方 ESLint 插件规则、插件提交要求与最佳实践开发规范,用于指导 Obsidian.md 插件的编写、审查与提交。
用途
当需要创建新插件、编写或审查插件代码、准备提交社区插件时使用本规范,可主动应用其中的规则并提出改进建议。
主要能力
涵盖以下规则类别:
提交与命名:插件 ID 不应包含 “obsidian”、不应以 “plugin” 结尾;插件名称不应包含 “Obsidian”、不应以 “Plugin” 结尾;描述中不应使用 “Obsidian”“This plugin” 等字样,并以标点结尾。
内存与生命周期:使用 registerEvent() 自动清理事件;DOM 事件使用 registerDomEvent();不将 view 引用存储在插件属性中;不在 onunload 中调用 detachLeavesOfType()。
类型安全:使用 instanceof 检查 TFile/TFolder 与 DOM Node/UIEvent;避免 any 与 var。
UI/UX:UI 文本使用句子式大小写(sentence case);命令名称与 ID 不包含 “command”,不重复插件 ID/名称;不设默认快捷键;设置标题使用 .setHeading()。
声明式设置(1.13.0+):minAppVersion < 1.13.0 时保留 display();实现 getSettingDefinitions();用 this.update() 重渲染;满足条件后删除 display();所有持久化数据保存在 plugin.settings 内。
API 最佳实践:编辑活动文件用 Editor API;后台修改用 Vault.process();删除文件用 FileManager.trashFile();查找文件用 Vault.getAbstractFileByPath();路径用 normalizePath();系统检测用 Platform API;网络请求用 requestUrl() 并校验响应;生产环境避免 console.log;输入建议用 AbstractInputSuggest;确认对话框用 ConfirmationModal(1.13.0+)或 FileManager.promptForDeletion();按 minAppVersion 检查 API 可用性;语言检测用 getLanguage()。
弹出窗口兼容:使用 activeDocument / activeWindow;需要同一文档时在变量中捕获;定时器使用 window.setTimeout() 等;从设置窗口更新主工作区 UI 时使用 this.app.workspace.containerEl.ownerDocument。
事件处理:编辑器 drop/paste 需检查 evt.defaultPrevented 并调用 evt.preventDefault()。
样式:使用 Obsidian CSS 变量;CSS 作用域限定在插件容器;使用 styles.css;避免 !important 与 :has 选择器。
安全与兼容:使用 Obsidian DOM 辅助方法(createEl()、createDiv()、createSpan()、createSvg()、createFragment());Node.js 模块导入用 Platform.isDesktop 守卫;避免正则后行断言(iOS < 16.4 不兼容)。
无障碍(强制):所有交互元素可键盘访问;图标按钮提供 ARIA 标签;使用 :focus-visible 与 CSS 变量;触控目标 ≥ 44×44px。
代码质量:删除所有示例/模板代码;Object.assign 不修改默认对象;LICENSE 版权方不得为 “Dynalist Inc.” 且年份须为当前;使用 async/await;替换被标记的废弃 npm 包。
使用方式
新建项目可使用技能仓库中的 tools/create-plugin.js 交互式脚手架生成器,通过代理命令(/create-plugin、$create-plugin 或 @create-plugin)调用,生成最小化的最佳实践样板,检测已有项目并只补充缺失文件。
提交前验证流程:运行 ESLint(npx eslint .,使用 eslint-plugin-obsidianmd)并修复所有错误与警告;校验 manifest(id、name、description、version、minAppVersion);检查 LICENSE;在移动端测试;进行键盘无障碍审计;创建 GitHub Release(标签与 manifest.json 版本一致,附带 main.js、manifest.json、styles.css);通过 community.obsidian.md 提交。修复后若 ESLint 报新错误,从第一步重新执行。
适用场景
适用于 Obsidian 插件的新建、开发、代码审查、提交流程,以及按社区评分卡(Health、Review、Disclosures)要求改进插件质量,目标整体得分 90% 以上。
限制
规范中的规则存在检测边界,例如设置标签页规则仅匹配裸 extends PluginSettingTab,extends obsidian.PluginSettingTab 不会被标记;prefer-active-doc 规则默认关闭;部分规则受 minAppVersion 版本门槛约束。规范未提供的内容(如具体收费标准、平台支持细节等)暂未提供。