RedisInsight 插件开发实战:基于 clients-list 构建 CLIENT LIST 表格与 JSON 可视化
【免费下载链接】RedisInsightRedis GUI by Redis项目地址: https://gitcode.com/GitHub_Trending/re/RedisInsight
RedisInsight 提供了一套基于 iframe 隔离的 Workbench 插件机制,允许开发者针对特定 Redis 命令自定义结果可视化。本文以仓库内的官方示例插件 clients-list 为蓝本,完整讲解插件从本地运行、依赖构建、打包发布到源码级实现原理的全过程,读完你就能独立开发一个可用的 RedisInsight Workbench 插件。
插件是什么:一段被 iframe 隔离的可视化脚本
RedisInsight 的插件本质是一个独立的前端包:它通过 package.json 声明自己要接管哪些命令,并在命令执行后把结果交给插件的activationMethod渲染函数。渲染发生在 iframe 内部,插件脚本和样式与主应用完全隔离,见 插件开发文档。
clients-list 插件同时演示了三种可视化场景:
| 可视化 id | 显示名称 | activationMethod | 匹配命令 | 说明 |
|---|---|---|---|---|
clients-list | Table | renderClientsList | CLIENT LIST | 把客户端列表解析为可排序分页表格 |
json-view | JSON | renderJSON | JSON.GET、JSON.MGET | 高亮展示 JSON 值 |
json-string-view | JSON | renderJSON | GET | 把普通字符串按 JSON 渲染 |
matchCommands支持正则,例如["CLIENT LIST", "FT.*"],因此一个插件可以匹配多个命令族。
技术栈与构建工具
clients-list 使用 React 17 + TypeScript + Elastic UI 编写,Parcel 负责打包(README 中声明),同时依赖以下关键库(见 package.json):
redisinsight-plugin-sdk:与主应用通信的 SDK,本文的formatRedisReply即来自该包;json-bigint:解析可能含大整数的 JSON 响应;buffer:用于将 Redis 返回的 ASCII 安全字符串还原为字节;@elastic/eui34.6.0:保持一致 UI 风格的组件库。
在仓库内本地运行插件
README 给出了两种本地运行路径。独立运行方式:
npm install npm start第一条命令安装插件依赖,第二条启动本地开发服务器(开发模式下 main.tsx 会直接渲染一段内置示例数据)。
从 RedisInsight 仓库生成基础样式:README 注明基础样式来源于 RedisInsight 仓库本身,需要先把主应用的静态资源构建出来,再放进插件目录并引入index.html:
npm install npm install --prefix redisinsight/api npm run build:statics - for Linux or MacOs npm run build:statics:win - for Windows在开发模式下,index.html 会通过if (isDev)条件加载远程的global_styles.css与dark_theme.css,<body>默认带有theme_DARK类名,与主应用 iframe 注入主题的方式保持一致。
打包与安装到 RedisInsight
插件就绪后执行:
npm install npm run build产物为dist目录,随后:
- 把
package.json与dist文件夹一起放入插件的独立目录; - 将该目录放到 RedisInsight 的
plugins文件夹下; - 重启应用,在 Workbench 中执行对应命令即可看到新可视化。
完整安装步骤见 插件安装文档。
源码剖析一:CLIENT LIST 响应解析与表格渲染
CLIENT LIST返回多行key=value文本,每个客户端一行。插件在 parseResponse.ts 中完成解析:
export const parseClientListResponse = (response: string) => response .split(/\r?\n/) .filter((r: string) => r) .map((row: string) => { const value = row.split(' ') const obj: any = {} value.forEach((v: string) => { const pair = v.split('=') obj[pair[0]] = pair[1] }) return obj })流程为:按换行拆分 → 过滤空行 → 每行按空格拆成key=value对 → 还原为对象数组。这样id=3 addr=127.0.0.1:6379 ...就变成{ id: '3', addr: '127.0.0.1:6379', ... }。
表格组件 TableView.tsx 取解析结果的第一个对象作为列定义来源,所有列开启排序,并启用分页:
const newColumns = Object.keys(result[0]).map((item) => ({ header: item, id: item, accessorKey: item, enableSorting: true, })) // ... <Table data={result ?? []} columns={columns} paginationEnabled />无结果时展示 "No results"。由于列是动态生成的,即使 Redis 未来增加新的客户端字段,表格也能自动适配。
源码剖析二:JSON 可视化与 ASCII 安全字符串还原
JSON 视图入口 JSONView.tsx 使用json-bigint以useNativeBigInt: true、protoAction/constructorAction: 'preserve'配置解析字符串,避免大整数精度丢失和原型污染问题;解析失败时回退到 SDK 的formatRedisReply(value, command)重新格式化原始回复。解析成功用JsonPretty以space={2}缩进高亮展示,失败则输出纯文本回复。
对于GET/JSON.GET等可能返回转义字节的命令,parseResponse.ts 实现了parseJSONASCIIResponse:逐字符扫描,遇到\xHH十六进制转义按字节还原,遇到\a \b \t \n \r \\ \"等标准转义则映射为对应控制字符,最后Buffer.concat得到可读字符串。这是让 Redis 二进制安全回复正确显示的关键。
源码剖析三:入口脚本与 props 协议
插件的对外契约定义在 main.tsx:每个可视化导出一个渲染函数,接收{ command, data, mode }:
interface Props { command?: string mode: RawMode data?: { response: any; status: string }[] } const renderClientsList = (props: Props) => { const { command = '', data: result = [], mode } = props render( <ThemeProvider> <App plugin={CommonPlugin.ClientList} command={command} result={result} mode={mode} /> </ThemeProvider>, document.getElementById('app'), ) }data为命令结果数组(Standalone 一条,Cluster 多条);每条含response与status: 'success' | 'fail';- 必须渲染到 iframe 已有的
#appDOM 节点; - 文件末尾必须
export default { renderClientsList, renderJSON },键名与 package.json 中visualizations[].activationMethod一一对应; - 使用
ThemeProvider包裹以继承主应用主题。
App.tsx 按status === 'fail'展示错误信息,再依据plugin类型分发到 TableView 或 JSONView;mode区分RAW与ASCII两种回复模式。另外插件 iframe 内还能通过window.state拿到{ config, modules }(含baseUrl、appVersion与当前库的模块列表),详见 插件开发文档。
关键要点速查
- 命令匹配:
matchCommands支持正则,如["CLIENT LIST", "FT.*"]; - 渲染契约:每个可视化对应一个导出函数,参数固定为
{ command, data, mode },渲染到#app; - SDK 通信:跨 iframe 与主应用交互统一走
redisinsight-plugin-sdk,见 SDK README; - 样式一致性:推荐 React + Elastic UI,开发时可复用主应用
build:statics产出的vendor样式与字体; - 打包安装:
dist目录与package.json一同放入plugins下的独立目录即可生效。
测试与验证
插件代码同时包含单元测试,可在源码中直接验证核心行为:JSON 视图的测试位于 JSONView.spec.tsx,表格视图测试位于 TableView.spec.tsx,覆盖了解析、渲染与失败回退等关键路径,可作为二次开发时修改行为的回归基准。
【免费下载链接】RedisInsightRedis GUI by Redis项目地址: https://gitcode.com/GitHub_Trending/re/RedisInsight
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考