Repository navigation
Releases: TWFU-wcy/dsh-scroll-boost
Release list
v0.4.1 — 展开后的行也会跟着重测
v0.4.1 — 展开后的行也会跟着重测
修了什么
- 展开思考过程 / 工具输出后滚动会跳:行被标记后
--sb-h的旧值会一直留着。现在带
data-expanded/data-open/data-chat-motion/hidden的元素一旦变化,插件只重新测量
它所在的那一行,把新高度写回占位。行滚出视野再滚回来时,滚动条位置不再跳。 - 行内 sticky 不再被无谓跳过:
content-visibility只在行离屏时生效,行在视口内没有
containment,折叠头、代码块横幅照常吸顶。实测两种模式下截图与几何完全一致,因此sticky
这一条跳过规则被移除,含 sticky 子元素的行现在也会被优化。 - 属性变化不再扫描整个对话:旧实现收到一次
data-expanded变化会遍历页面里所有已标记行,
展开一个大块时是 O(行数) 的扫描。现在只在target.closest("[data-scrollboost-row]")上处理。 - 轨迹表的每帧重建不再触发扫描:
[data-trajectory-scroll]内的新增节点被忽略,切换标签页
时不再为此排队一次文档扫描。
实测
- 600 行聊天复刻页:
rows 600 / marked 600 / skipped 0,首帧可见标记 20ms,scrollHeight
28470 → 28462(-8px,亚像素舍入),--sb-h保留两位小数。 - sticky 行验证:
contain-intrinsic-size与真实高度一致时,scrollTop、行位置、吸顶位置、
scrollHeight与无插件时完全相同。 npm test:meta / regression / smoke 全过;npm run test:browser:chat 600 行、drift 夹具、
轨迹静态规则全部通过。
v0.4.0 — 轨迹页静态规则
轨迹页修复:0.3.0 把轨迹页整面跳过了,这一版用一条静态 CSS 规则补回来,画面零变化。
问题
0.3.0 把轨迹页标成 skip,理由是「DSH 自己做虚拟化」。这个判断只对了一半:
虚拟化确实在,但它在滚动时每帧重建 <tr>(tbody.replaceChildren)。
插件原本的打标记方式是「读一次高度 → 写一个 data-* 属性」,属性写上去的下一帧就被新节点换掉了,
等于什么都没做——所以 0.3.0 之后轨迹页的手感反而回到没装插件时。
(0.2.1 反而会走通用路径去标记,这才是「0.3.0 比之前更卡」的真实来源。)
变更
轨迹页改用一条静态 CSS 规则:规则随样式表一次性生效,浏览器在它自己的样式计算里应用,
不需要主线程逐行写 DOM,也就不会被重建冲掉。
[data-trajectory-scroll] tbody tr[data-record-index]:not([data-turn-start]):not([data-terminal-request-boundary]):not([data-request-only]):not([data-collapsed-summary]) > td:last-child {
content-visibility: auto;
contain-intrinsic-size: auto 30px;
}三个约束来自对真实轨迹表的像素级验证:
- 只标内容单元格(
td:last-child)。事件列里有绝对定位、故意越界的turnRail与
requestBoundaryControl,content-visibility的 paint containment 会把它们裁掉。 - 排除
data-turn-start行。这类行用td:before在自己上边缘画 1px 分隔线,同样会被裁。 - 排除非标准高度行(9px 边界行、0px 请求行、24px 折叠摘要行)。它们的占位高度和真实高度
不一致,会让滚动条漂移。
另外:content-visibility 在 Chromium 上对 tr / td 本身不生效,标 td 时真正被跳过的是
td 的直接子元素——这一点用 checkVisibility({contentVisibilityAuto:true}) 验证过,
只看 getComputedStyle 会被误导。
实测(2000 行虚拟化轨迹表,每帧重建 46 行,富文本内容)
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 每帧脚本 + 布局 median | 6.3 ms | 5.0 ms(−21%) |
| 每帧脚本 + 布局 p95 | 11.6 ms | 8.3 ms(−28%) |
scrollHeight |
59917 | 59917(0 漂移) |
| 行高集合(普通/请求/折叠/边界) | 30 / 19 / 24 / 20 | 完全一致 |
| 同位置截图像素 diff | — | 0 |
安装
dsh plugin --profile desktop add "github:TWFU-wcy/dsh-scroll-boost"安装后完全重启 DSH(不是刷新页面)。
验证:
window.__scrollBoost.report().version // "0.4.0"
window.__scrollBoost.report().surfaces // trajectory 的 kind 应为 "static"新增测试
test/probe-traj-plugin.html 已挂进 npm run test:browser:复刻 2000 行轨迹表,
对比安装前后的每帧耗时、行高与 scrollHeight,并核对静态规则是否命中普通行、
是否避开 turn-start / 边界行 / 请求行 / 折叠行。
v0.3.0 — 认表面与行高真值
从「猜列表」到「认表面」:聊天页第一次真正被优化,行高改成真值,护栏补齐。
为什么要改
0.2.x 的做法是「在页面里找一个看起来可滚动的容器,再把它的直接子节点当成行」。
但 DSH 把聊天记录渲染进一个 display: contents 的槽位——槽位自己没有盒子,
那套「向下走直到找到行列表」的搜索永远看不到它,长会话聊天页基本没被优化过。
变更
- 认表面:直接认 DSH 自己的稳定
data-*属性,按表面类型决定策略。chat-flow([data-slot="conversation.chat.flow"])→ 标记其直接子行conversation-scroll([data-conversation-scroll])→ 只加will-change提示summary-region([data-summary-scroll-region])→ 只加提示- 认不出来的界面仍走 0.2.x 的通用回退路径
- 行高真值:DSH 自己的「当前读到第几行」是拿
getBoundingClientRect()做二分的。
占位高度和真实高度对不上,跳转与跟随尾巴就会落到错误的行。- 离屏行不读布局,直接用按
data-chat-flow-key记住的历史高度(WeakMap + localStorage) - 可见带才实测一次,且减去 padding / border(
contain-intrinsic-size描述的是内容盒) - 一个分片里的行先全部读完、再全部写入,把每行一次布局重算压成每批一次
- 离屏行不读布局,直接用按
- 护栏:sticky/fixed 行、
display: table-*、contenteditable、aria-live、
折叠/展开动效中的行、以及任何带粘性后代的容器,一律跳过;report().skipReasons能看到原因。 - 变更去抖 300ms → 50ms,切到轨迹/会话视图后更快跟上。
report()新增surfaces(认出了哪些界面、各标了多少行)与skipReasons。
实测
- 聊天页夹具(600 行,含粘性横幅):rows 599 / marked 599,粘性行正确跳过。
- 漂移探针:600/600 标记,
scrollHeight28426 前后一致,maxHeightDrift0。
安装
dsh plugin --profile desktop add "github:TWFU-wcy/dsh-scroll-boost"安装后完全重启 DSH。
已知边界
轨迹页在 0.3.0 里被整面跳过(当时判断 DSH 自己虚拟化、插手会打架),
这一版轨迹页没有优化,见 0.4.0。
v0.2.1 — 插件简介与图标
插件简介与图标:让 DSH 的插件列表里显示中文名与说明,而不是裸包名。
变更
- 新增
locale/en.json与locale/zh.json字典:插件列表显示 滚动加速(英文Scroll Boost)与一段中文简介。 - 新增
icon.svg(873 B,蓝底 + 白色滚动行 + 橙黄闪电)。 package.json增加icon字段与./locale/*.json导出,files收录locale、icon.svg。- 新增
test/meta.cjs:校验字典字段、中英文差异、图标路径/类型/大小(≤256 KiB)、files与exports覆盖。
安装
dsh plugin --profile desktop add "github:TWFU-wcy/dsh-scroll-boost"安装后完全重启 DSH。
说明
简介的读取规则来自 DSH 自身:先解析 <包>/locale/en.json,再枚举同目录所有 *.json 作为语言字典;
图标取 package.json 的 icon(包内相对路径)。
v0.2.0 — 首屏快扫
首个公开发布版本。
变更
- 新增 首屏快扫:视图挂载后的下一帧即标记视口附近 1–2 屏的行,首次可见行被优化的时间从 ~201ms 降到 ~14ms。
- 空闲扫描超时 500→200ms,单片行数 50→60,候选容器 24→16。
report()新增fastPasses/fastRows字段。
四层 + 一层
A 离屏跳过(content-visibility:auto)· B 容器提示(will-change)· C 空闲分片调度 · D 增量维护 · E 首屏快扫
安装
dsh plugin --profile desktop add "github:TWFU-wcy/dsh-scroll-boost"安装后完全重启 DSH。