30分钟上手electerm插件开发:从API到实战的零门槛指南
你还在为重复执行SSH命令而烦恼?想一键同步服务器文件却找不到合适工具?本文将带你从零开始开发electerm插件,通过5个实用案例掌握核心API,让终端操作效率提升10倍。读完你将获得:完整的插件开发流程、5个高频场景代码模板、调试与发布最佳实践。
核心API概览
electerm插件系统基于Electron的进程间通信(IPC)机制构建,主要通过主进程与渲染进程的交互实现功能扩展。核心模块集中在src/app/lib目录,提供了状态管理、配置读写、窗口控制等基础能力。
进程通信基础
IPC(Inter-Process Communication)是插件开发的基石,主进程通过src/app/lib/ipc.js暴露异步接口:
// 注册异步API示例
ipcMain.handle('async', (event, { name, args }) => {
return asyncGlobalsname
})
// 插件中调用方式
const result = await window.api.invoke('async', {
name: 'AIchat',
args: ['列出当前目录文件']
})
常用通信方式分为同步(sync-func)和异步(async)两种,同步接口适合简单配置读取,异步接口用于耗时操作如文件传输、远程命令执行。
全局状态管理
GlobalState类提供应用级状态管理,插件可通过它读写全局配置:
// 获取当前窗口大小
const windowSize = globalState.get('windowSize')
// 更新配置
globalState.set('pluginConfig', {
autoSync: true,
timeout: 3000
})
该模块采用单例模式实现,确保状态在整个应用生命周期中保持一致,常用于存储插件偏好设置和运行时数据。
实战开发:5个高频场景
1. AI命令助手集成
利用AIchat API可快速实现智能命令建议功能。以下代码演示如何在终端中集成命令自动补全:
// 插件中调用AI能力
async function getCommandSuggestions(prompt) {
const response = await window.api.invoke('async', {
name: 'AIchat',
args: [
`give me max 5 command suggestions for: ${prompt}`,
'gpt-3.5-turbo', // 模型名称
'You are a CLI expert' // 角色定义
]
})
if (response.error) {
showError(response.error)
return []
}
return response.response.split('\n').filter(cmd => cmd.trim())
}
流式响应功能适合实现打字机效果,通过sessionId跟踪对话状态:
// 流式获取AI响应
const { sessionId } = await window.api.invoke('async', {
name: 'AIchat',
args: ['解释这个错误: ECONNREFUSED', 'gpt-4', '', true]
})
// 轮询获取最新内容
const interval = setInterval(async () => {
const { content, hasMore } = await window.api.invoke('async', {
name: 'getStreamContent',
args: [sessionId]
})
updateUI(content)
if (!hasMore) {
clearInterval(interval)
}
}, 100)
2. 快捷键自定义
通过shortcut.js模块注册自定义快捷键,实现快速操作:
// 注册插件专属快捷键
function registerPluginShortcuts() {
const config = {
'plugin.syncFiles': 'CmdOrCtrl+Shift+S',
'plugin.quickDeploy': 'CmdOrCtrl+D'
}
window.api.invoke('async', {
name: 'changeHotkey',
args: [config]
})
}
需要在插件卸载时清理快捷键,避免冲突:
// 插件卸载时调用
function cleanupShortcuts() {
window.api.invoke('async', {
name: 'changeHotkey',
args: [{}, true] // 第二个参数为清除标志
})
}
3. 配置持久化存储
用户配置可通过user-config-controller.js持久化:
// 保存插件配置
async function savePluginConfig(config) {
return window.api.invoke('async', {
name: 'saveUserConfig',
args: ['plugin.myPlugin', config]
})
}
// 读取配置
async function loadPluginConfig() {
const config = await window.api.invoke('async', {
name: 'getConfig',
args: ['plugin.myPlugin']
})
return config || { enabled: true, theme: 'dark' }
}
配置数据存储在应用数据库中,支持复杂JSON结构,适合保存连接信息、界面偏好等用户数据。
4. 窗口控制扩展
窗口操作API允许插件创建自定义界面元素,如悬浮工具栏、快捷面板:
// 创建浮动面板
async function createFloatingPanel() {
const { width, height } = await window.api.invoke('async', {
name: 'getScreenSize'
})
return window.api.invoke('async', {
name: 'createWindow',
args: [{
width: 300,
height: 400,
x: width - 320,
y: 50,
frame: false,
alwaysOnTop: true,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
}]
})
}
5. 远程命令执行
通过SSH会话API实现批量命令执行,需结合session-ssh.js模块:
// 执行远程命令
async function executeRemoteCommand(sessionId, command) {
return window.api.invoke('async', {
name: 'sessionCommand',
args: [sessionId, command]
})
}
// 示例:批量执行命令
async function batchExecute(commands) {
const activeSessions = await window.api.invoke('async', {
name: 'getActiveSessions'
})
return Promise.all(activeSessions.map(session =>
executeRemoteCommand(session.id, commands)
))
}
插件调试与测试
开发插件时可利用Electron的开发者工具进行调试,通过以下API打开:
// 打开开发者工具
window.api.invoke('async', {
name: 'openDevTools'
})
推荐使用test/e2e目录下的测试框架编写插件测试用例,参考现有测试文件如005.basic-ssh.spec.js的结构。
发布与分发
electerm插件采用文件夹形式分发,标准结构如下:
my-plugin/
├── main.js # 入口文件
├── preload.js # 预加载脚本
├── package.json # 插件元数据
├── styles/ # 样式文件
└── icons/ # 图标资源
在package.json中声明插件元数据:
{
"name": "my-plugin",
"version": "1.0.0",
"main": "main.js",
"author": "Your Name",
"description": "增强文件传输功能的插件",
"engines": {
"electerm": ">=1.34.0"
}
}
高级应用场景
AI辅助开发
结合ai.js模块实现智能命令生成,可大幅提升终端操作效率:
// 智能命令建议实现
async function suggestCommand(context) {
const systemPrompt = `你是终端命令专家,根据用户输入提供精确的${process.platform}命令。`
return window.api.invoke('async', {
name: 'AIchat',
args: [
`根据上下文生成命令: ${context}`,
'gpt-3.5-turbo',
systemPrompt,
null, null, null,
false // 禁用流式响应
]
})
}
多会话管理
通过会话API实现跨服务器文件同步、批量命令执行等高级功能,可参考session-api.js中的接口设计。
常见问题解决
API调用失败排查
- 检查electerm版本兼容性,API可能随版本变化
- 通过
console.log在主进程和渲染进程输出调试信息 - 使用
openDevTools查看详细错误堆栈
性能优化建议
- 避免频繁调用同步API,改用异步接口
- 大量数据处理使用Web Worker,参考src/client/entry/worker.js
- 缓存远程资源,减少重复请求
安全最佳实践
- 敏感信息使用enc.js加密存储
- 执行外部命令前验证用户输入,防止注入攻击
- 通过
shell.openExternal打开外部链接,避免直接在应用内加载未知内容
总结与扩展学习
本文介绍的API仅覆盖插件开发基础能力,更多高级接口可查阅以下资源:
- 官方示例插件: src/app/lib
- 核心会话管理: src/app/server/session.js
- 测试用例: test/unit
插件开发的核心是理解主进程与渲染进程的通信机制,通过组合基础API实现复杂功能。建议从简单工具类插件入手,逐步探索窗口扩展、AI集成等高级场景。
下一篇我们将深入探讨如何开发文件传输增强插件,实现断点续传、增量同步等高级功能,敬请关注。如有疑问或插件开发需求,欢迎在项目issue中交流。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



