dsh-fastload:长会话首次打开历史页的瘦身与后台补齐

前言

在 DSH 里点开一条很长的会话,Host 会先拉一页完整历史再交给 Web 渲染。默认首屏往往是数百条消息量级,首帧要解码、传输和挂载的 transcript 都偏大,点击到首个 transcript 出现会明显拖慢。常规做法是接受 stock 参数(例如 500/50/2),或手动先「加载更早」再往下翻——前者首屏仍重,后者多一步操作。dsh-fastload 是面向该痛点的客户端类 DSH 插件:宿主端改写首次 session/follow 的首屏窗口,Web 端在视口偏短时再自动补一次「加载更早」,尽量在不改变你最终看到的尾部上下文的前提下,缩短长会话冷启动路径。

这是什么

dsh-fastload(仓库 TLEWA/dsh-fastload)由 TLEWA 维护,MIT 许可证,当前包版本为 0.3.0。它是带宿主端逻辑与少量 Web 客户端代码的 DSH 插件:缩小长会话首次打开时的历史页,不改变用户实际看到的尾部内容;若首屏比视口还短,Web 会在后台用内置「加载更早」把视口补齐。社区目录页见 skillhub.cn/plugins/TLEWA/dsh-fastload(生态独立站点,与 DeepSeek / 幻方无官方从属关系)。

核心行为

宿主端首屏改写

首次跟随会话时,插件把初始 session/follow 请求约束为:最多 100 条消息,turn 窗口为 至少 40 条消息 / 至少 2 个 turn(尽力而为)。maxMessages 是硬上限:若最新一个 turn 自身已超过 100 条,会在该 turn 内部切分。默认目标保留 2 个 turn 仍有意义——只保留 1 个 turn 时,页面可能只有约 267 px、102 个可见字符(例如最后一条是折叠的工具调用),firstAnchor 虽快,体验接近空页。

下列请求不被改写:带 beforeSeq / throughSeq 的加载更早、跳转、live 续接。若调用方显式要求更小的首屏,插件尊重原值;设置 DSH_FASTLOAD_FORCE=1 可强制改写。

可选 maxBytes 只在 turn/start 边界裁切,始终保留最新 minTurns 个完整 turn;若这两个 turn 超过软预算但未超过硬上限,则保留不切进 turn 内部。

Web 端后台补齐

首帧渲染后,Web 客户端等待一个短暂的输入空闲窗口;若 transcript 不可滚动(scrollHeight <= clientHeight),自动调用一次内置「加载更早」(ChatNavigation.loadEarlier()),并保留视口锚点,使尾部上下文与 stock 500/50/2 一致。首屏已可滚动则不动作。每个挂载的 transcript 最多触发一次,不是通用自动翻页循环。

明确不做的范围

插件不减少 Host 对完整日志的解码,减少的是 snapshot 字节、WebSocket 传输与 renderer 挂载量。不改 transcript 布局、Markdown 渲染或滚动模型,不删除历史;「加载更早」语义不变。

配置

通过环境变量调整(未在资料中出现的项请勿臆造):

环境变量 默认值 含义
DSH_FASTLOAD_ENABLED 1 0 仅关闭 Host 端首屏改写与裁剪;Web 端一次后台补齐仍会运行。
DSH_FASTLOAD_FORCE 0 强制改写所有首屏,含显式小页。
DSH_FASTLOAD_MAX_MESSAGES 100 首屏消息上限。
DSH_FASTLOAD_MIN_MESSAGES 40 turnWindow 裁切前最小消息数。
DSH_FASTLOAD_MIN_TURNS 2 目标保留的尾部 turn 数(仍受 maxMessages 约束)。
DSH_FASTLOAD_MAX_BYTES 0 软字节预算;0 表示不按字节裁。
DSH_FASTLOAD_HARD_CAP_BYTES 8388608 受保护 turn 超过该值时不再裁切。
DSH_FASTLOAD_DEBUG 0 每次裁切写一条 DSH 日志。

禁用、卸载或热重载会还原 sessionController.follow 并清除 __dshFastload 标记;重新启用后按当前配置重新包装。

安装与启用

先做对应 profile 下的安装,再重启 Host(桌面版管理自己的 profile,不要用 CLI 装到桌面 profile)。

DSH 桌面版: 打开 插件 → 添加插件,输入 dsh-fastload 并确认。

dsh web 或自定义 profile: 在终端执行:

dsh plugin --profile web add dsh-fastload

然后重启该 Host。

包内自带 bundle patch,经 profile 管理器安装时一般不需手写 YAML。若手工写 profile overlay,把包装进 profile 的 node_modules,并在 patch 中加入:

- insert:
    - id: dsh-fastload
      name: 'dsh-fastload'

引擎要求:node >= 20,dsh >= 0.2.0-rc.1(见 package.json)。

典型用法与验证

默认安装即可工作:打开一条长会话,首次 follow 走 100/40/2 首屏;视口不够高时由客户端自动补一次更早历史。

开发或贡献时在仓库根目录跑测试:

npm test

测试覆盖首屏判定、两 turn 下限、turn 边界裁切和硬上限回退。README 中记载的同一可见文本基准(session-cd3c83f5…,冷启动 Host、干净 profile)上,与 stock 500/50/2 对比 fastload 100/40/2:wire 字节约 3.42M 降至约 0.87M,点击到首个 transcript 约 555 ms 降至约 301 ms,DOM 节点与长任务耗时亦明显下降。更完整矩阵见仓库 docs/research/ 下文档。

适用场景与注意

适合经常在 DSH Web 或桌面端打开很长会话、在意首屏耗时与首帧挂载成本的开发者。若你依赖显式小页首屏且不希望被改写,勿设 DSH_FASTLOAD_FORCE=1;需要彻底关掉 Host 端逻辑时设 DSH_FASTLOAD_ENABLED=0,但 Web 仍可能做一次视口补齐。

DSH 插件在当前 dsh 进程的权限下运行。安装前请阅读仓库源码与 MIT 许可证,自行判断是否用于你的环境。

结尾

dsh-fastload 用宿主首屏瘦身加可选 Web 补齐,针对长会话首次打开时的传输与渲染成本,而不动尾部阅读语义。目录:skillhub.cn/plugins/TLEWA/dsh-fastload;源码与说明:github.com/TLEWA/dsh-fastload。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye