Skip to content

开发指南

本章节为开发者提供完整的 Obsidian 扩展开发指南,帮助你创建自定义插件和主题。

为什么要开发?

场景说明
自定义功能现有插件不满足需求
工作流自动化优化个人工作流程
分享贡献贡献社区,帮助他人
学习成长提升 TypeScript/CSS 技能

快速开始

环境准备

必需工具:

  • Node.js 18+
  • npm 或 pnpm
  • Git
  • VS Code(推荐)

推荐扩展:

  • TypeScript
  • ESLint
  • Prettier

创建第一个插件

bash
# 1. 创建插件目录
mkdir my-plugin
cd my-plugin

# 2. 初始化项目
npm init -y

# 3. 安装依赖
npm install obsidian @types/node typescript

# 4. 创建基本文件
mkdir src
touch src/main.ts manifest.json styles.css

最小插件示例

typescript
// src/main.ts
import { Plugin } from 'obsidian';

export default class MyPlugin extends Plugin {
  async onload() {
    this.addCommand({
      id: 'hello-world',
      name: 'Say Hello',
      callback: () => {
        console.log('Hello, Obsidian!');
      }
    });
  }
}
json
// manifest.json
{
  "id": "my-plugin",
  "name": "My Plugin",
  "version": "1.0.0",
  "minAppVersion": "0.15.0",
  "description": "My first Obsidian plugin",
  "author": "Your Name",
  "authorUrl": "https://example.com",
  "isDesktopOnly": false
}

内容导航

入门教程

主题说明进入
开发入门环境配置与基础概念新手必读
插件开发教程手把手开发完整插件循序渐进
API 参考Obsidian API 完整参考速查手册

进阶开发

主题说明进入
插件开发详解命令、视图、设置系统深入理解
主题开发CSS 主题与样式定制视觉定制
零基础主题定制CSS 变量与代码片段入门外观自定义
Ribbon 与 StatusBar API侧边栏图标和状态栏开发UI 扩展
Settings API 深度指南PluginSettingTab 与 Setting 汇总API 参考
调试技巧开发者工具与常见问题问题排查

发布与分享

主题说明进入
发布插件提交到社区插件市场分享成果
最佳实践清单性能、内存、兼容性等规范质量保障
示例项目优秀开源项目分析学习参考
常见问题开发中常见问题解答问题解决

开发资源

官方资源

文档:

社区:

  • Discord: #plugin-dev 频道
  • Forum: Developers 分类
  • GitHub: obsidianmd/obsidian-api

示例插件

项目说明
obsidian-sample-plugin官方示例插件
obsidian-dataview复杂数据查询实现
obsidian-templeter高级模板功能
obsidian-git第三方服务集成
插件开发清单从零到上架的步骤清单。
WebView 插件用 WebView 构建富界面插件。
Obsidian API 入门理解插件可用的核心 API。
插件结构理解插件目录与清单。
View API 指南构建自定义视图。
编辑器扩展用 CodeMirror 扩展编辑器。
Settings API 进阶更复杂的设置界面。
Ribbon API 进阶更灵活的图标与菜单。
Workspace API 指南操作面板与布局。
File API 指南读写与管理笔记文件。
Dataview API 指南在插件中调用 Dataview。
插件 CI/CD用流水线自动化构建与发布。
插件版本管理规范地递增版本与变更。
调试进阶更深入地定位插件问题。
主题变量指南理解与覆盖主题 CSS 变量。
CSS 变量手册Obsidian 的 CSS 变量速查。
插件国际化进阶更完善的本地化方案。
插件开发环境搭建 TypeScript 开发环境。
插件清单manifest.json 字段详解。
插件生命周期理解加载与卸载。
命令 API注册与调用命令。
事件 API监听 vault 事件。
View API 进阶复杂视图与状态。
编辑器 APICodeMirror 扩展。
设置 API 进阶动态设置界面。
数据 API读写笔记与缓存。
工作区 API操作面板布局。
插件构建用 esbuild 打包。
调试进阶深入定位问题。
主题变量进阶覆盖与扩展变量。
暗色主题设计暗色配色。

