做管理后台的,应该都挨过表格的「毒打」。 业务说要翻日志、看明细、拉大表,再顺嘴加一句:数据量不大,就几万条~ 结果一上线,接口那边直接给你塞几十万行,DOM 节点瞬间炸开花,滚动一下掉帧肉眼可见,Chrome 风扇转得比你加班还勤快。
很多同学第一反应是:再优化优化,分页再细一点,表格再懒加载一下。 但传统基于 DOM 的 table,本质瓶颈就摆在那儿:每个单元格都是一个节点,列多一点,再给你来点固定列、复杂样式,浏览器压力很快拉满。 你能做的无非就是不停「挤牙膏」,调这边砍那边,治标不治本。
最近在 GitHub 上刷项目,刷到一个看着就很「野路子」的组件:Glide Data Grid。 它直接绕过 DOM,基于 Canvas 来渲染整张数据表,把单元格当像素画。 这波操作我服了——渲染压力从「几万个节点」变成「一块画布」,浏览器瞬间轻松不少。 官方吹的是能流畅处理百万级行数据,实际体验就是:你滚到手酸,它还在稳稳 60 帧。
它没搞花里胡哨的自制滚动条,而是走原生滚动,配合按需渲染: 视口看到哪儿,就只画哪儿的单元格,离屏的直接不管。 这种虚拟化 + Canvas 的组合,在长列表、海量表格这种场景里,简直是对 DOM 表格降维打击。
功能上也不是那种「只会跑分」的实验品,而是能直接上生产的那种。 列支持拖拽调整顺序、拖拽改宽度,行高可以变化,单元格可以合并。 行列单选、多选都支持,框选一片区域那套也有,操作手感很接近 Excel。 顶部想做个搜索框?内置搜索功能已经帮你铺好了路。 日常用的冻结列,它也一并做了,左边锁住关键字段,右边随便拉。
单元格类型这块也不佛系,支持多种类型和内置编辑,常见的输入、数字、选择之类能直接用。 要玩高级一点的,支持自定义单元格渲染,你可以在 Canvas 上画标签、进度条、小图标,甚至迷你图表,都没问题。 对产品同学提出的那些「能不能这里再加个提示点」「这列要渐变背景」之类的需求,也有了更多腾挪空间。
兼容性方面,它支持 React 16 到 19 全版本,老项目不至于直接被劝退,新项目上来就能接。 对前端同学来说,就是一个普通的 React 组件,用起来没有什么奇怪的心智负担。 你可以先在某个独立模块里试水,比如日志查看、订单明细,再慢慢替换掉原来那些一滚就卡的老表格。
如果你的后台现在一打开就是「表格撑满一屏」,每次拉滚动条都能听见显卡在哭,那真的可以给 Glide Data Grid 一个上场机会。 说不定你下一个版本更新日志的亮点,就是那句——「表格滚动终于不再卡了」。