跳至主要內容

插件体系

LincZero大约 12 分钟

插件体系

特点

插件体系较于之前提到的几种多文件、多项目、多库、多exe相比,可以在不改动主程序的基础上进行扩展

简单调研 (GPT调研)

插件调研

程序制作插件系统的几种思路与方法,大致分为几类 (可以使用不同的分类方式)

在介绍方法的同时,需要给出例子。例如需要说明这些插件系统是属于哪种方法:

  • Web类
    • 浏览器的扩展或插件
    • 浏览器的脚本(借助油猴或篡改猴)
    • uTools/Quicker软件的插件
    • WordPress插件
  • 大型软件类
    • QT的插件系统
    • VSCode插件
    • IDEA插件
    • Maya插件
    • Blender插件
  • 其他小软件
    • RIME的Lua插件
    • 聊天机器人插件 (支持易语言、C#开发的SDK版)
    • 聊天机器人插件 (Http/Websocket版)
  • 等等 (欢迎补充)

需要以这种格式回答:

  • 方法
    • 特点
    • 优点
    • 缺点
    • 举例

插件系统的设计和实现方式可以根据其结构、通信方式、编程语言、运行环境等因素进行分类。以下是一些基本的方法:

  • 动态链接库(DLL)插件

    • 特点
      • 这种类型的插件是编译成动态链接库,如 DLL(Windows)、SO(Linux)或者 dylib(macOS)文件。主程序在运行时动态加载和链接这些库文件,调用其中的函数或者方法
    • 优点
      • 性能高,因为插件代码直接运行在主程序的进程空间内。可以使用任何与主程序相同的编程语言编写插件
    • 缺点
      • 插件的编译环境需要与主程序相匹配,跨平台可能存在问题
      • 插件的错误可能导致整个主程序崩溃
    • 举例
      • 有的会提供SDK辅助插件开发者开发插件 (SDK不一定生成dll,也可能生成脚本等,不一定属于该方式)
      • Qt 的插件系统:Qt提供了一套插件框架,通过定义纯虚函数的接口类,插件开发者可以实现这些接口并将插件注册到Qt应用程序中
      • VSCode的插件系统 (DLL混合Web)
      • 聊天机器人插件 (SDK版)
      • ?Eclipse的插件系统:Eclipse定义了一组扩展点,开发者可以编写插件来实现这些扩展点,从而添加新的功能或修改现有功能
  • 脚本语言插件

    • 特点
      • 这种类型的插件使用脚本语言编写,如 JavaScript、Python、Lua 等。主程序内嵌一个脚本语言解释器,用于执行插件代码。
    • 优点
      • 插件编写简单,易于跨平台
      • 插件的错误通常不会导致主程序崩溃
    • 缺点
      • 性能可能低于动态链接库插件,因为需要通过解释器执行插件代码。可能需要为插件提供特定的API以访问主程序的功能。
    • 举例
      • 通常是 Python 解释器或 Lua 解释器
      • RIME的Lua插件
      • 浏览器的脚本(借助油猴或篡改猴)
  • Web 技术插件

    • 特点
      • 这种类型的插件使用 Web 技术(HTML、CSS、JavaScript)编写,主程序提供一个内嵌的 Web 视图(如 Electron 或 WebView)来加载和运行插件
    • 优点
      • 插件编写简单,易于跨平台
      • 可以利用丰富的 Web 技术生态系统。
      • 插件的错误通常不会导致主程序崩溃
    • 缺点
      • 性能可能低于动态链接库插件。可能需要为插件提供特定的API以访问主程序的功能
    • 举例
      • 浏览器的扩展或插件
      • VSCode的插件系统 (DLL混合Web)
      • uTools/Quicker软件的插件
      • Obsidian插件
      • WordPress的插件系统:WordPress定义了一组事件,插件可以注册对这些事件的监听器,例如在文章发布时执行某些逻辑
  • HTTP/WebSocket 插件

    • 特点
      • 这种类型的插件通过 HTTP 或 WebSocket 与主程序进行通信。插件可以是一个独立的进程,也可以是一个远程的服务
    • 优点
      • 插件可以用任何能够进行网络通信的编程语言编写。可以实现分布式的插件系统
      • 插件的错误不会影响主程序
    • 缺点
      • 性能可能低于动态链接库插件,因为需要进行网络通信。需要设计通信协议和API
    • 举例
      • 聊天机器人插件 (http/webSocket版)
  • 语言特性插件

    • 特点

      • 这种类型的插件利用编程语言的特性(如 Java 的接口、C# 的抽象类)来定义插件的接口。插件以类库的形式提供,实现这些接口

      有点像dll方式,dll也需要实现接口,但dll更多的是通过函数接口而非类接口

    • 优点

      • 插件编写简单,只需要按照接口实现功能即可
    • 缺点

      • 插件必须使用与主程序相同的编程语言编写。插件的错误
      • 插件的错误可能会导致主程序崩溃,这取决于主程序如何处理插件抛出的异常
    • 举例

      • IDEA的插件系统 (Java)

其他分类方法


  • 插件系统基于接口/扩展点/抽象类

  • 插件系统基于事件/消息机制

  • 脚本引擎/解释器

  • 进程内插件 vs 进程外插件

    • 进程内插件:是在主程序的进程空间内运行,例如动态链接库插件和脚本语言插件。这种类型的插件性能较高,但可能会影响主程序的稳定性。
    • 进程外插件:在一个独立的进程中运行,例如 HTTP/WebSocket 插件和某些脚本语言插件。这种类型的插件性能可能较低,但不会影响主程序的稳定性。
  • 直接调用插件 vs 间接调用插件

    • 直接调用插件:是指主程序直接调用插件的函数或方法
      • 特点:这种类型的插件性能较高,但插件的错误可能会导致主程序崩溃
      • 例如:动态链接库插件和语言特性插件
    • 间接调用插件:是指主程序通过某种间接的方式调用插件
      • 特点:这种类型的插件性能可能较低,但插件的错误通常不会影响主程序
      • 例如:通过网络通信或者消息队列
  • 沙箱插件 vs 非沙箱插件

    • 沙箱插件:是指插件在一个受限的环境中运行
      • 特点:这种类型的插件更安全,因为插件不能随意访问系统资源,但可能会限制插件的功能
      • 例如:浏览器扩展和某些脚本语言插件
    • 非沙箱插件:是指插件可以自由访问系统资源
      • 特点:这种类型的插件功能强大,但可能存在安全风险
      • 例如:动态链接库插件和某些脚本语言插件

以上只是一些基本的分类方法,实际的插件系统可能会根据需要选择不同的设计和实现方式。例如,VSCode 的插件系统就是一个进程外、间接调用、沙箱插件系统。

软件调研

有没有这样的工具(最好开源):像一个工具箱,本身没有什么功能,但有完善的接口体系,允许各种形式开发的插件,并主要依赖插件完成各种功能


很多这样的开源工具,它们通常被称为插件化的框架或者插件化的应用。它们本身可能只提供一个基本的结构或者接口,然后允许开发者通过编写插件来扩展其功能。以下是一些例子:

  1. VSCode(Visual Studio Code):VSCode 是一个轻量级但功能强大的源代码编辑器,它支持各种编程语言和工具,并且提供了一个完善的插件系统。开发者可以编写插件来扩展 VSCode 的功能。
  2. Eclipse:Eclipse 是一个开源的、基于插件的软件开发环境。它最初是为 Java 开发的,但现在已经通过各种插件支持了许多其他的编程语何和工具。
  3. WordPress:WordPress 是一个开源的内容管理系统(CMS),它提供了一个插件系统,允许开发者编写插件来扩展其功能。
  4. Jenkins:Jenkins 是一个开源的持续集成和持续部署工具,它提供了一个插件系统,允许开发者编写插件来扩展其功能。
  5. Home Assistant:这是一个开源的家庭自动化平台,它支持各种设备和服务,并且提供了一个插件系统,允许开发者编写插件来扩展其功能。

以上这些工具都提供了丰富的 API 和接口,使得开发者可以根据自己的需求编写插件。同时,由于这些工具都是开源的,开发者可以查看其源代码,了解其内部结构和工作原理,这对于编写插件非常有帮助。


但本地都比较大,我想要更小巧一些的。像utools、quicker这种,但最好能开源,且支持多形式的插件开发


有没有类似是uTools或quicker的支持插件的开源软件

  1. 我只要开源的,并且是软件本体开源而非只是接口和插件开源。请贴出开源地址
  2. 必须支持插件开发

根据你的要求,我找到了几款开源的、支持插件开发的软件:

  1. Albert:Albert 是一个类似 Spotlight 的快速启动器,支持插件开发,可以实现很多自定义的功能。Albert 是开源的,你可以在其 GitHub 页面查看源代码和文档:https://github.com/albertlauncher/albert
  2. Keypirinha:Keypirinha 是一个快速启动器,它允许你通过键入关键字快速找到和启动你的应用程序、文档、网址等。Keypirinha 支持插件开发,你可以在其官方网站下载并查看文档:http://keypirinha.com/ 。但是需要注意的是,Keypirinha 的核心不是开源的,但是它的插件是开源的,你可以在其 GitHub 页面查看:https://github.com/Keypirinha/Keypirinha
  3. Wox:Wox 是一个强大的启动和搜索工具,帮助你快速找到你的应用程序和文件,它支持插件开发,你可以在其 GitHub 页面查看源代码和文档:https://github.com/Wox-launcher/Wox
  4. Launchy:Launchy 是一个免费的跨平台的应用程序启动器,它的目标是让你能够快速启动你的应用程序。Launchy 支持插件开发,你可以在其 GitHub 页面查看源代码和文档:https://github.com/Launchy/Launchy

请注意,虽然这些软件都支持插件开发,但他们的插件开发环境和语言可能会有所不同,你可能需要花一些时间来熟悉他们的开发环境和语言。

实现

介绍这些插件系统的主要原理:

  • Web类
    • 浏览器的扩展或插件
    • 浏览器的脚本(借助油猴或篡改猴)
    • uTools/Quicker软件的插件
    • WordPress插件
  • 大型软件类
    • QT的插件系统
    • VSCode插件
    • IDEA插件
    • Maya插件
    • Blender插件
  • 其他小软件
    • RIME的Lua插件
    • 聊天机器人插件 (支持易语言、C#开发的SDK版)
    • 聊天机器人插件 (Http/Websocket版)

插件系统是一种软件设计模式,它允许用户为一个应用程序添加新的功能或修改现有功能,而无需修改应用程序本身的源代码。以下是您提到的各种类型插件系统的基本原理:

  • Web类

    • 浏览器的扩展或插件:这些插件是一种特殊的Web应用程序,可以使用HTML、CSS和JavaScript等Web技术来编写。它们可以直接访问和修改浏览器的UI和web内容。例如,Chrome浏览器插件使用一个名为manifest.json的文件来声明其结构和行为。

    • 浏览器的脚本:这些通常是通过油猴或篡改猴等用户脚本管理器来运行的JavaScript脚本。它们可以修改网页的行为和外观。

    • uTools/Quicker软件的插件:这些插件通常是使用JavaScript或其他语言编写的,可以增加软件的功能。例如,uTools支持使用Node.js来开发插件。

    • WordPress插件:WordPress插件主要使用PHP编写,并且可以使用WordPress的钩子系统(Hook System)来修改或添加功能。它们可以通过WordPress的插件API进行安装和管理。

  • 大型软件类

    • QT的插件系统:QT使用C++编写,其插件系统允许开发者使用C++扩展QT的功能。QT插件是一个动态链接库(DLL),可以在运行时被QT应用程序加载。

    • VSCode插件:VSCode插件主要使用JavaScript或TypeScript编写,并且可以使用VSCode的扩展API来访问和修改VSCode的行为和UI。

    • IDEA插件:IDEA插件主要使用Java编写,并且可以使用IDEA的插件API来访问和修改IDEA的行为和UI。

    • Maya插件:Maya插件主要使用C++或Python编写,并且可以使用Maya的API来访问和修改Maya的行为和UI。

    • Blender插件:Blender插件主要使用Python编写,并且可以使用Blender的Python API来访问和修改Blender的行为和UI。

  • 其他小软件

    • RIME的Lua插件:RIME是一个输入法框架,其Lua插件可以使用Lua语言来编写,可以访问和修改RIME的行为。

    • 聊天机器人插件 (支持易语言、C#开发的SDK版):这些插件通常是使用易语言或C#编写的,可以通过聊天机器人的SDK来访问和修改聊天机器人的行为。

    • 聊天机器人插件 (Http/Websocket版):这些插件通常是使用任何可以进行HTTP或Websocket通信的语言来编写的。它们可以通过HTTP或Websocket接口来接收和发送消息,从而控制聊天机器人的行为。

以上都是一些基本的原理,具体的实现可能会因为不同的应用程序和插件系统而有所不同。

实例

要求基础:多语言互相调用

插件系统的分类很多:

  • 语言分类
    • 同语言调用
    • 跨语言调用 (这里可以参考一下我另外的多语言调用笔记,包括:Tools/知识层/多语言,网络接口通信/RPC JSON标准等,以及 Project/Type/DLL)