Dendron插件开发入门:从零构建自定义知识处理功能
你是否在使用Dendron管理知识时遇到这些痛点?笔记数量爆炸导致查找困难、重复内容难以统一管理、特定领域知识缺乏专用处理工具?本文将带你从零开始构建Dendron自定义插件,通过5个步骤实现知识自动化处理功能,让你的个人知识管理系统真正为你所用。读完本文,你将掌握插件项目搭建、核心API调用、功能测试与发布的完整流程。
开发环境准备
Dendron插件开发需要特定的环境配置,确保你的开发环境满足以下要求:
- Node.js 14.x或更高版本
- Yarn 1.22.x包管理器
- Visual Studio Code 1.60+
- Git版本控制工具
首先克隆Dendron开发仓库:
git clone https://gitcode.com/gh_mirrors/de/dendron
cd dendron
执行项目初始化脚本,安装依赖并构建基础模块:
./setup.sh
yarn bootstrap
项目结构采用Lerna monorepo架构,插件开发主要涉及以下核心目录:
- packages/plugin-core/:VSCode插件核心代码
- packages/common-server/:后端服务API
- packages/dendron-cli/:命令行工具
- test-workspace/:插件测试环境
开发配置文件.vscode/settings.json已预设开发环境,包含代码格式化、类型检查和调试配置。
插件项目结构
Dendron插件遵循VSCode扩展开发规范,同时融入了Dendron特有的知识处理架构。新建插件项目可基于官方模板:
cd packages
cp -r _pkg-template my-dendron-plugin
cd my-dendron-plugin
基础插件结构如下:
my-dendron-plugin/
├── src/ # 源代码目录
│ ├── extension.ts # 插件入口
│ ├── commands/ # 命令实现
│ ├── utils/ # 工具函数
│ └── types/ # 类型定义
├── package.json # 依赖和配置
├── tsconfig.json # TypeScript配置
└── README.md # 插件说明
核心配置文件package.json需要声明插件激活事件和贡献点:
{
"activationEvents": [
"onStartupFinished",
"onCommand:dendron-my-plugin.my-command"
],
"contributes": {
"commands": [
{
"command": "dendron-my-plugin.my-command",
"title": "Dendron: My Custom Command"
}
]
}
}
核心API与知识操作
Dendron提供多层次API供插件开发,从基础的笔记CRUD到高级的知识图谱分析。
访问工作区和笔记
通过Dendron引擎API获取工作区信息和操作笔记:
import { DendronEngineV2 } from "@dendronhq/engine-server";
// 获取引擎实例
const engine = new DendronEngineV2({
wsRoot: "/path/to/workspace",
vaults: [{ fsPath: "vault" }]
});
// 初始化引擎
await engine.init();
// 获取单篇笔记
const note = await engine.getNote("dendron.plugin.development");
// 创建新笔记
const newNote = await engine.createNote({
id: "my-new-note",
title: "My New Note",
vault: { fsPath: "vault" }
});
相关API定义在packages/engine-server/src/enginev2.ts中。
命令注册与执行
在extension.ts中注册命令并实现功能:
import * as vscode from "vscode";
import { DendronExtension } from "@dendronhq/plugin-core";
export function activate(context: vscode.ExtensionContext) {
// 获取Dendron扩展实例
const dendronExt = vscode.extensions.getExtension<DendronExtension>(
"dendron.dendron"
)?.exports;
// 注册自定义命令
let disposable = vscode.commands.registerCommand(
"dendron-my-plugin.auto-tag",
async () => {
// 获取当前激活的笔记
const note = await dendronExt.getEngine().getActiveNote();
// 实现自动标签功能
if (note) {
// 添加标签逻辑...
await dendronExt.getEngine().updateNote(note);
vscode.window.showInformationMessage("自动标签已添加");
}
}
);
context.subscriptions.push(disposable);
}
命令系统实现参考packages/plugin-core/src/commands/目录中的现有命令。
知识图谱操作
利用Dendron的知识图谱API分析笔记间关系:
// 获取笔记引用关系
const backlinks = await engine.getBacklinks({ noteId: "target-note-id" });
// 查询关联笔记
const related = await engine.queryNotes({
qs: "tag:project status:active",
limit: 10
});
图谱数据结构定义在packages/common-all/src/types/typesv2.ts中。
功能实现示例:自动分类标签插件
以"自动分类标签插件"为例,实现基于内容分析的笔记自动标签功能。
1. 命令实现
创建命令文件src/commands/autoTagCommand.ts:
import { NoteUtils } from "@dendronhq/common-all";
import { BaseCommand } from "./baseCommand";
export class AutoTagCommand extends BaseCommand {
static id = "dendron-auto-tag.auto-tag";
async run() {
const { engine, note } = this.props;
if (!note) {
this.L.error("No active note found");
return;
}
// 简单关键词分析示例
const keywords = ["project", "meeting", "idea"];
const tags = keywords.filter(keyword =>
note.body.toLowerCase().includes(keyword)
);
// 更新笔记标签
const updatedNote = NoteUtils.setTags(note, tags);
await engine.updateNote(updatedNote);
return updatedNote;
}
}
2. 注册命令
在扩展入口文件src/extension.ts中注册命令:
import { AutoTagCommand } from "./commands/autoTagCommand";
export function activate(context: vscode.ExtensionContext) {
// ...其他初始化代码
context.subscriptions.push(
vscode.commands.registerCommand(
AutoTagCommand.id,
() => new AutoTagCommand().execute()
)
);
}
3. 添加配置项
在package.json中添加可配置的关键词列表:
"contributes": {
"configuration": {
"title": "Dendron Auto Tag",
"properties": {
"dendronAutoTag.keywords": {
"type": "array",
"items": { "type": "string" },
"default": ["project", "meeting", "idea"],
"description": "Keywords to generate tags from"
}
}
}
}
测试与调试
Dendron提供完整的测试框架,支持单元测试和集成测试。
单元测试
使用Jest编写单元测试,测试文件放在src/__tests__目录:
import { AutoTagCommand } from "../commands/autoTagCommand";
describe("AutoTagCommand", () => {
test("basic functionality", async () => {
const mockEngine = { /* 模拟引擎 */ };
const cmd = new AutoTagCommand({
engine: mockEngine,
note: { body: "This is a project note" }
});
const result = await cmd.run();
expect(result.tags).toContain("project");
});
});
运行测试:
yarn test
集成测试
使用Dendron测试工具在真实工作区环境测试:
import { runEngineTestV5 } from "@dendronhq/common-test-utils";
describe("auto tag integration", () => {
test("with real note", async () => {
await runEngineTestV5(({ engine }) => {
// 测试代码
});
});
});
测试工具实现参考packages/common-test-utils/。
插件调试
配置VSCode调试启动项.vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Extension",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/packages/my-dendron-plugin"
]
}
]
}
按F5启动调试,VSCode会打开新窗口加载开发中的插件。
打包与发布
完成开发后,打包插件并发布到VSCode市场或Dendron社区。
打包插件
使用vsce工具打包:
# 安装vsce
npm install -g @vscode/vsce
# 打包
vsce package
打包配置在package.json中:
{
"scripts": {
"vscode:prepublish": "yarn run compile",
"compile": "tsc -p ./",
"package": "vsce package"
}
}
本地测试安装
生成.vsix文件后,在VSCode中手动安装测试:
code --install-extension my-dendron-plugin-0.0.1.vsix
发布到市场
遵循Dendron插件发布指南,提交到VSCode市场或Dendron社区仓库:
# 发布到VSCode市场
vsce publish
# 或发布到Open VSX市场
ovsx publish
发布流程详细说明见dev/dev.md中的发布工作流章节。
进阶开发方向
掌握基础插件开发后,可探索更高级的知识处理功能:
-
知识抽取:利用NLP技术从非结构化文本中提取实体和关系,实现智能标签和关联推荐。参考packages/dendron-design-system/src/中的UI组件,构建交互式知识抽取工具。
-
自动化工作流:结合Dendron的钩子系统,实现基于事件的自动化处理。例如,创建新会议笔记时自动关联参会人和项目标签。
-
知识可视化:使用Dendron Viz API构建自定义知识图谱视图,参考packages/dendron-viz/实现3D知识图谱展示。
-
外部系统集成:通过packages/pods-core/提供的Pod接口,实现与Notion、Roam等其他知识工具的数据同步。
官方开发者文档docs/README.md和贡献指南CONTRIBUTING.md提供更多高级开发资源和最佳实践。
希望本文能帮助你开启Dendron插件开发之旅!更多开发资源:
- 官方示例插件:packages/dendron-plugin-views/
- API文档:packages/common-server/src/api/
- 社区插件列表:test-workspace/vault/dendron.community.plugins.md
如果你开发了有用的插件,欢迎通过Dendron Discord社区分享,或提交PR到官方仓库。
本文档遵循Dendron文档规范,使用dendron.yml配置的发布设置生成。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



