Nodejs 插件化框架设计,学习 obsidian 插件但代码有疑惑,请指教
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 插件但代码有疑惑,请指教
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插件化框架的设计。