由于不同的应用程序(如VS Code、Obsidian、思源笔记)有各自不同的插件系统,因此并没有一个真正统一的插件开发架构或框架。但是,可以总结出一些常见的模式和常用的编程语言。
一般开发插件的编程语言
插件开发的语言选择通常取决于宿主应用程序的实现语言和开放给插件的API形式:
JavaScript/TypeScript:这是目前最流行的插件开发语言,因为很多现代桌面应用程序是基于Electron(使用Node.js和Chromium)构建的,例如VS Code、Obsidian、思源笔记(前后端都可用JS/TS)。TypeScript由于提供了类型安全,在大型插件开发中更受欢迎。
Python:在一些科学计算或数据处理的应用程序中,插件可能使用Python编写,例如Blender(3D建模)、Sublime Text(编辑器)等。
Java:在一些Java开发的应用程序中,例如Eclipse、IntelliJ IDEA等IDE,插件通常使用Java(或基于JVM的语言)开发。
C++:在性能要求较高的应用程序中,如游戏引擎(Unreal Engine)、图像处理软件(Photoshop)等,插件可能使用C++开发。
Lua:在很多游戏(如World of Warcraft)或一些应用程序(如Neovim)中,插件使用轻量级的脚本语言Lua编写。
常见的插件架构模式
虽然不同应用程序的插件系统不同,但可以抽象出几种常见的架构模式:
1.基于API的插件架构(如VS Code)
宿主应用程序提供一组稳定的API,插件通过调用这些API与宿主交互。
插件通常只能通过这些API与宿主通信,不能直接访问内部对象,因此安全性较好。
示例:VS Code的扩展API。
2.基于事件/消息总线的插件架构(如思源笔记)
宿主应用程序提供一个事件系统或消息总线,插件可以订阅和发布消息。
插件之间以及插件与宿主之间通过消息进行通信,解耦性好。
示例:思源笔记通过postMessage在IFrame和内核之间通信。
3.基于宿主对象模型的插件架构(如Obsidian)
宿主应用程序将其内部对象暴露给插件,插件可以直接操作这些对象。
这种方式功能强大,但插件与宿主版本耦合较紧,且安全性较低。
示例:Obsidian的
app对象。
4.微内核架构(如Eclipse)
宿主应用程序有一个核心,所有功能都通过插件实现。插件之间通过扩展点(extension points)和扩展(extensions)进行交互。
这种架构非常灵活,但复杂度高。
跨平台插件开发框架
有一些框架或标准试图统一插件开发,但通常局限于某一类应用:
Web Extensions API:用于开发浏览器扩展(Chrome、Firefox等)。它提供了一套统一的API,但仅限于浏览器环境。
LSP(Language Server Protocol):虽然不完全是插件框架,但LSP允许开发者为任何支持LSP的编辑器/IDE提供语言智能(如代码补全、跳转定义等)。开发者只需编写一个语言服务器,就可以在多个编辑器中使用。
DAP(Debug Adapter Protocol):类似于LSP,用于调试器,可以在多个支持DAP的编辑器中使用。
一般建议
如果你想要开发插件,首先需要确定目标应用程序,然后学习其特定的插件开发文档。通常,应用程序会提供插件开发模板或脚手架工具,例如:
VS Code:可以使用
yo code生成器。Obsidian:有社区提供的模板。
思源笔记:提供了示例插件。
在开始之前,建议先阅读官方文档,了解其插件架构、API和生命周期。
概述
没有统一的插件开发框架,但大多数插件系统都会包含生命周期管理、API访问、事件处理等部分。编程语言的选择取决于宿主应用程序的支持。对于基于Electron的应用程序,JavaScript/TypeScript是最常见的选择。
下面进入详尽而更深入的阐述说明:
这是一个非常深入且重要的问题。让我从统一架构趋势、常用框架和编程语言选择三个层面来分析。
一、是否存在统一的插件架构?
短期来看:不存在完全统一的架构
长期趋势:正在向几个主流模式收敛
目前没有真正的"一次编写,到处运行"的插件架构,但有以下几个趋同方向:
1.Web技术栈的统一
大多数现代桌面应用基于 Electron 或类似的 Web 技术(VS Code、Obsidian、思源笔记、Figma、Slack 等)。它们的插件系统自然倾向于:
- JavaScript/TypeScript作为主要开发语言
- npm/yarn作为包管理工具
- Webpack/Vite作为构建工具
2.LSP/DAP 协议的统一(特定领域)
- LSP (Language Server Protocol):微软推出的编辑器语言功能协议
- DAP (Debug Adapter Protocol):调试器协议
这些协议实现了编辑器功能的统一插件架构。一个语言服务器或调试适配器可以在 VS Code、Vim、Emacs、IntelliJ 等多个编辑器中工作。
3.WASM 的潜在统一
WebAssembly (WASM) 正在成为跨平台插件开发的潜在标准:
- Lightning Web Runtime (LWR):Adobe 使用的 WASM 插件系统
- Extism:通用的 WASM 插件框架,支持多种宿主语言
- 优点:安全(沙盒化)、跨语言、高性能
二、常用的插件开发框架/工具链
虽然不是统一架构,但有一些模式化的工具链:
1.基于 TypeScript 的现代插件框架
// 许多框架都采用类似的"插件类"模式abstractclassPlugin{abstractonEnable():void;abstractonDisable():void;abstractconfig?:PluginConfig;}// 配置通常使用装饰器或配置文件@PluginMeta({name:"my-plugin",version:"1.0.0"})classMyPluginextendsPlugin{// ...}2.常见的开发工具链组合
通用工具链: TypeScript + Rollup/Webpack + Jest/Vitest + ESLint + Prettier3.特定领域的框架
- 编辑器插件框架:
- Langium:用于创建语言服务器和 DSL
- CodeMirror/ProseMirror:用于富文本编辑器插件
- 浏览器扩展框架:
- Plasmo:现代化的浏览器扩展框架
- WXT:下一代浏览器扩展框架
4.通用插件宿主框架
如果你要构建自己的应用并支持插件,可以考虑:
- Pluggy:Python 的插件系统框架
- PF4J:Java 的插件框架
- MEF:.NET 的托管扩展框架
- Extism:多语言的 WASM 插件框架
三、插件开发常用的编程语言
语言选择主要取决于宿主应用的技术栈:
1.JavaScript/TypeScript⭐️主流选择
- 优势:Web 生态最丰富,Electron 应用天然支持
- 使用场景:VS Code、Obsidian、Figma、JupyterLab、大多数现代桌面应用
- 典型技术栈:TS + React/Vue + Vite + TailwindCSS
2.Python🐍科学计算/数据领域
- 优势:数据科学生态完善,易于编写
- 使用场景:Blender、GIMP、QGIS、Jupyter、Sublime Text(部分)
- 典型模式:提供 Python API,插件作为 Python 模块
3.Java/Kotlin☕️企业级 IDE/应用
- 优势:强类型、JVM 生态
- 使用场景:IntelliJ IDEA、Eclipse、Android Studio、Jenkins
- 插件框架:PF4J、OSGi、Spring Plugin
4.C++/Rust⚡️高性能/系统级
- 优势:高性能、直接内存操作
- 使用场景:游戏引擎(Unreal、Godot)、图像处理(Photoshop)、数据库(PostgreSQL 扩展)
- 开发方式:动态库(.dll/.so/.dylib)或 WASM
5.Lua🌙游戏/轻量级嵌入
- 优势:轻量、易嵌入、热重载
- 使用场景:游戏(World of Warcraft、Roblox)、Neovim、Nginx、Wireshark
6.C#🪟微软生态
- 优势:.NET 生态,Windows 原生支持
- 使用场景:Unity、PowerShell、Windows 应用
四、现代插件开发的通用模式
尽管架构不同,但现代插件开发通常遵循以下模式:
1.声明式配置 + 命令式逻辑
// manifest.json / package.json / plugin.json{"name":"my-plugin","version":"1.0.0","entry":"./src/index.ts","capabilities":["filesystem","network"],"permissions":["read:files","write:files"]}2.生命周期钩子
interfacePluginLifecycle{initialize(config:PluginConfig):Promise<void>;activate(context:PluginContext):Promise<void>;deactivate():Promise<void>;// 可选的生命周期钩子onReady?():void;onError?(error:Error):void;}3.依赖注入/上下文提供
// 宿主通过上下文对象提供APIclassPluginContext{readonlyfs:FileSystemAPI;readonlyui:UIManager;readonlyevents:EventBus;readonlyconfig:Configuration;registerCommand(command:string,handler:Function):void;registerView(viewId:string,component:React.Component):void;}4.事件驱动架构
// 插件订阅和发布事件pluginContext.events.on('file.saved',(file)=>{// 处理文件保存事件});pluginContext.events.emit('plugin.custom-event',data);五、实践建议:如何选择和学习
1.根据目标平台选择技术栈
- 想开发VS Code 扩展→ 学习 TypeScript + VS Code API
- 想开发浏览器扩展→ 学习 JavaScript + Web Extension API
- 想开发游戏 MOD→ 学习 Lua 或 C#
- 想开发IDE 插件→ 学习 Java (IntelliJ) 或 TypeScript (VS Code)
2.通用的学习路径
基础知识(必须): 1. JavaScript/TypeScript 语言基础 2. Node.js 和 npm 生态 3. 异步编程(Promise/async-await) 进阶知识(推荐): 4. 设计模式(特别是观察者、策略、工厂模式) 5. 模块化开发(ES Modules) 6. 构建工具(Webpack/Vite)3.最佳实践参考项目
# VS Code 插件模板$gitclone https://github.com/microsoft/vscode-extension-samples# Obsidian 插件模板$gitclone https://github.com/obsidianmd/obsidian-sample-plugin# 浏览器扩展模板$gitclone https://github.com/GoogleChrome/chrome-extensions-samples六、未来趋势
- WASM 成为跨语言插件标准
- 更严格的权限和安全模型
- 声明式配置成为主流
- 云原生插件(远程执行)
结论
虽然没有统一的插件架构,但现代插件开发已经形成了几个清晰的模式:
如果你刚开始学习插件开发:
- 从JavaScript/TypeScript开始,这是适用范围最广的
- 选择VS Code 扩展作为起点,文档和生态最完善
- 理解生命周期管理和事件驱动这两个核心概念
- 掌握声明式配置 + 命令式逻辑的开发模式
如果你要设计自己的插件系统:
- 考虑使用WASM实现语言无关性
- 提供强类型的 API和良好的文档
- 实现沙盒化和权限控制
- 提供热重载和调试工具
插件开发的本质是扩展宿主应用的能力边界,理解宿主应用的核心架构比寻找统一框架更重要。每个成功的插件系统都是对其宿主应用架构的深刻理解和精心设计的结果。