react-simple-maps、react-vis、recharts 和 victory 都是基于 React 的数据可视化库,但各自专注的领域和设计哲学存在显著差异。react-simple-maps 专精于地理信息可视化,提供简洁的 SVG 地图组件;react-vis 是 Uber 开源的通用图表库,强调底层灵活性;recharts 基于 D3 构建,采用声明式 React 组件封装,适合快速开发常见图表;victory 则主打跨平台一致性,在 Web 和 React Native 间共享相同 API。这些库均面向中大型项目,但在架构集成、定制能力和维护状态上各有取舍。
在 React 生态中,数据可视化需求常被简化为“选个图表库”,但实际工程决策远比这复杂。本文从真实开发场景出发,对比 react-simple-maps(地理专用)、react-vis(底层灵活)、recharts(声明式友好)和 victory(跨平台一致)的核心差异,助你避开选型陷阱。
react-simple-maps 是唯一专注地理可视化的库。它封装了 D3-geo 的投影逻辑,开发者只需提供 GeoJSON 数据即可渲染交互式地图。
// react-simple-maps: 渲染世界地图并高亮国家
import { ComposableMap, Geographies, Geography } from "react-simple-maps";
const geoUrl = "https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json";
export default function WorldMap() {
return (
<ComposableMap>
<Geographies geography={geoUrl}>
{({ geographies }) =>
geographies.map(geo => (
<Geography key={geo.rsmKey} geography={geo} />
))
}
</Geographies>
</ComposableMap>
);
}
其他三者 (react-vis, recharts, victory) 均不支持地理可视化。尝试用它们绘制地图需手动处理 GeoJSON 投影(如使用 d3-geo 计算路径),这违背了使用高层库的初衷。
💡 结论:若需求含地图,
react-simple-maps是唯一合理选择。否则,忽略此库。
recharts 提供最直观的声明式 API:
// recharts: 声明式柱状图
import { BarChart, Bar, XAxis, YAxis, Tooltip } from 'recharts';
const data = [{ name: 'A', value: 400 }, { name: 'B', value: 300 }];
<BarChart width={500} height={300} data={data}>
<XAxis dataKey="name" />
<YAXIS />
<Tooltip />
<Bar dataKey="value" fill="#8884d8" />
</BarChart>
victory 采用类似但更模块化的方式:
// victory: 柱状图
import { VictoryBar, VictoryChart, VictoryAxis } from 'victory';
<VictoryChart>
<VictoryAxis />
<VictoryBar data={[{ x: 'A', y: 400 }, { x: 'B', y: 300 }]} />
</VictoryChart>
react-vis 需要组合多个底层组件:
// react-vis: 柱状图(需手动计算布局)
import { XYPlot, XAxis, YAxis, VerticalBarSeries } from 'react-vis';
<XYPlot width={500} height={300}>
<XAxis />
<YAxis />
<VerticalBarSeries data={[{ x: 'A', y: 400 }, { x: 'B', y: 300 }]} />
</XYPlot>
recharts:通过 Customized 组件扩展,但官方仅维护基础类型。victory:社区插件支持有限,核心库无高级图表。react-vis:曾提供 Sankey 等组件,但因停止维护,新项目风险高。⚠️ 关键事实:
react-vis在 npm 和 GitHub 已明确标注为 archived(归档),官方不再接受 PR 或发布更新。新项目应避免使用。
recharts 允许通过 CSS 或内联 style 覆盖默认样式:
// recharts: 自定义 tooltip 样式
<Tooltip contentStyle={{ backgroundColor: '#333', color: '#fff' }} />
victory 使用 style prop 传递对象:
// victory: 自定义柱状图颜色
<VictoryBar style={{ data: { fill: '#c43a31' } }} />
react-vis 依赖 CSS 类名(如 .rv-xy-plot__series--bar),需覆盖其内置样式表。
当需要自定义悬停行为时:
recharts 提供 onMouseEnter 等回调:
<Bar onMouseEnter={(data, index) => console.log('hover', data)} />
victory 通过 events prop 定义事件处理器:
<VictoryBar
events={[{
target: "data",
eventHandlers: { onClick: () => ({ mutation: () => ... }) }
}]}
/>
react-vis 直接暴露 D3 事件对象,灵活性最高但抽象泄漏明显:
<VerticalBarSeries onValueMouseOver={evt => console.log(evt)} />
💡 工程建议:若团队熟悉 D3 且需深度定制,可考虑原生 D3 + React 封装;否则
recharts的平衡性最佳。
victory 是唯一官方支持 React Native 的库:
// React Native 中使用 victory
import { VictoryBar, VictoryChart } from 'victory-native';
<VictoryChart>
<VictoryBar data={...} />
</VictoryChart>
其他三者(react-simple-maps, react-vis, recharts)仅限 Web 环境,因其依赖 DOM/SVG 特性。
✅ 适用场景:若产品需同时覆盖 Web 和移动端,
victory是唯一可行方案。
recharts:完全拥抱函数组件,无 class 组件依赖。victory:新版全面支持 hooks,旧版有 class 组件残留。react-vis:最后版本(1.11.7)仍大量使用 class 组件,与 StrictMode 不兼容。react-simple-maps:函数组件友好,但需注意 GeoJSON 加载副作用管理。四者均提供官方 TypeScript 类型定义,但 react-vis 的类型因长期未更新,可能与最新 React 版本存在冲突。
recharts 的响应式设计最为成熟:
// recharts: 自动响应容器尺寸变化
<ResponsiveContainer width="100%" height={400}>
<LineChart data={data}>...</LineChart>
</ResponsiveContainer>
victory 需手动处理尺寸变化:
// victory: 需监听容器尺寸
<VictoryChart width={containerWidth} height={400}>
react-vis 和 react-simple-maps 无内置响应式容器,需自行实现 ResizeObserver。
是否需要地图?
react-simple-maps是否需支持 React Native?
victory项目是否新建?
react-vis(已归档)react-vis 可维持,但勿用于新模块团队偏好?
rechartsvictory| 能力 | react-simple-maps | react-vis (⚠️ 归档) | recharts | victory |
|---|---|---|---|---|
| 地理可视化 | ✅ 专注地图 | ❌ | ❌ | ❌ |
| 基础图表 | ❌ | ✅ (但陈旧) | ✅ 完善 | ✅ 完善 |
| React Native | ❌ | ❌ | ❌ | ✅ 官方支持 |
| 声明式 API | N/A | ❌ (命令式倾向) | ✅ 直观 | ⚠️ 模块化但稍复杂 |
| 响应式 | ❌ (需手动) | ❌ | ✅ 内置 | ❌ (需手动) |
| 维护状态 | ✅ 活跃 | ❌ 已归档 | ✅ 活跃 | ✅ 活跃 |
react-simple-maps,别折腾其他库。recharts 是安全牌,文档全、社区大、上手快。victory,尽管学习成本略高,但省去双端维护成本。react-vis:除非维护遗留系统,否则 不要开始新项目。记住:没有“最好”的库,只有“最合适”当前约束的方案。评估时务必结合团队技术栈、产品生命周期和长期维护成本 —— 这才是专业前端架构师的核心价值。
选择 victory 如果你的项目需同时支持 Web 和 React Native,或要求图表在不同平台保持一致行为。其模块化设计便于按需引入,但学习曲线略陡,且性能在超大数据集下可能不如原生 D3。
选择 react-simple-maps 如果你需要在 Web 应用中快速集成交互式地理地图(如国家/省份热力图、点标记等),且希望使用简洁的 SVG 方案而无需处理复杂的 GeoJSON 投影逻辑。它不适合需要高度定制地图样式或非地理类图表的场景。
选择 react-vis 如果你追求对图表底层元素(如坐标轴、图例、标记)的精细控制,并愿意直接操作 D3 封装的组件。注意该库自 2021 年起已停止活跃维护,仅建议用于已有项目或能接受自行维护的团队。
选择 recharts 如果你需要快速构建常见的业务图表(折线图、柱状图、饼图等),偏好声明式 React 组件写法,且希望利用其完善的动画、响应式和组合能力。它不适合需要复杂地理可视化或非 SVG 渲染的场景。
$ npm install victory --save
import React, { Component } from "react";
import { render } from "react-dom";
import { VictoryPie } from "victory";
class PieChart extends Component {
render() {
return <VictoryPie />;
}
}
render(<PieChart />, document.getElementById("app"));
VictoryPie component will be rendered, and you should see:
For detailed documentation and examples please see Victory Documentation
Projects using Victory should also depend on React and prop-types.
Want to use Victory with React Native? Check out victory-native-xl
If you would like to use this version of Victory with React Native, you can install the legacy version using the legacy npm tag. See the available versions in npm.