四种插件类型怎么选
Eagle 有四种插件类型。它们的差异不在技术难度,而在运行时机、触发方式和能用什么 API。选错类型会导致后面大量返工——比如你给一个需要后台常驻的功能写成了窗口插件,用户不点它它就永远不工作。
四种类型速览
| 类型 | manifest 关键字段 | 何时运行 | 支持 Eagle API | 支持 F12 |
|---|---|---|---|---|
| 窗口插件 | main |
用户点击时 | 是 | 是 |
| 背景服务插件 | main + serviceMode: true |
软件启动时自动 | 是 | 是 |
| 格式扩展插件 | preview |
导入/预览该格式文件时 | 否 | 部分 |
| 检查器插件 | preview 里嵌套 inspector |
用户选中该格式文件时 | 是 | 是(右键开发者工具) |
怎么选:一个决策问题
问自己一个问题:这个功能需要「用户主动触发」还是「持续生效」?
需要用户主动触发、做完就结束 → 窗口插件。一键抠图、批量重命名、转格式、导出导入都属于这一类。官方文档说得很直接:绝大部分插件都应该用这种方式开发。默认选它,不会错。
需要在软件启动后一直生效 → 背景服务插件。后台同步、缩略图批量分析、定时检查更新属于这一类。它和窗口插件的开发方式几乎一样,唯一的差别是一个字段。
需要让 Eagle「能打开一种新文件」→ 格式扩展插件。注意它的能力边界最窄:官方文档明确写了目前格式扩展插件不支持 Eagle Plugin API 和 DevTools 调试功能。你的代码被扔进一个几乎裸奔的沙箱,只能用 Node 原生 API 解析文件、生成缩略图。
需要「选中某类文件时,右侧多出一块信息」→ 检查器插件。给 JPG 显示 EXIF、给音频显示波形、给设计稿显示尺寸和色板都属于这一类。检查器插件本质上是格式扩展插件的变体,定义方式非常像,但它能拿到 Eagle API。
三个决策要点
第一,格式扩展插件的能力限制要提前评估。 它拿不到 eagle.item,也就无法读取素材的其他元数据。如果你的缩略图生成逻辑需要「读取这个文件的标签来决定用什么风格渲染」,那这条路走不通,只能改做检查器插件。
第二,检查器插件需要 Eagle 4.0 Beta 17 以上版本。 这是硬性门槛,虽然现在早已满足,但如果你要给企业客户做兼容性说明,得提一句。
第三,背景服务插件必须处理资源库切换。 因为它随应用启动,如果用户中途切换了资源库,缓存里的路径就失效了。官方明确建议:需要依赖相对资源库路径时,透过 eagle.onLibraryChanged 做出对应调整。
四类插件的配置对照
四种类型在 manifest.json 里的写法完全不同,一眼就能分辨:
// 窗口插件
{
"id": "LBCZE8V6LPCKD",
"version": "1.0.0",
"name": "窗口插件",
"logo": "/logo.png",
"keywords": [],
"main": {
"url": "index.html",
"width": 640,
"height": 480
}
}
// 背景服务插件:唯一差别是 serviceMode
{
"id": "LBCZEHP8BBO94",
"version": "1.0.0",
"name": "Service Plugin",
"logo": "/logo.png",
"keywords": [],
"main": {
"serviceMode": true,
"url": "index.html",
"width": 640,
"height": 480
}
}
// 格式扩展插件:不写 main,写 preview
{
"id": "LARSKLB8OTOC2",
"version": "1.0.0",
"platform": "all",
"arch": "all",
"name": "Preview Plugin",
"logo": "/logo.png",
"keywords": ["icns"],
"devTools": false,
"preview": {
"icns,ico": {
"thumbnail": {
"path": "thumbnail/icns.js",
"size": 400,
"allowZoom": false
},
"viewer": {
"path": "viewer/icns.html"
}
}
}
}
// 检查器插件:preview 里只嵌套 inspector
{
"id": "cc41e899-5fc3-445c-a113-2d9573d6edcc",
"version": "1.0.0",
"platform": "all",
"arch": "all",
"name": "Inspector Plugin",
"logo": "/logo.png",
"keywords": [],
"devTools": true,
"preview": {
"jpg,png": {
"inspector": {
"path": "index.html",
"height": 100,
"multiSelect": false
}
}
}
}
对比这四段能发现一个规律:能拿到 Eagle API 的类型(窗口、背景服务、检查器)都在 HTML 页面里跑代码,用 eagle.onPluginCreate 启动;拿不到的类型(格式扩展)在独立的 js 与 html 文件里跑,通过回调参数接收数据。
格式扩展插件的回调契约
格式扩展插件的缩略图脚本导出一个 async 函数,参数由 Eagle 传入:
// thumbnail/icns.js
const fs = require('fs');
module.exports = async ({ src, dest, item }) => {
return new Promise(async (resolve, reject) => {
try {
// 1. 解析源文件,把缩略图写到 dest
// 2. 校验结果是否正确
if (!fs.existsSync(dest)) {
return reject(new Error(`icns file thumbnail generate fail.`));
}
// 3. 顺带回写尺寸信息
item.height = 512;
item.width = 512;
// 4. resolve(item) 表示成功
return resolve(item);
}
catch (err) {
return reject(err);
}
});
};
src 是源文件路径,dest 是缩略图输出路径,item 是对应素材对象——你可以在生成过程中顺手修正它的 width 与 height,然后 resolve(item) 把修正结果带回去。reject 会让 Eagle 记录失败原因,这也是格式扩展插件唯一的错误反馈渠道(因为它不支持日志 API)。
快速验证清单
- 你的功能是一次性操作吗?是 → 窗口插件。
- 需要开机自动运行吗?是 → 背景服务插件。
- 目标是让 Eagle 支持新文件格式吗?是 → 格式扩展插件,并确认不依赖
eagle.*API。 - 目标是选中文件后展示额外信息吗?是 → 检查器插件。
- 如果同时符合多个条件,选限制更少的那一类:窗口插件能力最全,放不下才考虑下沉到背景服务。
- 拿不准就先做窗口插件。窗口插件随时可以加
serviceMode变成背景服务,反过来却不行。
混用的可能性
四类不是互斥的。一个项目完全可以同时提交窗口插件和检查器插件:窗口插件负责复杂配置界面,检查器插件负责日常快速查看。Eagle 插件中心的每个条目独立安装独立审核,你也可以先发布窗口插件验证需求,再补检查器版本。
常见坑
为了「功能更持续」把窗口插件改成
serviceMode: true。 这会让插件在每次启动 Eagle 时都自动运行,占用内存、拖慢启动,而用户可能根本不需要它。只有真正需要后台常驻的功能才开这个开关。在格式扩展插件里调用
eagle.item.getSelected()。 会在运行时直接报错。这类插件只能通过回调参数拿到src、dest、item这些信息,且不能调用 Eagle API。设计之初就要把逻辑和数据来源想清楚。延伸注意: * 检查器插件设
multiSelect: true。 官方建议非特殊情况一律false。多选时语义往往不明确,性能压力也大。整理人:WorkBuddy
