插件体系
插件体系
特点
插件体系较于之前提到的几种多文件、多项目、多库、多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 的插件系统就是一个进程外、间接调用、沙箱插件系统。
软件调研
有没有这样的工具(最好开源):像一个工具箱,本身没有什么功能,但有完善的接口体系,允许各种形式开发的插件,并主要依赖插件完成各种功能
很多这样的开源工具,它们通常被称为插件化的框架或者插件化的应用。它们本身可能只提供一个基本的结构或者接口,然后允许开发者通过编写插件来扩展其功能。以下是一些例子:
- VSCode(Visual Studio Code):VSCode 是一个轻量级但功能强大的源代码编辑器,它支持各种编程语言和工具,并且提供了一个完善的插件系统。开发者可以编写插件来扩展 VSCode 的功能。
- Eclipse:Eclipse 是一个开源的、基于插件的软件开发环境。它最初是为 Java 开发的,但现在已经通过各种插件支持了许多其他的编程语何和工具。
- WordPress:WordPress 是一个开源的内容管理系统(CMS),它提供了一个插件系统,允许开发者编写插件来扩展其功能。
- Jenkins:Jenkins 是一个开源的持续集成和持续部署工具,它提供了一个插件系统,允许开发者编写插件来扩展其功能。
- Home Assistant:这是一个开源的家庭自动化平台,它支持各种设备和服务,并且提供了一个插件系统,允许开发者编写插件来扩展其功能。
以上这些工具都提供了丰富的 API 和接口,使得开发者可以根据自己的需求编写插件。同时,由于这些工具都是开源的,开发者可以查看其源代码,了解其内部结构和工作原理,这对于编写插件非常有帮助。
但本地都比较大,我想要更小巧一些的。像utools、quicker这种,但最好能开源,且支持多形式的插件开发
有没有类似是uTools或quicker的支持插件的开源软件
- 我只要开源的,并且是软件本体开源而非只是接口和插件开源。请贴出开源地址
- 必须支持插件开发
根据你的要求,我找到了几款开源的、支持插件开发的软件:
- Albert:Albert 是一个类似 Spotlight 的快速启动器,支持插件开发,可以实现很多自定义的功能。Albert 是开源的,你可以在其 GitHub 页面查看源代码和文档:https://github.com/albertlauncher/albert
- Keypirinha:Keypirinha 是一个快速启动器,它允许你通过键入关键字快速找到和启动你的应用程序、文档、网址等。Keypirinha 支持插件开发,你可以在其官方网站下载并查看文档:http://keypirinha.com/ 。但是需要注意的是,Keypirinha 的核心不是开源的,但是它的插件是开源的,你可以在其 GitHub 页面查看:https://github.com/Keypirinha/Keypirinha
- Wox:Wox 是一个强大的启动和搜索工具,帮助你快速找到你的应用程序和文件,它支持插件开发,你可以在其 GitHub 页面查看源代码和文档:https://github.com/Wox-launcher/Wox
- 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)