RedisInsight 插件开发实战:基于 clients-list 构建 CLIENT LIST 表格与 JSON 可视化
RedisInsight 插件开发实战基于 clients-list 构建 CLIENT LIST 表格与 JSON 可视化【免费下载链接】RedisInsightRedis GUI by Redis项目地址: https://gitcode.com/GitHub_Trending/re/RedisInsightRedisInsight 提供了一套基于 iframe 隔离的 Workbench 插件机制允许开发者针对特定 Redis 命令自定义结果可视化。本文以仓库内的官方示例插件 clients-list 为蓝本完整讲解插件从本地运行、依赖构建、打包发布到源码级实现原理的全过程读完你就能独立开发一个可用的 RedisInsight Workbench 插件。插件是什么一段被 iframe 隔离的可视化脚本RedisInsight 的插件本质是一个独立的前端包它通过 package.json 声明自己要接管哪些命令并在命令执行后把结果交给插件的activationMethod渲染函数。渲染发生在 iframe 内部插件脚本和样式与主应用完全隔离见 插件开发文档。clients-list 插件同时演示了三种可视化场景可视化 id显示名称activationMethod匹配命令说明clients-listTablerenderClientsListCLIENT LIST把客户端列表解析为可排序分页表格json-viewJSONrenderJSONJSON.GET、JSON.MGET高亮展示 JSON 值json-string-viewJSONrenderJSONGET把普通字符串按 JSON 渲染matchCommands支持正则例如[CLIENT LIST, FT.*]因此一个插件可以匹配多个命令族。技术栈与构建工具clients-list 使用 React 17 TypeScript Elastic UI 编写Parcel 负责打包README 中声明同时依赖以下关键库见 package.jsonredisinsight-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.htmlnpm 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.cssbody默认带有theme_DARK类名与主应用 iframe 注入主题的方式保持一致。打包与安装到 RedisInsight插件就绪后执行npm install npm run build产物为dist目录随后把package.json与dist文件夹一起放入插件的独立目录将该目录放到 RedisInsight 的plugins文件夹下重启应用在 Workbench 中执行对应命令即可看到新可视化。完整安装步骤见 插件安装文档。源码剖析一CLIENT LIST 响应解析与表格渲染CLIENT LIST返回多行keyvalue文本每个客户端一行。插件在 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 })流程为按换行拆分 → 过滤空行 → 每行按空格拆成keyvalue对 → 还原为对象数组。这样id3 addr127.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 或 JSONViewmode区分RAW与ASCII两种回复模式。另外插件 iframe 内还能通过window.state拿到{ config, modules }含baseUrl、appVersion与当前库的模块列表详见 插件开发文档。关键要点速查命令匹配matchCommands支持正则如[CLIENT LIST, FT.*]渲染契约每个可视化对应一个导出函数参数固定为{ command, data, mode }渲染到#appSDK 通信跨 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),仅供参考