插件列表功能需求分析
概述
本节围绕 Electron 桌面端应用的插件系统展开需求分析,重点讨论插件加载方式、下载方案以及插件列表的设计思路。插件列表是整个插件生态的入口,需要支持多种来源(Git 仓库、压缩包)并兼容 CommonJS 和 ES Module 两种模块规范。
插件模块加载方案
CommonJS 与 ES Module 兼容处理
自行开发的插件可以约定最终导出的文件格式。Webpack 和 Vite 生态默认支持同时导出两种规范,解决思路有三种:
| 方案 | 实现方式 | 适用场景 |
|---|---|---|
| 文件后缀判断 | 通过 .cjs / .mjs 后缀区分 | 规范明确的插件 |
| package.json 字段 | 读取 exports 或 module 字段选择加载方式 | 标准发布的 npm 包 |
| TypeScript 运行时 | 使用 tsx 或 tsm 直接加载 .ts 文件 | 开发调试阶段 |
// 通过 package.json 判断模块类型
import { readFileSync } from 'fs'
function loadModule(modulePath: string) {
const pkgPath = path.join(modulePath, 'package.json')
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))
if (pkg.type === 'module') {
// ES Module: 使用动态 import
return import(modulePath)
}
// CommonJS: 使用 require
return require(modulePath)
}
typescript
插件列表设计
数据源结构
插件列表的核心是一个可远程访问的 JSON 文件,记录所有可用插件的元信息:
{
"plugins": [
{
"name": "extension-1",
"version": "1.0.0",
"description": "示例插件",
"url": "https://github.com/user/extensions-1",
"type": "git"
},
{
"name": "extension-2",
"version": "2.0.0",
"description": "压缩包插件",
"url": "https://example.com/extensions-2.zip",
"type": "zip"
}
]
}
json
下载来源类型
| 来源类型 | 格式 | Node.js 处理方式 |
|---|---|---|
| Git 仓库 | https://github.com/user/repo | pacote / download-git-repo |
| ZIP 压缩包 | .zip | node-stream-zip / adm-zip |
| TAR.GZ 压缩包 | .tar.gz / .tgz | node-tar |
进程划分
┌─────────────────┐ IPC 通信 ┌─────────────────┐
│ 渲染进程 │ ────────────────> │ 主进程 │
│ │ │ │
│ - 请求插件列表 │ │ - 读取远程 JSON │
│ - 展示列表 UI │ │ - 下载插件 │
│ - 触发下载 │ │ - 解压安装 │
│ - 动态加载模块 │ │ - 文件系统操作 │
└─────────────────┘ <──────────────── └─────────────────┘
text
插件列表扩展思路
- 硬编码列表:类似 VS Code 的插件市场,服务端维护固定列表
- 用户自定义:允许用户手动添加插件源地址
- 插件市场:搭建独立的插件分发平台,支持搜索、评分、版本管理
关键决策点
- 列表存储位置:JSON 文件托管在 GitHub 仓库或静态服务器上
- 下载策略选择:ZIP 直接下载 vs Git 仓库克隆(后续章节详述两种方案的实现)
- 插件校验:下载后需验证插件完整性和安全性
- 插件隔离:通过隐藏目录(如
.extensions/)统一管理已安装插件
↑