
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 函数呢?
希望大佬不吝赐教,万分感谢。
1 datadump OP |
2 suyi2015 2024-10-20 21:30:59 +08:00 `obsidian.d.ts`只是 ts 版本的类型定义而已,不是具体的实现。 |
3 Belmode 2024-10-21 01:18:48 +08:00 via Android 打个断点,跟进去 |
4 lee88688 2024-10-21 07:45:37 +08:00 也可以看看 vs code 插件思路 |
5 crocoBaby 2024-10-21 08:38:48 +08:00 hello Kitty 现在技术这么强?之前还像萌新来着 |
9 datadump OP @suyi2015 是的,插件继承的是`obsidian.d.ts`的类型定义,但是它怎么调用到 obsidian 的实现呢 |
10 mtjgu 2024-10-21 09:34:00 +08:00 看看那使用这个类 感觉是一个抽象基类 |
11 LuckyLauncher 2024-10-21 09:50:38 +08:00 我记得 ob 的插件是运行在渲染进程的,所以你可以在界面上打开开发者工具,然后进行调试 |
12 EchoWhale 2024-10-21 09:59:22 +08:00 via iPhone 无责任猜测: 它把源码的实现藏起来了,只给你定义。然后运行的时候通过扩展原型链来让插件可以访问到 loadData 方法,比如: Object.assign(MyPlugin, { loadData() {…} }) |
13 EchoWhale 2024-10-21 10:00:41 +08:00 via iPhone Object.assign(MyPlugin.prototype, { loadData() {…} }) |
14 datadump OP @mtjgu @LuckyLauncher 谢谢 |