@github:渲染百万行的差异视图倒是容易。评论才是让它出问题的原因。评论的高度取决于 Markdown 的换行,……
摘要
GitHub 介绍了他们如何重构 GitHub Copilot 应用中的拉取请求视图,解决渲染百万行差异的难题,同时处理由 Markdown、回复框和正在加载的图片带来的动态评论高度。附带一条 🧵 线程标志的技术分享。
查看缓存全文
缓存时间: 2026/10/12 19:31
渲染百万行的差异视图其实是容易的部分。👀
真正让它出问题的是评论。评论的高度取决于 Markdown 换行、展开的详情、打开的回复框,以及仍在加载的图片(这些都只有渲染后才能知道)。
下面聊聊我们是如何重构 GitHub Copilot 应用中的 PR 视图的 🧵
代码行的高度是已知的。你可以预先计算整个布局的几何信息,之后无需修正。
评论的高度却无法预测。所以,我们不再强行让同一套几何布局同时服务于两者,而是将文档拆分为两个独立的高度区域。
在最初的设计中,我们为每个动态块配置了一个 ResizeObserver,将测得的高度写回布局。
我们实现了它,然后否决了它。观察器如果把高度写回自己正在观察的布局,就可能再次触发自身,而且开销会随着每个已挂载的块而增长。
最终上线的方案是周期性执行测量,仅在空闲时运行,范围限定在视口周围约 2400px 的区域。已挂载块的实际尺寸才是依据。观察器通常只负责标记需要在这一轮测量的块,而不会自行写入高度。
有一个例外:如果可见块因用户操作而改变尺寸,可以在绘制前同步修正一次。这样既能让评论及其下方的代码一起移动,也不会重新开启反馈循环。
曾经阻碍我们推进的一个 bug 来自“滚动时不要修正”这条规则。它通过时间戳来拦截修正,而我们自己通过程序触发的滚动也会更新这个时间戳。
切换侧边栏后,差异面板的宽度会改变。换行内容重新排布,界面在稳定下来的过程中会触发一次小幅滚动。拦截逻辑将其误判为你的输入,跳过了本该用于保持阅读位置的修正。于是,你正在阅读的文件就移出了屏幕。
任何判断“用户是否正在交互”的检查,都必须区分真实的用户输入和自身副作用引发的滚动。
打开你手头最棘手的拉取请求,试试看 👇
相似文章
@github: 一个包含2,200个文件、100万+行更改和400+内联评论的拉取请求。无法审查?除非你拥有…
GitHub Copilot应用新增了改进的拉取请求视图,可高效处理包含数千个文件和数百万处更改的超大规模代码审查。
论渲染差异
博客文章宣布推出CodeView,这是一个虚拟化优先的React组件,可高效渲染大型代码差异,归属于六个月前发布的Diffs库。
@github:使用堆叠拉取请求,每一层处理一个关注点,如数据、API、应用集成或UI,并基于下层构建…
本文介绍了GitHub中的堆叠拉取请求如何将变更分解为更小、专注的层次,通过更清晰的上下文和更小的差异改进代码审查。
Show HN:Diffle,一款以键盘为中心、支持 LSP 的 diff 查看器
Diffle 是一个键盘优先的浏览器端 Git diff 查看工具,支持按行、块或文件添加评论,并可将评论作为 prompt 交给 AI agent 或提交为 GitHub 待处理评审,内置 LSP 支持且可通过 pixi、npm 或独立二进制安装。
@gimenete: GitHub Copilot桌面应用即将推出:可编辑差异!!代理已帮你完成了大部分?进行最后的调整…
GitHub Copilot桌面应用将添加可编辑差异功能,允许用户在代码审查界面中直接进行微调。