Skip to content

Releases: TWFU-wcy/dsh-scroll-boost

v0.4.1 — 展开后的行也会跟着重测

Choose a tag to compare

@TWFU-wcy TWFU-wcy released this 25 Oct 13:44

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 — 轨迹页静态规则

Choose a tag to compare

@TWFU-wcy TWFU-wcy released this 24 Oct 22:18

轨迹页修复: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 — 认表面与行高真值

Choose a tag to compare

@TWFU-wcy TWFU-wcy released this 24 Oct 22:18

从「猜列表」到「认表面」:聊天页第一次真正被优化,行高改成真值,护栏补齐。

为什么要改

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 标记,scrollHeight 28426 前后一致,maxHeightDrift 0。

安装

dsh plugin --profile desktop add "github:TWFU-wcy/dsh-scroll-boost"

安装后完全重启 DSH。

已知边界

轨迹页在 0.3.0 里被整面跳过(当时判断 DSH 自己虚拟化、插手会打架),
这一版轨迹页没有优化,见 0.4.0。

v0.2.1 — 插件简介与图标

Choose a tag to compare

@TWFU-wcy TWFU-wcy released this 24 Oct 22:17

插件简介与图标:让 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 — 首屏快扫

Choose a tag to compare

@TWFU-wcy TWFU-wcy released this 22 Oct 00:23

首个公开发布版本。

变更

  • 新增 首屏快扫:视图挂载后的下一帧即标记视口附近 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。