RedwoodJS 实战:用 Tremor 快速搭建数据可视化 Dashboard
后端前端Web框架开发工具【免费下载链接】redwoodRedwoodGraphQL项目地址https://gitcode.com/gh_mirrors/re/redwood点击查看免费下载本篇指南以 RedwoodJS 官方 How-to 文档docs/docs/how-to/build-dashboards-fast-with-tremor.md为骨架完整讲解如何在新建或已有的 RedwoodJS 应用中集成 Tremor 组件库从零搭建一个包含响应式网格布局、面积图AreaChart和 KPI 指标卡片的 Dashboard 页面。读完本文你将掌握 Tremor 在 RedwoodJS monorepo 中的安装与配置方法、Tailwind CSS 的接入细节以及如何用卡片、图表、进度条等组件快速产出可运行的仪表盘并了解如何结合 RedwoodJS Cells 把静态数据升级为 GraphQL 驱动的动态数据看板。Tremor 与 RedwoodJS为什么两者很搭Tremor 是一套用于快速构建 Dashboard 的 React 组件库组件采用模块化设计且完全开源由重视设计的数据科学家与软件工程师共同维护。它提供开箱即用的卡片Card、指标Metric、图表AreaChart / BarChart / LineChart 等、进度条ProgressBar和徽章BadgeDelta等组件配合 Tailwind CSS 即可在极短时间内组装出观感专业的仪表盘。RedwoodJS 是典型的 monorepo 结构一个应用同时包含api与web两个 workspace。这意味着第三方前端依赖如 Tremor应通过 yarn workspace 精确安装到web侧而不是全局安装。这一点贯穿了本文全部安装命令也是 RedwoodJS 官方文档反复强调优先使用 yarn 而非 npm的根本原因——yarn workspace 是管理这种多包结构的标准方式。第一步创建新的 RedwoodJS 项目如果你还没有项目在终端中执行yarn create redwood-app my-project --ts注意如果你已经有 RedwoodJS 项目可以跳过这一步直接进入下一节。 如果不想要 TypeScript 项目省略--ts标志即可。重要RedwoodJS 偏好 yarn 而非 npm因为项目是包含api和web两个 workspace 的 monorepo。后续安装 Tremor 及其他 web 侧包时都使用 yarn workspace。第二步用 Redwood CLI 安装并配置 Tailwind CSSTremor 的样式完全建立在 Tailwind CSS 之上因此必须先为 web 侧接入 Tailwind。Redwood 提供了专用的 setup 命令yarn rw setup ui tailwindcss这条命令并非简单地往package.json里塞依赖从 CLI 的源码packages/cli/src/commands/setup/ui/libraries/tailwindcss.js可以看到它实际完成了一整套工程化配置安装依赖在项目根目录安装prettier-plugin-tailwindcss用于按 Tailwind 官方约定自动排序 class在webworkspace 安装postcss、postcss-loader、tailwindcss^3.4.17、autoprefixer该文件中的webWorkspacePackages与projectPackages常量明确定义了这些包。生成 PostCSS 配置从模板写入web/config/postcss.config.js若文件已存在且未加--force会直接报错终止。初始化 Tailwind 配置执行yarn tailwindcss init生成web/config/tailwind.config.js并把默认的content: []替换为content: [src/**/*.{js,jsx,ts,tsx}]。注入指令在web/src/index.css顶部写入tailwind base;、tailwind components;、tailwind utilities;三条指令若已存在则跳过。可选优化如果存在scaffold.css会询问是否覆盖为 Tailwind 版本如果检测到 VS Code会推荐安装 PostCSS Language Support 与 Tailwind CSS IntelliSense 扩展并自动在.vscode/settings.json中加入tailwindCSS.classAttributes配置让 Tailwind 插件能识别 Redwood 特有的activeClassName、errorClassName等属性。美化代码在prettier.config.js中注册prettier-plugin-tailwindcss插件并指向tailwind.config.js。对应的测试packages/cli/src/commands/setup/ui/tests/tailwindcss.test.ts还验证了install: false时跳过安装、指令已存在时跳过写入、非 VS Code 环境跳过扩展配置等边界行为说明这条命令具备良好的幂等性与可重入性。如果你希望完全控制每一步也可以参考--force与--install两个可选参数-f覆盖已有配置、-i控制是否安装依赖。第三步在 web workspace 中安装 Tremor 与 Heroicons在webworkspace 安装 Tremoryarn workspace web add tremor/react再安装 1.0.6 版本的 heroiconsTremor 内部图表与徽章依赖的图标库yarn workspace web add heroicons/react1.0.6说明yarn workspace web add ...会把依赖写入web/package.json而不是根目录package.json这与 RedwoodJS 的 monorepo 约定保持一致。第四步更新 Tailwind 配置让 Tremor 的样式参与编译Tremor 组件的样式同样以 Tailwind class 形式存在必须把node_modules中的 Tremor 源码目录加入 Tailwind 的content扫描路径否则页面上的组件会裸奔无样式。打开web/config/tailwind.config.js改成/** type {import(tailwindcss).Config} */ module.exports { content: [ src/**/*.{js,jsx,ts,tsx}, ../node_modules/tremor/**/*.{js,ts,jsx,tsx}, ], theme: { extend: {}, }, plugins: [], }注意node_modules的路径前缀是../因为webworkspace 位于根目录的子目录中node_modules 实际提升到了 monorepo 根目录下yarn hoisting 的默认行为。第五步生成 Dashboard 页面并渲染第一张面积图生成页面与路由yarn rw g page dashboard /生成器会在web/src/pages/DashboardPage/DashboardPage.tsx创建页面文件并在web/src/Routes.tsx中注册根路径路由// web/src/Routes.tsx Route path/ page{DashboardPage} namedashboard /写入 DashboardPage 组件将下面的内容粘贴到DashboardPage.tsx它演示了 Tremor 最核心的布局三件套Grid、Col、Card与面积图AreaChart的组合用法import { Grid, Col, Card, Title, AreaChart } from tremor/react import { MetaTags } from redwoodjs/web const DashboardPage () { const chartdata [ { date: Jan 22, SemiAnalysis: 2890, The Pragmatic Engineer: 2338, }, { date: Feb 22, SemiAnalysis: 2756, The Pragmatic Engineer: 2103, }, { date: Mar 22, SemiAnalysis: 3322, The Pragmatic Engineer: 2194, }, { date: Apr 22, SemiAnalysis: 3470, The Pragmatic Engineer: 2108, }, { date: May 22, SemiAnalysis: 3475, The Pragmatic Engineer: 1812, }, { date: Jun 22, SemiAnalysis: 3129, The Pragmatic Engineer: 1726, }, ] const dataFormatter (number: number) { return $ Intl.NumberFormat(us).format(number).toString() } return ( div classNamem-12 MetaTags titleDashboard descriptionDashboard page / h1 classNametext-2xl mb-12Dashboard/h1 Grid numCols{1} numColsSm{2} numColsLg{3} classNamemy-8 gap-6 Col numColSpan{1} numColSpanLg{3} Card TitleNewsletter revenue over time (USD)/Title AreaChart classNameh-72 mt-4 data{chartdata} indexdate categories{[SemiAnalysis, The Pragmatic Engineer]} colors{[indigo, green]} valueFormatter{dataFormatter} / /Card /Col /Grid /div ) } export default DashboardPage组件与关键 props 解读组件作用本示例关键 propsGrid响应式栅格容器是整个布局的骨架numCols{1}默认 1 列、numColsSm{2}sm 断点 2 列、numColsLg{3}lg 断点 3 列Col栅格中的单元格控制跨列numColSpan{1}基础跨 1 列、numColSpanLg{3}大屏跨满 3 列让图表独占一行Card统一样式的卡片容器classNamemax-w-lg等 Tailwind classTitle卡片标题文字直接包裹文本AreaChart面积图data数据数组、indexX 轴字段这里是date、categories要绘制的数据系列字段数组、colors每系列颜色取自 Tailwind 色板如indigo、green、valueFormatter数值格式化函数其中dataFormatter使用浏览器内置的Intl.NumberFormat把数字格式化为货币形式如$ 2,890valueFormatter会同时作用于坐标轴刻度与 Tooltip保证整个图表数字风格统一。classNameh-72 mt-4则通过 Tailwind 工具类控制图表高度与上边距。页面顶部的MetaTags来自redwoodjs/web它负责输出title以及 Open Graph / Twitter 相关的 SEO 元信息。从源码packages/web/src/components/MetaTags.tsx可以看到传入title与description后它会通过react-helmet-async渲染title、og:title、og:description等标签在开启流式 SSRRWJS_EXP_STREAMING_SSR时则切换为 PortalHead 实现。启动开发服务器yarn rw dev应用启动后访问首页即可看到一张包含两条数据系列SemiAnalysis与The Pragmatic Engineer的 Newsletter 收入面积图。此时图表数据是硬编码在组件里的静态数据。第六步封装可复用的 KPI 卡片组件Dashboard 通常需要一排核心指标Key Performance Indicator。先用 Redwood 生成器创建组件yarn rw g component KpiCard生成器会在web/src/components/KpiCard/KpiCard.tsx创建组件文件。接着替换为下面的实现它组合了Card、Flex、Text、Metric、BadgeDelta与ProgressBar六种 Tremor 组件// /web/src/components/KpiCard/KpiCard.tsx import { BadgeDelta, DeltaType, Card, Flex, Metric, ProgressBar, Text, } from tremor/react export type Kpi { title: string metric: string progress: number metricTarget: string delta: string deltaType: DeltaType } interface Props { kpi: Kpi } const KpiCard ({ kpi }: Props) { return ( Card classNamemax-w-lg Flex alignItemsstart div Text{kpi.title}/Text Metric{kpi.metric}/Metric /div BadgeDelta deltaType{kpi.deltaType}{kpi.delta}/BadgeDelta /Flex Flex classNamemt-4 Text classNametruncate{${kpi.progress}% (${kpi.metric})}/Text Text{kpi.metricTarget}/Text /Flex ProgressBar percentageValue{kpi.progress} classNamemt-2 / /Card ) } export default KpiCardKpiCard 的设计要点类型先行通过export type Kpi显式声明了数据契约标题、指标值、进度、目标值、环比变化与变化类型deltaType: DeltaType直接复用了 Tremor 导出的类型保证BadgeDelta的deltaType取值合法。布局外层Card classNamemax-w-lg用 Tailwind 工具类收窄卡片宽度Flex alignItemsstart让左侧标题/指标与右侧徽章顶部对齐第二行Flex用truncate防止长文本溢出并排展示当前进度 目标值。信息密度BadgeDelta用不同颜色语义化呈现环比涨跌如increase绿色、decrease红色、moderateIncrease浅绿等ProgressBar percentageValue{kpi.progress}则直观展示完成度。第七步把 KPI 卡片接入 Dashboard导入组件与类型import KpiCard from src/components/KpiCard/KpiCard // Import the KpiCard component import type { Kpi } from src/components/KpiCard/KpiCard // Import the Kpi type这里使用 Redwood 配置的src/别名指向web/src目录。准备示例 KPI 数据const kpis: Kpi[] [ // Create some sample KPI data { title: Sales, metric: $ 12,699, progress: 15.9, metricTarget: $ 80,000, delta: 13.2%, deltaType: moderateIncrease, }, { title: Profit, metric: $ 45,564, progress: 36.5, metricTarget: $ 125,000, delta: 23.9%, deltaType: increase, }, { title: Customers, metric: 1,072, progress: 53.6, metricTarget: 2,000, delta: 10.1%, deltaType: moderateDecrease, }, ]遍历渲染 KPI 卡片在Grid内部遍历kpis为每个数据项渲染一个占 1 列的Col{kpis.map((kpi, i) ( Col key{i} numColSpan{1} KpiCard kpi{kpi} / /Col ))}完整的 DashboardPage合并以上内容后页面完整代码如下import { Grid, Col, Card, Title, AreaChart } from tremor/react import { MetaTags } from redwoodjs/web import KpiCard from src/components/KpiCard/KpiCard // Import the KpiCard component import type { Kpi } from src/components/KpiCard/KpiCard // Import the Kpi type const DashboardPage () { const chartdata [ { date: Jan 22, SemiAnalysis: 2890, The Pragmatic Engineer: 2338, }, { date: Feb 22, SemiAnalysis: 2756, The Pragmatic Engineer: 2103, }, { date: Mar 22, SemiAnalysis: 3322, The Pragmatic Engineer: 2194, }, { date: Apr 22, SemiAnalysis: 3470, The Pragmatic Engineer: 2108, }, { date: May 22, SemiAnalysis: 3475, The Pragmatic Engineer: 1812, }, { date: Jun 22, SemiAnalysis: 3129, The Pragmatic Engineer: 1726, }, ] const kpis: Kpi[] [ // Create some sample KPI data { title: Sales, metric: $ 12,699, progress: 15.9, metricTarget: $ 80,000, delta: 13.2%, deltaType: moderateIncrease, }, { title: Profit, metric: $ 45,564, progress: 36.5, metricTarget: $ 125,000, delta: 23.9%, deltaType: increase, }, { title: Customers, metric: 1,072, progress: 53.6, metricTarget: 2,000, delta: 10.1%, deltaType: moderateDecrease, }, ] const dataFormatter (number: number) { return $ Intl.NumberFormat(us).format(number).toString() } return ( div classNamem-12 MetaTags titleDashboard descriptionDashboard page / h1 classNamemb-12 text-2xlDashboard/h1 Grid numCols{1} numColsSm{2} numColsLg{3} classNamemy-8 gap-6 {kpis.map((kpi, i) ( Col key{i} numColSpan{1} KpiCard kpi{kpi} / /Col ))} Col numColSpan{1} numColSpanLg{3} Card TitleNewsletter revenue over time (USD)/Title AreaChart classNamemt-4 h-72 data{chartdata} indexdate categories{[SemiAnalysis, The Pragmatic Engineer]} colors{[indigo, green]} valueFormatter{dataFormatter} / /Card /Col /Grid /div ) } export default DashboardPage页面结构一目了然Grid在小屏 1 列、中屏 2 列、大屏 3 列3 张 KPI 卡片各占 1 列排成一行图表Col通过numColSpanLg{3}在大屏跨满整行。保存后回到浏览器你的第一个 Dashboard 就完成了。进阶方向用 Cells 把静态数据变成动态 Dashboard当前图表与 KPI 展示的都是硬编码静态数据。要让 Dashboard 真正活起来RedwoodJS 提供了 Cells 这一数据驱动模式一个 Cell 文件同时声明 GraphQL 查询、加载态、空态与成功态Redwood 在编译期基于查询自动生成对应的 GraphQL 操作并接入数据获取层。具体做法是在api侧基于 Prisma 定义数据模型并编写 ServiceGraphQL 解析函数然后在web侧创建一个 Cell如DashboardCell.tsx在 Cell 的QUERY中查询所需字段把查询结果映射为本文定义的Kpi[]与chartdata结构再交给KpiCard与AreaChart渲染。Redwood 会自动处理加载、空数据与错误三种状态你只需聚焦展示层。Cells 的完整概念与语法见 docs/docs/cells.mdCells 的底层实现createCell如何组合查询、加载与失败状态可阅读 packages/web/src/components/cell/createCell.tsx 及其测试 packages/web/src/components/cell/createCell.test.tsxService 层的编写规范见 docs/docs/services.md。本仓库的docs目录中还保留了该主题的其他版本文档例如 docs/versioned_docs/version-6.x/how-to/build-dashboards-fast-with-tremor.md 与最新版 docs/docs/how-to/build-dashboards-fast-with-tremor.md内容与本文完全一致可对照阅读。小结至此你已经完成了 Tremor 在 RedwoodJS 中的完整落地通过yarn rw setup ui tailwindcss一键接入 Tailwind 工具链用yarn workspace web把 Tremor 安装进web侧更新tailwind.config.js让组件样式参与编译再以Grid/Col/Card/AreaChart/Metric/ProgressBar等组件组装出包含图表与 KPI 卡片的响应式 Dashboard。剩余的工作就是继续探索 Tremor 的其他组件与 Blocks 来展示更多数据并借助 RedwoodJS Cells 把静态示例数据替换为 Prisma 数据库 GraphQL 驱动的真实数据。赞分享后端前端Web框架开发工具【免费下载链接】redwoodRedwoodGraphQL项目地址https://gitcode.com/gh_mirrors/re/redwood点击查看免费下载相关推荐RedwoodJS Tremor 实战快速构建数据可视化 DashboardRedwoodJS Tremor 实战快速构建数据可视化 Dashboard 导读 Tremor 是一套专注于快速构建仪表盘Dashboard的开源后端前端Web框架开发工具如何自动下载B站UP主最新视频智能监测与4K高清下载指南如何自动下载B站UP主最新视频智能监测与4K高清下载指南 B站个人动态视频下载助手是一款基于Node.js开发的智能工具它能自动监测你关注的B站UP主个人动后端前端Web框架开发工具在 RedwoodJS 中用 Tremor 快速构建数据仪表盘Dashboard实战指南在 RedwoodJS 中用 Tremor 快速构建数据仪表盘Dashboard实战指南 导读 本指南基于 RedwoodJS 官方文档 Build Das后端前端Web框架开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考