使用 @chet 使用 Pretext 构建创意浏览器演示。
@chenglou/pretext 是一个 15KB 零依赖 TypeScript 库,用于无 DOM 多行文本测量和布局。它做一件事:给定 (text, font, width),返回换行、每行宽度、每个字素的位置和总高度——全部通过 canvas 测量,无重排。
这是一个创意原语:你可以在 60fps 下让段落围绕移动的精灵重排、构建关卡几何由真实单词组成的游戏、驱动 ASCII logo 穿过散文、用精确的每个字素起始位置将文本粉碎成粒子。
每个演示单个自包含 HTML 文件。无构建步骤。
| 层 | 工具 | 目的 |
|---|---|---|
| 核心 | @chenglou/pretext via esm.sh | 文本测量 + 行布局 |
| 渲染 | HTML5 Canvas 2D | 字形渲染、每帧合成 |
| 分段 | Intl.Segmenter | emoji / CJK / 组合标记的字素分割 |
const prepared = prepare(text, "16px Inter");
const { height, lineCount } = layout(prepared, 320, 20);
你仍然让浏览器绘制文本。Pretext 只是告诉你盒子在给定宽度下有多高。
const prepared = prepareWithSegments(text, FONT);
const { lines } = layoutWithLines(prepared, 320, 26);
for (let i = 0; i < lines.length; i++) {
ctx.fillText(lines[i].text, 0, i * 26);
}
这是创意工作所在。你拥有绘制,所以你可以渲染到 canvas、SVG、WebGL 或任何坐标系。
| 模式 | 关键 API | 示例想法 |
|---|---|---|
| 围绕障碍重排 | layoutNextLineRange | 围绕拖动的光标精灵分开的编辑段落 |
| 文本即几何游戏 | layoutWithLines | 每个砖块是测量单词的打砖块 |
| 粉碎 / 粒子 | walkLineRanges | 点击时爆炸成字母的句子 |
| 动态排版 | layoutWithLines | 星球大战爬行、波浪、弹跳 |
prepare() 是昂贵调用。每个 text+font 对执行一次。缓存句柄。layout()——永不重新 prepare。ctx.font 设置惊人地慢;每帧设置一次。
评论区