Recharts logo

Recharts

基于 React 和 D3 的声明式 React 图表库,业界最流行的 React 数据可视化解决方案。

可视化图表ReactD3

Recharts 是 React 生态中最流行的图表库,将 D3 的数学计算能力与 React 组件化模型结合,通过声明式 JSX 语法快速生成交互式图表,周下载量超 900 万,是数据仪表盘和后台系统的首选方案。

Recharts

基于 React 和 D3 的声明式 React 图表库,业界最流行的 React 数据可视化解决方案。

技术简介说明

Recharts 是一个使用 React 和 D3 的声明式图表库,自 2016 年发布以来,已经发展为 React 生态中最流行的图表库。其核心理念是将 D3 的强大数学计算能力与 React 的组件化模型相结合,让开发者通过声明式的 JSX 语法即可创建丰富的数据可视化图表。

Recharts 的设计哲学是「简单即用」(Simple to use),通过高度封装的组件系统降低了数据可视化的门槛。开发者无需深入了解 SVG 渲染细节或 D3 的复杂 API,只需组合 <LineChart><Bar><XAxis> 等组件即可快速生成交互式图表。这种设计使其成为 React 项目中数据仪表盘、后台管理系统等场景的首选方案。

在架构层面,Recharts 完全基于 SVG 渲染,确保了图表的可访问性和样式灵活性。虽然 SVG 在处理超大规模数据集时存在性能瓶颈,但对于绝大多数业务场景(数百到数千数据点),Recharts 提供了优秀的性能和开发体验平衡。其周下载量超过 900 万次(2025 年数据),GitHub Stars 超过 25,000,是 React 可视化领域社区活跃度最高的开源项目之一。

基本信息

  • 官网https://recharts.org
  • GitHubhttps://github.com/recharts/recharts
  • License:MIT
  • 最新版本:v2.15.3(2025 年)
  • 主要维护者:Recharts 社区(原始作者:arcthur / 现由社区志愿者维护)
  • npm 周下载量:~9,000,000+
  • GitHub Stars:~25,600+
  • 包体积:~140KB (gzipped, 完整包);支持 tree-shaking

快速上手

安装

# npm
npm install recharts
 
# yarn
yarn add recharts
 
# pnpm
pnpm add recharts

Recharts 的 peer dependency 为 reactreact-dom(>= 16.8),大多数项目已经具备。

基础配置

Recharts 是零配置库,安装后直接导入使用,无需额外配置文件或 Provider。所有图表组件均通过 props 控制行为和样式。

最小示例

import {
  LineChart,
  Line,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  Legend,
  ResponsiveContainer,
} from 'recharts'
 
const data = [
  { name: '1月', uv: 4000, pv: 2400 },
  { name: '2月', uv: 3000, pv: 1398 },
  { name: '3月', uv: 2000, pv: 9800 },
  { name: '4月', uv: 2780, pv: 3908 },
  { name: '5月', uv: 1890, pv: 4800 },
  { name: '6月', uv: 2390, pv: 3800 },
]
 
export default function App() {
  return (
    <ResponsiveContainer width="100%" height={300}>
      <LineChart data={data}>
        <CartesianGrid strokeDasharray="3 3" />
        <XAxis dataKey="name" />
        <YAxis />
        <Tooltip />
        <Legend />
        <Line type="monotone" dataKey="pv" stroke="#8884d8" />
        <Line type="monotone" dataKey="uv" stroke="#82ca9d" />
      </LineChart>
    </ResponsiveContainer>
  )
}

核心概念与架构

组件分层体系

Recharts 采用清晰的组件分层设计,每个组件承担特定职责:

ChartContainer (图表容器)
├── CoordinateSystem (坐标系统)
│   ├── XAxis / YAxis / ZAxis
│   ├── PolarAngleAxis / PolarRadiusAxis
│   └── CartesianGrid / PolarGrid
├── DataComponents (数据组件)
│   ├── Line / Bar / Area / Scatter
│   ├── Pie / Radar / RadialBar
│   └── Funnel / Treemap
├── Interaction (交互组件)
│   ├── Tooltip
│   ├── Legend
│   └── Brush (数据范围选择器)
├── Reference (参考线)
│   ├── ReferenceLine
│   ├── ReferenceArea
│   └── ReferenceDot
└── Label / LabelList (标签)

