Vercel/Hyper 终端插件开发完全指南
2025-07-05 01:56:42作者:柏廷章Berta
前言
Vercel/Hyper 是一款基于 Electron 构建的现代化终端应用,其插件系统允许开发者扩展和定制终端功能。本文将全面介绍 Hyper 插件开发的工作流程、核心 API 和实用技巧,帮助开发者快速上手插件开发。
开发环境搭建
开发模式运行 Hyper
要开发 Hyper 插件,首先需要以开发模式运行 Hyper:
- 克隆项目仓库并切换到
canary
分支 - 安装所有依赖项
- 在项目根目录创建
hyper.json
配置文件副本 - 运行
yarn run app
启动开发模式
开发模式下,你将获得更详细的日志输出,并能使用 Electron 的 React/Redux 开发工具。
插件开发目录结构
首次运行后,Hyper 会在项目根目录创建 plugins
文件夹,其中:
local
子目录用于存放本地开发的插件- 建议使用符号链接方式关联你的插件项目目录
插件基础开发
插件注册
在 hyper.json
配置文件中,通过 localPlugins
数组注册你的插件:
{
"localPlugins": ["hyper-awesome-plugin"]
}
插件基本结构
每个插件必须至少实现一个 API 方法。插件的基本结构如下:
// package.json 中定义插件名称和版本
{
"name": "hyper-awesome-plugin",
"version": "1.0.0"
}
// 插件主文件
module.exports = {
// 插件API方法实现
}
调试技巧
- 渲染进程中的
console.log()
会显示在 Electron 开发者工具中 - 主进程中的日志会输出到运行
yarn run app
的终端 - 成功加载的插件会在启动时显示日志:
Plugin hyper-awesome-plugin (1.0.0) loaded.
核心 API 详解
组件装饰器
Hyper 允许通过高阶组件(HOC)模式装饰几乎所有内置组件:
exports.decorateTerms = (Terms, {React}) => {
return class extends React.Component {
componentDidMount() {
// 访问底层Term实例
if (this.props.onDecorated) {
this.props.onDecorated(this.terms);
}
}
render() {
// 返回装饰后的组件
return <Terms {...this.props} />;
}
}
}
重要提示:必须正确传递 onDecorated
回调,否则会破坏插件链。
快捷键绑定
实现自定义快捷键需要两个步骤:
- 声明键位映射:
exports.decorateKeymaps = keymaps => ({
...keymaps,
'plugin:action': 'Ctrl+Shift+A'
});
- 注册命令处理器:
// 渲染进程处理器
this.terms.registerCommands({
'plugin:action': e => {
e.preventDefault();
// 执行操作
}
});
// 主进程处理器
rpc.on('command plugin:action', () => {
// 主进程操作
});
菜单定制
可以通过 decorateMenu
修改 Hyper 的菜单结构:
exports.decorateMenu = menu => {
return menu.map(menuCategory => {
if (menuCategory.label === 'Edit') {
return [
...menuCategory,
{type: 'separator'},
{
label: '自定义操作',
click: () => {
// 通过RPC与渲染进程通信
focusedWindow?.rpc.emit('custom-action');
}
}
];
}
return menuCategory;
});
};
光标追踪
获取终端光标信息:
exports.decorateTerm = (Term, {React}) => {
return class extends React.Component {
onCursorMove(cursor) {
const {x, y, col, row} = cursor;
// 使用光标信息
}
render() {
return <Term {...this.props} onCursorMove={this.onCursorMove} />;
}
}
}
高级技巧
跨进程通信
主进程与渲染进程间的通信:
// 主进程发送
window.rpc.emit('event-name', data);
// 渲染进程监听
rpc.on('event-name', handler);
// 主进程监听
const {ipcMain} = require('electron');
ipcMain.on('event-name', handler);
Electron API 访问
虽然 Hyper 不直接暴露 Electron API,但插件可以直接引入:
const {dialog, Menu} = require('electron');
Hyper v2 重要变更
- 渲染引擎:从 hterm 切换到 xterm.js
- 渲染方式:现在使用 Canvas 而非 DOM 渲染
- 样式定制:不再支持直接修改 DOM 样式,需通过 xterm.js 配置参数实现
如果现有插件依赖 hterm API,需要进行适配改造。如需新的 xterm.js API 支持,可以向 Hyper 团队提交需求。
最佳实践
- 命名规范:命令命名采用
<context>:<action>
格式 - 快捷键设计:考虑平台差异,提供合理的默认键位
- 错误处理:妥善处理边界情况和错误状态
- 性能优化:避免频繁的渲染更新和状态变更
通过本文介绍的技术和API,开发者可以创建功能强大的Hyper插件,从简单的UI调整到复杂的终端功能扩展都能实现。