Nivo
基于 React 的丰富数据可视化组件库,提供 30+ 种精美图表类型,支持 SVG、Canvas 和 HTML 三种渲染模式。
Nivo 是功能极为丰富的 React 数据可视化组件库,提供 30+ 种图表类型和 SVG/Canvas/HTML 三种渲染模式,强调可定制性和视觉表现力,是目前 React 图表库中唯一开箱即满足 WCAG 2.1 AA 无障碍标准的库。
Nivo
基于 React 的丰富数据可视化组件库,提供 30+ 种精美图表类型,支持 SVG、Canvas 和 HTML 三种渲染模式。
技术简介说明
Nivo 是一个功能极为丰富的 React 数据可视化组件库,由 Raphaël Benitte 于 2017 年创建。其最大特色是提供超过 30 种图表类型(从基础的折线图、柱状图到 Sankey、Chord、Icicle 等高级可视化),同时支持 SVG、Canvas 和 HTML 三种渲染引擎,让开发者可根据数据量和场景需求灵活选择渲染方式。
Nivo 的设计理念强调「可定制性」和「视觉表现力」。每个图表组件都提供丰富的配置项,涵盖动画、主题、交互、无障碍等方面。其交互式 Playground 允许开发者在线实时调整参数并即时预览效果,大幅降低了调试成本。Nivo 是目前 React 图表库中唯一开箱即满足 WCAG 2.1 AA 无障碍标准的库,这在企业级应用中是重要优势。
作为一个个人开源项目,Nivo 由 Raphaël Benitte 独立维护(关联 Devographics 组织),通过 Open Collective 接受社区赞助。2025 年项目保持高度活跃,4–5 月期间密集发布了 10 个版本(v0.92.0 → v0.99.0),涵盖 React 19 支持、TypeScript 升级、模块化改进等重要更新。
基本信息
- 官网:https://nivo.rocks
- GitHub:https://github.com/plouc/nivo
- License:MIT
- 最新版本:v0.99.0(2025 年 5 月 23 日)
- 主要维护者:Raphaël Benitte(GitHub: plouc)/ Devographics 组织
- npm 周下载量:~650,000
- GitHub Stars:~14,000
- 包体积:按模块安装,单图表包约 30-80KB (gzipped)
快速上手
安装
Nivo 采用模块化设计,每个图表类型是独立的 npm 包,按需安装:
# 核心包(所有图表的公共依赖)
pnpm add @nivo/core
# 按需安装所需图表
pnpm add @nivo/bar @nivo/line @nivo/pie
# 其他常用模块
pnpm add @nivo/tooltip # 自定义 Tooltip
pnpm add @nivo/legends # 图例工具
pnpm add @nivo/scales # 比例尺工具
pnpm add @nivo/theming # 主题系统(v0.92.0+ 独立模块)
# 或者安装完整包(包含所有图表)
pnpm add @nivo/bar @nivo/line @nivo/pie @nivo/sankey @nivo/heatmap @nivo/chord @nivo/circle-packing @nivo/treemap @nivo/radar @nivo/scatterplot @nivo/funnel @nivo/bump @nivo/waffle @nivo/swarmplot @nivo/radial-bar @nivo/parallel-coordinates @nivo/calendar @nivo/canvas @nivo/annotations @nivo/axes @nivo/colors @nivo/scales @nivo/arcs @nivo/tooltip @nivo/legends @nivo/text @nivo/voronoi @nivo/network @nivo/sunburst @nivo/stream @nivo/marimekko @nivo/mizu @nivo/rects @nivo/sankey-v2 @nivo/icicle推荐按需安装,避免 bundle 体积膨胀。
基础配置
Nivo 无需全局配置,但可以通过 Theme 对象统一控制所有图表的视觉风格:
// 全局主题配置
const theme = {
background: 'transparent',
textColor: '#333',
fontSize: 11,
axis: {
domain: { line: { stroke: '#777', strokeWidth: 1 } },
ticks: { line: { stroke: '#777', strokeWidth: 1 } },
legend: { text: { fontSize: 12, fill: '#333' } },
},
grid: { line: { stroke: '#ddd', strokeDasharray: '3 3' } },
legends: { text: { fontSize: 11, fill: '#333' } },
tooltip: {
container: {
background: '#ffffff',
color: '#333',
boxShadow: '0 2px 8px rgba(0,0,0,0.15)',
},
},
}最小示例
import { ResponsiveBar } from '@nivo/bar'
const data = [
{ country: 'AD', hot: 20, cold: 4, sand: 3 },
{ country: 'AE', hot: 12, cold: 8, sand: 15 },
{ country: 'AF', hot: 18, cold: 5, sand: 7 },
{ country: 'AG', hot: 10, cold: 10, sand: 5 },
{ country: 'AI', hot: 8, cold: 14, sand: 2 },
]
export default function BarChartExample() {
return (
<div style={{ height: 400 }}>
<ResponsiveBar
data={data}
keys={['hot', 'cold', 'sand']}
indexBy="country"
margin={{ top: 40, right: 130, bottom: 40, left: 60 }}
padding={0.3}
colors={{ scheme: 'nivo' }}
axisBottom={{
tickSize: 5,
tickPadding: 5,
tickRotation: 0,
}}
labelSkipWidth={12}
labelSkipHeight={12}
legends={[
{
dataFrom: 'keys',
anchor: 'bottom-right',
direction: 'column',
translateX: 120,
itemWidth: 100,
itemHeight: 20,
},
]}
animate={true}
/>
</div>
)
}核心概念与架构
模块化架构
Nivo 采用高度模块化的 monorepo 架构,每个图表类型和工具集都是独立的 npm 包:
@nivo/
├── core # 核心工具(主题、渲染、动画基础)
├── theming # 独立主题系统(v0.92.0+)
├── colors # 颜色工具(色板、渐变、图案)
├── scales # 比例尺工具(线性、对数、时间等)
├── axes # 坐标轴组件
├── legends # 图例工具
├── tooltip # Tooltip 基础组件
├── annotations # 标注工具
├── text # 文本渲染工具
├── voronoi # Voronoi 图工具
├── arcs # 弧形路径工具
├── canvas # Canvas 渲染工具
├── network # 网络/关系图
│
├── bar # 柱状图(SVG / Canvas)
├── line # 折线图(SVG)
├── pie # 饼图(SVG / Canvas)
├── sankey # 桑基图
├── chord # 弦图
├── heatmap # 热力图(SVG / Canvas)
├── circle-packing # 圆形打包图
├── treemap # 矩形树图
├── radar # 雷达图
├── scatterplot # 散点图
├── funnel # 漏斗图
├── bump # Bump 图(排名变化)
├── waffle # 华夫图
├── swarmplot # 群聚图
├── radial-bar # 径向柱图
├── parallel-coordinates # 平行坐标图
├── calendar # 日历图
├── sunburst # 旭日图
├── stream # 河流图
├── marimekko # Marimekko 图
├── icicle # Icicle 图(v0.94.0+)
├── rects # 矩形工具
└── mizu # Mizu 图
三种渲染引擎
Nivo 的核心差异化特性是提供三种渲染模式,每种模式各有适用场景:
| 渲染模式 | 组件后缀 | 特点 | 适用场景 |
|---|---|---|---|
| SVG | 默认 | 完整交互性、CSS 样式控制、动画支持、可访问性最佳 | 中小数据量、需要交互 |
| Canvas | *Canvas 后缀 | 高性能、GPU 加速、支持 100,000+ 数据点 | 大数据量、实时数据 |
| HTML | *HTML 后缀 | 基于 DOM、支持 SSR、可使用 HTML/CSS 样式 | SSR 场景、需要 CSS 动画 |
// 同一图表,三种渲染方式
import { Bar } from '@nivo/bar' // SVG 版
import { ResponsiveBarCanvas } from '@nivo/bar' // Canvas 版
import { BarHTML } from '@nivo/bar' // HTML 版(如支持)动画系统
Nivo 使用 react-spring 作为动画引擎,所有图表组件默认支持平滑过渡动画:
<ResponsiveBar
data={data}
animate={true} // 启用动画
motionConfig="gentle" // 动画配置:'gentle' | 'wobbly' | 'stiff' | 'slow'
transitionConfig={(spring) => ({ ...spring })} // 自定义 spring 配置
/>v0.98.0 升级了 react-spring 版本以支持 React 19。
主题系统
Nivo 提供完整的主题系统,从 v0.92.0 开始拆分为独立的 @nivo/theming 包:
import { ThemeProvider } from '@nivo/theming'
const customTheme = {
// 全局主题配置
}
function App() {
return (
<ThemeProvider theme={customTheme}>
{/* 所有内部图表自动继承主题 */}
<MyChart />
</ThemeProvider>
)
}核心特性
- 30+ 种图表类型:从基础图表到 Sankey、Chord、Icicle、Bump、Waffle 等高级可视化,种类远超同类库
- 三种渲染模式:SVG(交互)、Canvas(性能)、HTML(SSR),按数据量灵活选择
- 精美动画:基于 react-spring 的 spring-based 动画,数据变化时自动平滑过渡
- WCAG 2.1 AA 无障碍:React 图表库中唯一开箱满足无障碍标准的库,内置 ARIA labels 和键盘导航
- 交互式 Playground:在线可视化配置工具,实时调整参数并预览效果,自动生成代码
- 全面主题系统:细粒度的主题配置,支持颜色、字体、间距、边框等全方位定制
- Patterns & Gradients:支持图案填充(pattern)和渐变填充(gradient),增强视觉表现力
- 响应式设计:每个图表都提供
Responsive*变体,自动适配容器尺寸 - TypeScript 完整支持:所有组件提供强类型定义,TypeScript 5.8.3+ 支持
- HTTP API:可通过 API 服务端生成图表(适合报告生成场景)
- 模块化安装:按需安装,避免 bundle 膨胀
- SSR 支持:支持 Isomorphic / Server-side rendering(HTML 渲染模式)
生态图
关键依赖
| 依赖 | 用途 |
|---|---|
react-spring | 动画引擎 |
d3-scale | 比例尺计算 |
d3-shape | 图形路径生成 |
d3-color | 颜色处理 |
d3-time-format | 时间格式化 |
d3-hierarchy | 层级布局(treemap、sunburst) |
d3-sankey | Sankey 图布局 |
d3-chord | Chord 图布局 |
react-virtualized-auto-sizer | 响应式尺寸计算 |
lodash | 工具函数(v0.95.0 修复了依赖) |
社区生态
| 资源 | 说明 |
|---|---|
| Playground | nivo.rocks 内置交互式配置工具 |
| GitHub Discussions | 功能提议、问答交流 |
| Discord | 社区 Discord 频道 |
| Open Collective | opencollective.com/nivo 赞助支持 |
| 第三方组件 | 社区贡献的额外图表类型和工具 |
相关工具
| 工具 | 说明 |
|---|---|
nivo-api | 服务端图表生成 API(Docker 部署) |
storybook | Nivo 使用 Storybook 管理组件示例 |
chromatic | 视觉回归测试 |
适用场景
- 营销展示页面:Nivo 的精美动画和视觉效果最适合需要「好看」图表的场景,如品牌数据展示、年度报告页
- 多样化数据仪表盘:30+ 种图表类型覆盖从基础到高级的所有需求,一个库解决所有可视化需求
- 无障碍要求严格的项目:唯一开箱满足 WCAG 2.1 AA 标准的 React 图表库,适合政府、教育、医疗等合规场景
- 大数据量可视化:Canvas 渲染模式支持 100,000+ 数据点流畅渲染,适合实时监控和大规模数据展示
- SSR/SSG 项目:HTML 渲染模式支持服务端渲染,适合 Next.js 等框架的 SEO 友好图表页
- 需要高级图表类型的项目:Sankey(流量分析)、Chord(关系可视化)、Bump(排名变化)、Icicle(层级数据)等专业图表
- 数据产品原型快速搭建:Playground 工具允许非开发者快速调整和预览图表效果
开发与工程化
开发流程
# 克隆仓库
git clone https://github.com/plouc/nivo.git
cd nivo
# 安装依赖
pnpm install
# 启动 Storybook 开发环境
pnpm storybook
# 运行测试
pnpm test
# 类型检查
pnpm typecheck
# 构建所有包
pnpm build构建配置
Nivo 使用 monorepo 架构(Turborepo),每个包独立构建和发布:
packages/
├── bar/ → @nivo/bar
├── line/ → @nivo/line
├── pie/ → @nivo/pie
├── core/ → @nivo/core
├── theming/ → @nivo/theming
└── ... → 30+ packages
每个包输出 ES Module 和 CommonJS 格式,支持 tree-shaking。
工程化最佳实践
- 按需安装:只安装实际使用的图表包,避免 bundle 膨胀
- 共享主题配置:使用
ThemeProvider统一管理全局主题 - Canvas 渲染大数据:数据量超过 1,000 点时切换到 Canvas 变体
- TypeScript 严格模式:利用完整的类型定义避免配置错误
- Playground 调试:在 Playground 中调试配置后复制代码到项目中
性能与安全
性能特点
| 渲染模式 | 数据量 | 帧率 | 适用场景 |
|---|---|---|---|
| SVG | < 1,000 点 | 流畅 | 交互密集型 |
| SVG | 1,000-5,000 点 | 一般 | 静态展示 |
| Canvas | < 100,000 点 | 流畅 | 大数据量实时展示 |
| Canvas | 100,000+ 点 | 良好 | 大规模数据可视化 |
| HTML | < 500 点 | 流畅 | SSR 场景 |
性能优化建议
-
大数据量使用 Canvas 变体
// 数据量 > 1,000 点时切换 Canvas import { ResponsiveBarCanvas } from '@nivo/bar' -
关闭不需要的动画
<ResponsiveBar animate={false} /> // 大数据量时关闭动画 -
Memoize 数据和配置对象
const data = useMemo(() => rawData.map(transform), [rawData]) const theme = useMemo(() => createTheme(), []) -
避免在 legends 中使用过多条目
// 超过 20 个图例条目时考虑分组或分页 -
使用
isInteractive控制交互// 静态展示时关闭交互提升性能 <ResponsiveBar isInteractive={false} />
安全注意事项
- SVG 和 Canvas 渲染不直接执行用户代码,XSS 风险较低
- 自定义
tooltip和renderWrapper时避免使用dangerouslySetInnerHTML - 颜色配置(
colorsprop)接受函数,注意避免注入
已知性能瓶颈
- 多图表页面中,每个图表独立的动画可能导致主线程压力
- SVG 模式下超过 5,000 个数据点时性能急剧下降
ResponsiveContainer在高频 resize 场景下需要 debounce- 复杂主题配置在大量图表实例化时可能影响初始化速度
技术对比
| 维度 | Nivo | Recharts | Victory | visx | ECharts |
|---|---|---|---|---|---|
| 图表类型数量 | 30+ | 15+ | 10+ | 原语级 | 20+ |
| 渲染模式 | SVG/Canvas/HTML | 仅 SVG | 仅 SVG (Web) | SVG | Canvas/SVG |
| 无障碍 | WCAG 2.1 AA ✅ | 一般 | 一般 | 需自建 | 一般 |
| 动画质量 | 极佳 (react-spring) | 良好 | 良好 | 需自建 | 优秀 |
| 学习曲线 | 中等(配置多) | 低 | 中等 | 高 | 中等 |
| 配置复杂度 | 高(props 多) | 低 | 中等 | 低(灵活) | 高 |
| Bundle Size | 按模块安装 | ~140KB | ~200KB | ~100KB | ~300KB |
| 跨平台 | ❌ 仅 Web | ❌ 仅 Web | ✅ Web + RN | ❌ 仅 Web | ❌ 仅 Web |
| SSR 支持 | ✅ (HTML 模式) | 一般 | 一般 | ✅ | ❌ |
| Playground | ✅ 优秀 | ✅ 基础 | ❌ | ❌ | ✅ 优秀 |
选型建议
- 需要精美视觉效果 → Nivo(动画和主题系统最出色)
- 快速搭建后台图表 → Recharts(学习成本最低)
- 无障碍合规要求 → Nivo(唯一满足 WCAG 2.1 AA)
- 超大规模数据集 → Nivo Canvas 变体 / ECharts
- Web + React Native → Victory
- 极致自定义 → visx
- 需要高级图表类型(Sankey、Chord 等) → Nivo
最佳实践
生产环境推荐模式
-
统一主题管理
// themes/chart-theme.ts export const chartTheme = { background: 'transparent', textColor: 'var(--text-primary)', // ... } // app.tsx import { ThemeProvider } from '@nivo/theming' <ThemeProvider theme={chartTheme}> <App /> </ThemeProvider> -
大数据量自动降级
function SmartBarChart({ data }) { const useCanvas = data.length > 1000 const Component = useCanvas ? ResponsiveBarCanvas : ResponsiveBar return <Component data={data} /* ... */ /> } -
Playground 配置导出
// 在 Playground 中调试好配置后,导出为代码 // nivo.rocks → 配置完成 → 复制代码 -
图表懒加载
// 使用 React.lazy 延迟加载非首屏图表 const SankeyChart = lazy(() => import('./charts/SankeyChart'))
常见陷阱
| 陷阱 | 说明 | 解决方案 |
|---|---|---|
| 配置项过多 | Nivo 的 props 数量远超 Recharts | 使用默认值 + 只覆盖必要配置 |
| Canvas 版不支持某些特性 | Canvas 版缺少部分 SVG 交互 | 查看文档确认 Canvas 版支持范围 |
| 动画与 SSR 冲突 | 动画在 SSR 环境可能导致不匹配 | SSR 场景使用 animate={false} |
| 主题嵌套覆盖 | 深层嵌套组件主题不生效 | 使用 ThemeProvider 统一注入 |
| 包体积膨胀 | 安装过多模块 | 按需安装,使用 bundle analyzer 检查 |
| Responsive 尺寸问题 | 父容器未设置明确高度 | 确保父容器有 height 或使用 style={{ height: 400 }} |
技术局限与边界
已知限制
- 无 v1.0 发布计划:目前仍在 0.x 版本阶段,API 可能存在 breaking changes
- 个人维护风险:项目高度依赖 Raphaël Benitte 个人投入,长期可持续性存在不确定性
- 配置复杂度高:组件 props 数量多,简单图表也需要较多配置
- Canvas 版功能不全:Canvas 变体缺少部分 SVG 版的交互和样式功能
- 不支持 React Native:仅限 Web 使用
- 文档不够完善:部分高级功能缺少详细文档,需要 trial & error 或阅读源码
- 社区规模中等:相比 Recharts(900 万周下载量),社区资源和第三方教程较少
不适用场景
- 极简图表需求:如果只需要简单的柱状图/折线图,Recharts 更轻量
- React Native 跨平台:需选择 Victory
- 需要 D3 级别底层控制:考虑 visx 或 D3 直接使用
- 非 React 项目:Nivo 是 React 专属库,非 React 项目选择 ECharts / Chart.js
迁移注意事项
- 从 Recharts 迁移:数据格式兼容(都是对象数组),但组件 API 完全不同,需要重写
- 从 Nivo 0.8x 升级到 0.9x:v0.92.0 引入
@nivo/theming独立模块,需检查主题配置兼容性 - 迁移到其他库:数据层迁移成本低,组件层需重写
- Canvas ↔ SVG 切换:同一图表类型的 SVG 和 Canvas 版 API 基本一致,切换成本较低
学习资源
- 官方文档与 Playground:https://nivo.rocks(最佳学习入口,交互式配置工具)
- GitHub 仓库:https://github.com/plouc/nivo
- GitHub Discussions:功能提议和问答交流
- Discord 社区:实时交流和求助
- Open Collective:opencollective.com/nivo(赞助支持)
- Storybook 示例:本地
pnpm storybook查看组件示例 - 博客文章:Raphaël Benitte 在 Medium / Twitter 分享的设计思路
- YouTube 教程:搜索 "Nivo React" 有视频教程
2026 年现状
最新版本
- v0.99.0(2025 年 5 月 23 日):当前最新版本
- 2025 年 4-5 月密集发布了 v0.92.0 → v0.99.0 共 10 个版本
- 仍处于 0.x 版本阶段,无 v1.0 发布计划
近期重要更新
| 版本 | 主要变更 |
|---|---|
| v0.99.0 | @nivo/bar 调整、scales guide 改进 |
| v0.98.0 | 升级 react-spring 支持 React 19 |
| v0.97.0 | 使用 react-virtualized-auto-sizer 改进响应式 |
| v0.96.0 | 多个图表支持 ref 引用 |
| v0.95.0 | Icicle 图 a11y 改进、lodash 依赖修复 |
| v0.93.0 | TypeScript 5.8.3、ESLint 升级 |
| v0.92.0 | 引入 @nivo/theming 独立模块 |
发展趋势
- React 19 兼容:已通过 v0.98.0 实现
- TypeScript 持续改进:升级到 5.8.3,类型定义不断完善
- 无障碍加强:持续改进各图表的 a11y 支持
- 模块化深化:将更多功能拆分为独立模块
- 社区功能请求:CandleStick、Word Cloud 等图表在讨论中
社区活跃度
- GitHub Stars ~14,000
- npm 周下载量 ~650,000
- Open Issues ~37 个(维护积极)
- 2025 年保持密集的版本发布节奏
- 多个 2026 年横评文章推荐 Nivo(LogRocket、PkgPulse、Querio.ai 等)
风险评估
- 个人项目风险:高度依赖单一维护者,如果维护者无法继续投入,项目可能停滞
- 版本稳定性:0.x 版本意味着 API 可能在未来出现 breaking changes
- 企业使用建议:锁定版本、关注更新、必要时做好 fork 准备