V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wjx0912
V2EX  ›  Node.js

在设计一个 node 的插件化框架,学习 obsidian 插件但是有一些代码没看懂,请指教

  •  
  •   wjx0912 · 35 天前 · 1366 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 函数呢?

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

    16 条回复    2024-10-22 22:14:45 +08:00
    wjx0912
        1
    wjx0912  
    OP
       35 天前
    图片版本来了:

    图 1:
    ![]( )
    图 2:
    ![]( )
    suyi2015
        2
    suyi2015  
       35 天前
    `obsidian.d.ts`只是 ts 版本的类型定义而已,不是具体的实现。
    Belmode
        3
    Belmode  
       35 天前 via Android
    打个断点,跟进去
    lee88688
        4
    lee88688  
       35 天前
    也可以看看 vs code 插件思路
    crocoBaby
        5
    crocoBaby  
       35 天前
    hello Kitty 现在技术这么强?之前还像萌新来着
    wjx0912
        6
    wjx0912  
    OP
       35 天前
    @crocoBaby 一直都很菜。。。
    wjx0912
        7
    wjx0912  
    OP
       35 天前
    @Belmode obsidian 禁了--inspect ,没法断点。哎
    wjx0912
        8
    wjx0912  
    OP
       35 天前
    @lee88688 这无疑是最佳方案,奈何能力不足,没信心看 vscode
    wjx0912
        9
    wjx0912  
    OP
       35 天前
    @suyi2015 是的,插件继承的是`obsidian.d.ts`的类型定义,但是它怎么调用到 obsidian 的实现呢
    mtjgu
        10
    mtjgu  
       35 天前
    看看那使用这个类 感觉是一个抽象基类
    LuckyLauncher
        11
    LuckyLauncher  
       35 天前
    我记得 ob 的插件是运行在渲染进程的,所以你可以在界面上打开开发者工具,然后进行调试
    EchoWhale
        12
    EchoWhale  
       35 天前 via iPhone
    无责任猜测:
    它把源码的实现藏起来了,只给你定义。然后运行的时候通过扩展原型链来让插件可以访问到 loadData 方法,比如:
    Object.assign(MyPlugin, {
    loadData() {…}
    })
    EchoWhale
        13
    EchoWhale  
       35 天前 via iPhone
    Object.assign(MyPlugin.prototype, {
    loadData() {…}
    })
    wjx0912
        14
    wjx0912  
    OP
       35 天前
    wjx0912
        15
    wjx0912  
    OP
       35 天前
    @EchoWhale 这个可能性非常大,我自己的先按这样做了。谢谢啦
    lee88688
        16
    lee88688  
       33 天前
    @wjx0912 不需要看代码啊,看他的 extension 的开发文档也是可以的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5622 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:08 · PVG 15:08 · LAX 23:08 · JFK 02:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.