写点什么

Warper:由 Rust 驱动的 React 虚拟化库

作者:Daniel Curtis
  • 2026-03-04
    北京
  • 本文字数:1246 字

    阅读完需:约 4 分钟

Warper 是一个由 Rust 和 WebAssembly 驱动的开源 React 虚拟化库,近日发布了 7.x 版本,带来性能优化、改进的打包工具兼容性以及更完善的开发者工具支持。

 

Warper 7.2 引入了多项改进,包括在性能关键路径中使用 TypedArrays 实现零分配、用于帧时间统计的 O(1) 环形缓冲区操作、对主流打包工具的全面支持,以及适配不同设备视口的响应式示例。

 

该库在虚拟化实现上采取了与众不同的方式:将滚动计算卸载到由 Rust 编译而成的 WebAssembly 模块中。包括二分查找、范围计算和偏移量查找等性能关键操作,都在编译后的 WASM 中运行,而非 JavaScript。库内部维护了一棵 Fenwick 树(又称二叉索引树)来记录元素高度,从而支持 O(log n) 的前缀和查询,以及针对固定高度元素的 O(1) 查找。

 

v7 的一个关键变化是在性能关键路径中用 TypedArrays(如 Int32Array、Float64Array)替代普通数组,从而在滚动过程中消除垃圾回收压力。本次发布还将用于帧时间统计的 push()/shift() 操作替换为常数时间复杂度的环形缓冲区操作,解决了早期版本中因频繁分配带来的性能问题。

 

开始使用 Warper 只需安装一个包:

npm install @itsmeadarsh/warper
复制代码

 

基础用法通过 useVirtualizer hook 实现,该 hook 会返回用于渲染的可视范围和偏移量:

import { useVirtualizer } from "@itsmeadarsh/warper";
复制代码

 

Warper 声称相比现有方案具有显著的性能优势。根据开发者在 Reddit 上分享的基准测试数据,在 100,000 个项目的测试中,react-window 的帧率约为 40 FPS,而 Warper 达到 120 FPS。当项目数量增加到 1,000,000 时,差距进一步扩大:react-window 降至约 12 FPS,而 Warper 仍维持在 118 FPS。

 

React 虚拟化领域已有多个成熟库。react-window 近期发布了2.0 版本,支持自动尺寸计算和原生 TypeScript,压缩后体积约 6KB,是当前最轻量的选项。TanStack Virtual 提供无头(headless)、与框架无关的方案,体积约 12KB。react-virtualized 功能丰富,但压缩后约 25KB,通常被视为较重的选择。Warper 压缩后约 8.7KB,是这一组中唯一使用 WebAssembly 引擎的库。

 

社区反馈褒贬不一。在 Reddit 上,有用户对这一技术路线表示赞赏,但质疑实际需求:

宣传的数据确实很惊人。但说实话,谁真的需要渲染 1000 万条数据?

 

另一位用户回应:

1000 万条只是压力测试,用来展示在极端大规模场景下的表现。但在金融行业等领域,确实存在需要处理 1000+ 行表格的场景。

 

还有一些用户报告了在 Firefox 中的兼容性问题,其中一位指出:

给出的示例在 Chrome 中滚动到 588,673 行就无法继续了,所以“支持 100 万+ 行”的说法,在我测试的浏览器中并未得到验证。

 

对此,作者回应:

我猜这是 Chrome 默认的最大滚动限制。

 

在包体积方面,该项目也有明显改进。早期开发版本体积超过 50KB,而开发者已将其优化至压缩后约 5.9KB,并表示性能没有损失。目前已默认支持 Vite、Webpack、Rollup、esbuild、Parcel 以及 Next.js 等主流打包工具。

 

相关文档可在项目的 GitHub 代码库中查看。Warper 以 MIT 许可证开源发布。