leeoniya/uWrap

一个小于 2KB (min),速度快 10 倍且更准确的文本换行工具。

leeoniya.github.io/uWrap/demo

License

MIT license

**uWrap ** Public

⏎ μWrap

一个速度快 10 倍 且更准确的文本换行工具,体积小于 < 2KB (min) (MIT Licensed)

Introduction

uWrap 的存在是为了有效地预测列表和网格 virtualization 的不同行高,这是一种在渲染大型可滚动数据集时优化 UI 性能的技术。 事实证明,既快速又准确地执行此操作并非易事,因为 Canvas2D 没有提供文本换行的 API,并且 measureText() 的开销很大; 由于性能不佳,通过 DOM 进行测量也不是一个好的选择。 此外,字体大小、可变宽度字体、letter-spacing、显式换行符和不同的 white-space 选项都会影响换行的行数。

注意:

Performance

uWrap 在 CPU 和内存使用方面都明显优于 canvas-hypertxt,同时在准确性方面也 更胜一筹

下面的基准测试在宽度介于 50px 和 250px 之间的随机框中换行 100,000 个随机句子。 您可以在 demo page 的 DevTools 控制台中实时查看此内容。

Chrome 135 | Firefox 137 | Safari 18.1 ---|---|--- uWrap | 82ms | 90ms | 185ms canvas-hypertxt | 770ms | 1660ms | 1430ms

Installation

npm i uwrap

<script src="./dist/uWrap.iife.min.js"></script>

API

一个 10 行代码的 uWrap.d.ts TypeScript 定义文件。

Usage

// 导入使用 pre-line 策略包装可变宽度字体的 util
import { varPreLine } from 'uwrap';
// 创建一个具有所需字体设置的 Canvas2D 上下文
let ctx = document.createElement('canvas').getContext('2d');
ctx.font = "14px Inter, sans-serif";
ctx.letterSpacing = '0.15px';
// 初始化 util 函数
const { count, test, split } = varPreLine(ctx);
// 示例文本
let text = 'The quick brown fox jumps over the lazy dog.';
// 计算行数
let numLines = count(text, width);
// 测试文本是否会换行
let willWrap = test(text, width);
// 分割行(带有可选的限制)
let lines = split(text, width, 3);

About

一个小于 2KB (min),速度快 10 倍且更准确的文本换行工具。

leeoniya.github.io/uWrap/demo

Topics

canvas canvas2d word-wrap text-wrap text-wrapping line-counting line-count word-wrapping

Resources

Readme

License

MIT license

Stars

50 stars

Watchers

1 watching

Forks

1 fork