type
status
date
slug
summary
tags
category
icon
password
 

背景

在日常开发中,我们经常需要在界面中展示 JSON 数据,比如接口返回值调试、日志查看、配置信息展示等。虽然可以直接使用文本框或 pre 标签来展示,但这样不仅缺乏格式化,还缺少高亮和良好的可读性,体验较差。
为了提升用户体验和开发效率,我们决定封装一个简单易用的 JSON 高亮展示组件,方便在各个项目中复用。

选型思考

为了实现「高亮」效果,我们调研了几种方案:
  • 纯前端手动解析 JSON 渲染成 HTML(成本高,不必要)
  • 使用第三方高亮库,比如:
    • highlight.js
    • react-syntax-highlighter (React 封装友好)
综合考虑易用性、社区活跃度、定制性,我们最终选择了 react-syntax-highlighter

封装目标

在正式动手之前,我们明确了封装的几个核心目标:
  1. 支持灵活输入:可以接受 JSON 字符串或对象。
  1. 防止异常崩溃:即使输入数据格式不规范,也能优雅处理。
  1. 可定制性:支持最大高度、自定义样式、控制是否显示行号。
  1. 默认体验友好:即使不传任何配置,也能有合理的默认展示。
  1. 可扩展性:未来可以快速适配其他语言高亮(虽然目前专注 JSON)。

实现思路

1. 统一处理输入数据

首先考虑到用户可能传入对象字符串,所以需要一个统一处理的方法。
  • 如果是对象:使用 JSON.stringify(obj, null, 2) 格式化成带缩进的字符串。
  • 如果是字符串:调用 formatJsonString 工具函数,确保其被正确格式化,防止直接渲染出一坨难以阅读的字符串。
  • 如果为空或者解析失败:显示一个合理的占位文本,例如 { // 暂无数据 }
这样可以保证组件无论拿到什么输入,都能稳定展示。

2. 基于 SyntaxHighlighter 渲染

在渲染层面,选择了 SyntaxHighlighter
  • 设置 language="json",使用内置的 JSON 高亮规则。
  • 使用 docco 主题风格(浅色、简洁,比较适合后台页面)。
  • 开启或关闭行号显示(showLineNumbers 可控)。
  • 支持自动换行长行文本(wrapLongLines)。
  • 控制最大高度,并在超出时自动滚动。
代码示例:

3. 合理默认配置

为了降低组件使用门槛,我们为大部分配置项提供了合理的默认值,比如:
  • 最大高度 800px
  • 显示行号
  • 不自动换行
  • 占位文本
这让组件即插即用,减少了开发者的心智负担。

技术细节 & 注意点

  • 错误处理:无论 json 是什么格式,组件内部都会包一层 try-catch,确保不会因为格式问题导致页面报错。
  • 样式合并:使用 customStyle prop,允许用户在默认滚动样式的基础上追加自己的样式,而不是完全覆盖。
  • 性能考虑SyntaxHighlighter 渲染性能较好,但在极大规模 JSON 时仍需注意(如上 MB 级别数据)。

可能的扩展方向

  • 支持不同主题风格切换(深色、暗黑模式)
  • 动态语言高亮(不仅是 JSON,也可以是 YAML、JavaScript 等)
  • JSON 数据折叠/展开功能(比如大对象自动折叠)
  • 搜索高亮关键词
  • 代码拷贝功能

总结

这个 JsonHighlighter 组件的封装,实际上是一次典型的「围绕单一场景的小工具组件设计」实践:
  • 从真实需求出发
  • 简单,健壮,默认友好
  • 保留扩展性
  • 统一处理输入和异常
  • 不引入不必要的复杂性
同时也体现了一个开发者在面对小功能时应该保持的克制 —— 够用即可,不盲目 over-engineering。

附源代码

 
Git—全局设置变量前端高亮搜索展示树
Loading...