Nodejs 插件化框架设计,学习 obsidian 插件但代码有疑惑,请指教

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

obsidian 本身是不开源的,但大多数插件开源,正在看它的思路,官网的 demo 是:

https://github.com/obsidianmd/obsidian-sample-plugin

这个 demo 只有一个源文件 main.ts:(主要是想知道 demo 怎么调用到 obsidian 内部的 loadData())

// main.ts
// 下面的 obsidian 通过 npm i obsidian 安装,
// 但是./node_modules/obsidian/的所有文件都是.d.ts 文件,没有任何函数实现

import { …, Plugin, … } from ‘obsidian’;

export default class MyPlugin extends Plugin { // demo 插件的主类 … async loadSettings() { // demo 里面没有 loadData()的实现,也就是它调用了父类 Plugin::loadData() this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } … }

父类 Plugin 代码在./node_modules/obsidian/obsidian.d.ts:

// obsidian.d.ts
export abstract class Plugin extends Component {
    ......
    loadData(): Promise<any>;
    ......
}

不管是 Plugin 还是 Component ,都没有 loadData 的实现,只有定义

loadData 应该是在 Obsidian 里面实现的,那么 MyPlugin 是怎么调用到 Obsidian 里面的 loadaData 函数呢?

希望大佬不吝赐教,万分感谢。


Nodejs 插件化框架设计,学习 obsidian 插件但代码有疑惑,请指教

17 回复

图片版本来了:

图 1:
![]( )
图 2:
![]( )


obsidian.d.ts只是 ts 版本的类型定义而已,不是具体的实现。

打个断点,跟进去

也可以看看 vs code 插件思路

hello Kitty 现在技术这么强?之前还像萌新来着

一直都很菜。。。

obsidian 禁了–inspect ,没法断点。哎

这无疑是最佳方案,奈何能力不足,没信心看 vscode

是的,插件继承的是obsidian.d.ts的类型定义,但是它怎么调用到 obsidian 的实现呢

看看那使用这个类 感觉是一个抽象基类

我记得 ob 的插件是运行在渲染进程的,所以你可以在界面上打开开发者工具,然后进行调试

无责任猜测:
它把源码的实现藏起来了,只给你定义。然后运行的时候通过扩展原型链来让插件可以访问到 loadData 方法,比如:
Object.assign(MyPlugin, {
loadData() {…}
})

Object.assign(MyPlugin.prototype, {
loadData() {…}
})

这个可能性非常大,我自己的先按这样做了。谢谢啦

不需要看代码啊,看他的 extension 的开发文档也是可以的

在Node.js中实现插件化框架设计,可以参考Obsidian的插件机制,其核心在于模块化、事件驱动和插件的生命周期管理。以下是一个简化的示例,用于展示如何设计一个基本的插件化框架。

首先,确保你的项目结构如下:

/my-plugin-framework
  /plugins
    example-plugin.js
  app.js

app.js 是你的主应用文件,负责加载和初始化插件:

const fs = require('fs');
const path = require('path');

const pluginsDir = path.join(__dirname, 'plugins');
fs.readdirSync(pluginsDir).forEach(file => {
  const plugin = require(path.join(pluginsDir, file));
  if (plugin.init) {
    plugin.init();
  }
});

// 示例事件系统
const EventEmitter = require('events');
class MyApp extends EventEmitter {}
const app = new MyApp();

app.on('event', (data) => {
  console.log('Event received:', data);
});

// 插件可以触发事件
// 在 example-plugin.js 中

example-plugin.js 是一个示例插件:

module.exports = {
  init: function() {
    console.log('Plugin initialized');
    const app = require('../app');
    app.emit('event', { message: 'Hello from plugin' });
  }
};

运行 node app.js,你应该会看到插件被加载并触发了一个事件。这个示例展示了如何加载插件和简单的事件系统。对于更复杂的需求,可以引入依赖注入、插件配置管理等高级功能。希望这能帮助你理解Node.js插件化框架的设计。

回到顶部