数据绑定模型

Recharts 使用基于 data prop 的声明式数据绑定。数据格式为扁平对象数组,通过 dataKey 映射到坐标轴和数据系列:

// 数据格式:扁平对象数组
const data = [
  { month: 'Jan', sales: 100, profit: 40 },
  { month: 'Feb', sales: 120, profit: 55 },
]
 
// dataKey 直接映射对象字段
<Line dataKey="sales" />
<XAxis dataKey="month" />

支持嵌套路径(dataKey="user.name")和函数形式(dataKey=&#123;(entry) => entry.sales * 0.8&#125;)。

渲染架构

数据输入
  ↓
D3 Scales 计算 (线性/对数/时间/序数)
  ↓
SVG 组件渲染
  ↓
React Reconciliation (动画过渡)
  ↓
DOM 更新

所有图表最终渲染为 SVG 元素,依赖 D3 的 d3-scaled3-shaped3-interpolate 等模块进行数学计算,但不依赖 D3 的 DOM 操作。

核心特性

  • 声明式 API:组件化 JSX 语法,与 React 开发模型完全一致,学习曲线平缓
  • 丰富的图表类型:支持折线图、柱状图、面积图、散点图、饼图、雷达图、径向柱图、漏斗图、矩形树图等 15+ 种图表
  • ResponsiveContainer:内置响应式容器,自动适配父容器尺寸变化,支持 debounced resize
  • 动画过渡:内置基于 React 的平滑动画系统,数据更新时自动过渡
  • 交互式组件:Tooltip、Legend、Brush(数据范围选择)、Zoom 等开箱即用的交互能力
  • 自定义渲染:通过 customized props(如 shapecontentlabel)可完全自定义组件渲染
  • TypeScript 支持:从 v2.x 开始提供完整的 TypeScript 类型定义
  • 组合式图表:可在同一坐标系中混合多种图表类型(如 Line + Bar 叠加)
  • 参考线/区域ReferenceLineReferenceAreaReferenceDot 用于标注关键数据点
  • 同步图表syncId 属性实现多个图表的联动(共享 Tooltip 和 Brush)

生态图

关键依赖

依赖用途
d3-scale比例尺计算
d3-shape图形路径生成(line、area、arc)
d3-interpolate值插值与动画
d3-color颜色解析与过渡
react-smooth动画引擎(Recharts 团队维护)
react-isReact 组件类型判断

相关插件与扩展

工具说明
recharts-scale自定义比例尺扩展(已内置)
recharts-to-png将 Recharts 图表导出为 PNG
recharts-inspector开发调试工具
storybook-addon-rechartsStorybook 集成

社区生态

  • npm 周下载量:900 万+,React 图表库中排名第一
  • GitHub Discussions:活跃的社区讨论区
  • Stack Overflowrecharts 标签下有 3,000+ 问答
  • 第三方教程:大量中英文教程和博客文章
  • CodeSandbox / StackBlitz:官方提供在线示例模板

适用场景

  • 后台管理系统仪表盘:最典型场景,快速搭建数据展示面板,柱状图、折线图、饼图开箱即用
  • 数据监控平台:利用 ResponsiveContainer 和实时数据更新实现动态监控图表
  • 数据分析报表:组合多种图表类型(Line + Bar + ReferenceLine)展示多维数据
  • 内容管理系统统计:文章发布量、用户活跃度等内容指标的可视化展示
  • 简单数据可视化需求:快速原型开发,不需要深度定制图表行为
  • React 教育/学习项目:API 简单直观,适合作为数据可视化入门工具
  • 中后台 BI 工具:与其他 React 组件库(Ant Design、MUI)配合构建 BI 系统

开发与工程化

开发流程

# 克隆仓库
git clone https://github.com/recharts/recharts.git
cd recharts
 
# 安装依赖
npm install
 
# 启动 Storybook 开发环境
npm run storybook
 
# 运行测试
npm run test
 
# 类型检查
npm run check-types
 
# 构建
npm run build

构建配置

Recharts 使用 Rollup 进行构建,输出 CommonJS 和 ES Module 两种格式:

dist/
├── recharts.js          # UMD 格式(CDN 使用)
├── recharts.min.js      # UMD 压缩版
├── index.js             # CommonJS
├── index.mjs            # ES Module
└── index.d.ts           # TypeScript 类型定义

工程化最佳实践

  1. 按需导入:使用命名导入(named imports)而非默认导入,确保 tree-shaking 生效

    // 推荐 ✅
    import { LineChart, Line } from 'recharts'
     
    // 不推荐 ❌
    import Recharts from 'recharts'
  2. 版本锁定:Recharts 的 minor 版本偶尔引入 breaking changes,建议在 package.json 中使用精确版本

  3. SSR 兼容ResponsiveContainer 在 SSR 环境下需要特殊处理(设置 minWidth/minHeight),或使用 dynamic import

  4. CI/CD 集成:在 CI 中运行 npm run check-types + npm run test 确保类型安全和功能正确性

性能与安全

性能特点

维度评估
小数据集(< 100 点)优秀,渲染延迟 < 16ms
中等数据集(100-1000 点)良好,可流畅交互
大数据集(1000-10000 点)一般,建议使用数据降采样
超大数据集(10000+ 点)不适合,考虑 Canvas 方案(Chart.js / uPlot)

性能优化建议

  1. 数据降采样:对于超过 1000 个数据点的折线图,使用 LTTB(Largest Triangle Three Buckets)算法降采样
  2. 避免频繁重渲染:使用 React.memo 包裹图表组件,useMemo 缓存数据数组
  3. 关闭不需要的动画isAnimationActive=&#123;false&#125; 在大数据量时显著提升性能
  4. 使用 data 引用稳定性:确保 data 数组引用不变(useMemo),避免无意义的 diff
  5. Tooltip 优化:自定义 Tooltip 时避免复杂计算,使用 throttle 控制更新频率

安全注意事项

  • Recharts 不直接渲染 HTML,使用 SVG 渲染,XSS 风险较低
  • 自定义 content 渲染函数时,避免使用 dangerouslySetInnerHTML
  • dataKey 使用函数形式时注意避免注入风险

已知性能瓶颈

  • ResponsiveContainer 的 resize 监听在频繁尺寸变化场景下可能导致性能问题
  • 大量 Legend 条目会显著增加渲染时间
  • 多图表同步(syncId)在 5+ 图表联动时可能出现卡顿

技术对比

维度RechartsNivoVictoryvisxChart.js
GitHub Stars~25,600~14,000~11,200~19,000~65,000
周下载量~9M~650K~440K~3M~5M
渲染方式SVGSVG/Canvas/HTMLSVGSVGCanvas
React 集成原生 React原生 React原生 React底层原语框架无关
TypeScript✅ v2+ 完整支持✅ 完整支持✅ 支持✅ 完整支持✅ 社区类型
学习曲线
自定义能力中高中高极高
跨平台❌ 仅 Web❌ 仅 Web✅ Web + RN❌ 仅 Web❌ 仅 Web
动画内置react-spring内置需自建内置
无障碍一般WCAG 2.1 AA一般需自建一般
Bundle Size~140KB按模块安装~200KB~100KB (核心)~65KB

选型建议

  • 快速搭建后台图表 → Recharts(最广泛采用,教程最多)
  • 需要丰富视觉效果 → Nivo(30+ 图表类型,精美动画)
  • Web + React Native 跨平台 → Victory(唯一成熟的跨平台方案)
  • 极致自定义可视化 → visx(底层原语,自由组合)
  • 非 React 项目或需要 Canvas 高性能 → Chart.js

最佳实践

生产环境推荐模式

  1. 数据格式化在图表外部完成

    // 推荐:数据在外部预处理 ✅
    const formattedData = useMemo(() => rawData.map(formatEntry), [rawData])
    <LineChart data={formattedData}>
     
    // 不推荐:在渲染函数中处理 ❌
    <LineChart data={rawData.map(formatEntry)}>
  2. 使用 isAnimationActive 控制动画

    // 实时更新场景关闭动画避免性能问题
    <Line isAnimationActive={isInitialLoad} dataKey="value" />
  3. 自定义 Tooltip 使用 React.memo

    const CustomTooltip = React.memo(({ active, payload, label }) => {
      // ...
    })
  4. 合理使用 ResponsiveContainer

    // SSR 环境设置最小尺寸
    <ResponsiveContainer width="100%" height={300} minWidth={300} minHeight={200}>
  5. 多图表联动使用 syncId

    <LineChart syncId="dashboard" data={data1}>...</LineChart>
    <BarChart syncId="dashboard" data={data2}>...</BarChart>

常见陷阱

陷阱说明解决方案
数据引用变化导致无限重渲染每次 render 创建新数组useMemo 缓存数据
SSR 水合不匹配ResponsiveContainer 依赖 DOM 测量设置 minWidth/minHeight 或使用 dynamic import
自定义组件类型错误shape/content props 类型不匹配参考 TypeScript 类型定义
中文 Tooltip 乱码SVG 字体问题确保字体已在页面加载
大数据量卡顿SVG 节点过多数据降采样或切换 Canvas 方案

技术局限与边界

已知限制

  1. 仅支持 SVG 渲染:无法使用 Canvas 渲染,不适合超大规模数据集(10,000+ 数据点)
  2. 不支持 React Native:仅限 Web 使用,跨平台场景需选择 Victory
  3. 图表类型有限:不支持 Sankey、Chord、Heatmap 等高级可视化类型(需用 Nivo 或 D3)
  4. 3D 图表不支持:无法创建 3D 可视化
  5. 服务端生成图片不支持:无法在服务端直接生成图表图片(需配合 puppeteer 等)

不适用场景

  • 实时流式大数据可视化(> 10,000 点/帧)→ 考虑 uPlot、Chart.js Canvas
  • 复杂网络图/关系图 → 考虑 D3 + force layout
  • 地理信息可视化 → 考虑 Mapbox、deck.gl
  • 需要 Canvas/WebGL 渲染的场景 → 考虑 Chart.js、visx + Canvas

迁移注意事项

  • 从 v1.x 迁移到 v2.x:API 有大量 breaking changes,需参考官方迁移指南
  • 迁移到其他库:数据格式通常为简单对象数组,数据层迁移成本低;组件层需重写
  • 从 Chart.js 迁移到 Recharts:渲染模型完全不同(Canvas vs SVG),需要重新理解组件模型

学习资源

2026 年现状

最新版本

  • v2.15.x(2025 年):当前稳定版本线,持续维护中
  • v2.x 是当前主要版本,v3.0 尚未发布

发展趋势

  1. 维护模式:Recharts 目前处于稳定维护阶段,以 bug 修复和 TypeScript 改进为主
  2. React 19 支持:社区正在推进 React 19 兼容性
  3. 竞争压力:面临来自 visx、Nivo 等新一代库的竞争,但凭借庞大的用户基础仍保持领先地位
  4. 社区驱动:主要依靠社区贡献者维护,非公司商业产品

社区活跃度

  • GitHub Stars 超过 25,600
  • npm 周下载量超过 900 万,React 图表库中排名第一
  • GitHub Issues 和 Discussions 保持活跃
  • 定期发布 patch 和 minor 版本

未来路线图

  • 官方未发布正式路线图
  • 社区关注的方向:性能优化(Canvas 渲染后备)、更多图表类型、React Server Components 支持
  • v3.0 的讨论主要集中在架构现代化和性能改进