开发工作流

开发流程

mermaid
graph LR
    A[创建项目] --> B[编写代码]
    B --> C[本地测试]
    C --> D{是否通过}
    D -->|| B
    D -->|| E[编写文档]
    E --> F[发布]

本地测试

  1. 编译 TypeScript:npm run build
  2. 复制文件到 .obsidian/plugins/your-plugin/
  3. 重启 Obsidian 或重新加载插件
  4. 测试功能

开发模式:npm run dev(监听文件变化自动编译)

调试方法

控制台调试:

  • Windows/Linux:Ctrl + Shift + I
  • macOS:Cmd + Option + I
  • 移动端:设置 → 第三方插件 → 启用调试

常用调试:

  • console.log():输出调试信息
  • debugger:设置断点
  • this.registerEvent():事件追踪

插件类型

按功能分类

分类功能
编辑增强快捷操作、文本处理、格式转换
界面扩展侧边栏面板、状态栏、自定义视图
数据管理查询展示、数据同步、导入导出
外部集成API 对接、第三方服务、自动化工作流

按复杂度分类

复杂度特征代码量
简单单一命令执行、简单设置项< 500 行
中等多个功能模块、自定义视图500-2000 行
复杂完整工作流、数据存储、第三方服务集成> 2000 行

最佳实践

代码规范

typescript
// 1. 使用 TypeScript 严格模式
// tsconfig.json
{
  "compilerOptions": {
    "strict": true
  }
}

// 2. 遵循命名规范
class MyPlugin extends Plugin {
  // 私有属性用下划线前缀
  private _setting: MySettings;
  
  // 公共方法用 camelCase
  public async loadData() {}
  
  // 事件处理器用 on 前缀
  private onFileChange(file: TFile) {}
}

// 3. 添加类型注释
interface MySettings {
  enabled: boolean;
  format: string;
}

性能优化

typescript
// 1. 避免频繁 DOM 操作
// 不好
for (const item of items) {
  container.createDiv({ text: item });
}

// 好
const fragment = document.createDocumentFragment();
for (const item of items) {
  fragment.createDiv({ text: item });
}
container.appendChild(fragment);

// 2. 使用防抖/节流
import { debounce } from 'obsidian';

this.registerEvent(
  this.app.vault.on('modify', debounce(
    this.onFileChange.bind(this),
    500
  ))
);

// 3. 正确清理资源
onunload() {
  // 移除事件监听
  this.unregisterEvents();
  // 清理定时器
  clearInterval(this.timer);
  // 释放引用
  this.views = null;
}

错误处理

typescript
// 1. 捕获异步错误
async loadData() {
  try {
    const data = await this.app.vault.read(file);
    return data;
  } catch (error) {
    console.error('Failed to load data:', error);
    new Notice('加载失败,请检查文件是否存在');
    return null;
  }
}

// 2. 验证用户输入
function validateInput(value: string): boolean {
  if (!value || value.trim() === '') {
    new Notice('输入不能为空');
    return false;
  }
  return true;
}

// 3. 优雅降级
if (!this.app.vault.getConfig('propertiesInDocument')) {
  // 功能不可用时的替代方案
}

常见问题

Q: 如何开始开发?

A:

  1. 阅读开发入门
  2. 查看插件开发教程
  3. 参考示例项目

Q: 如何调试插件?

A:

  1. 使用开发者工具(Ctrl+Shift+I)
  2. 查看 Console 面板
  3. 使用 console.log() 输出调试信息
  4. 参考调试技巧

Q: 如何发布插件?

A:

  1. 准备 README.md 和 LICENSE
  2. 提交到 GitHub
  3. 在社区仓库提交 PR
  4. 等待审核
  5. 参考发布插件

相关资源