Skip to content

fix(vchart): preserve manual resize with autoFit enabled - #4711

Merged
xile611 merged 1 commit into
developfrom
codex/fix-resize-auto-fit
Oct 16, 2026
Merged

xile611 merged 1 commit into
developfrom
codex/fix-resize-auto-fit

Conversation

@xile611

@xile611 xile611 commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

默认 autoFit 下,在显式 600×600 的图表 renderAsync() 后立即调用 resize(300, 300),首次 ResizeObserver 通知会把画布恢复到 600×600。本 PR 让未变化的自动尺寸来源保留手动 resize 的结果,同时继续响应真实容器变化,并保留 updateSpec 重建后的当前尺寸。

🤔 这个分支是...

  • Bug fix
  • 测试 case 更新

🔗 相关的 PR 链接

修复 #4705 中 77d33b1e783aba6776c8cc04879687b35e190c3c 引入的回归。

💡 问题的背景&解决方案

_currentSize 原本用于自动尺寸变化检测,原修复又让手动 resize 修改它。自动监听随后从未变化的 spec 计算出 600×600,和已更新的 300×300 缓存比较,便错误触发反向 resize。

新增 _lastAutoSize 保存上次自动计算的尺寸,_currentSize 保留当前画布尺寸;手动 resize 仅更新后者。初始化、自动尺寸变化和新 spec 尺寸更新时同步自动快照。尺寸对象改为只读快照并整体替换,避免两个快照共享引用时被原地修改。

场景 修复前 修复后
600×600 图表手动 resize 到 300×300,首次 observer 通知到达 恢复成 600×600 保持 300×300
容器真实尺寸发生变化 自动适配 自动适配
updateSpec 触发 chart 重建 保留手动尺寸 保留手动尺寸
新 spec 显式修改尺寸 应用新尺寸 应用新尺寸

补充四项默认 autoFit 单元回归,以及 api/resize-auto-fit 浏览器用例。浏览器用例在同一任务内 renderAsync 后立即 resize,并用真实 ResizeObserver 交付屏障验证首次通知、未变化的窗口事件和 chart 重建后尺寸均为 300×300。

🧪 验证

  • 75 项相关单元测试通过:resize-remake.test.ts、update-spec.test.ts、vchart.test.ts。提交钩子的 ESLint、Prettier、commitlint 均通过;推送钩子的 rush test --only tag:package 完成,其中 VChart 全量 94 个测试套件、530 项测试通过。
  • 新增视觉用例自比较通过;同一修复构建完成五轮双 context 验证,所有截图一致。旧构建和抑制 resize 调用的反例均触发预期断言。
  • 用户原始代码与默认监听延迟实测:resize 返回时及 500ms 后均为 300×300。
  • API 目录 11 项、layout 目录 2 项本地自比较通过;layout 与官方 develop 比较 2 项通过、0 差异。
  • PR 前执行全量 node packages/vchart/scripts/visual-test.mjs,选中 264/264。官方 develop 基线 f017af88fe54b113e95a207d8f3d79624cb0f96f 的 263 个既有用例通过;新增 resize-auto-fit 复现旧缺陷,尺寸从 300×300 恢复为 600×600,触发 INTERACTION_ASSERTION_FAILED。工具因此中止后续 current 阶段,完整基线比较状态为 error,不能记为通过。
  • 修复后相同构建的全量自比较:264/264 通过、0 视觉差异、0 执行错误。复用了已验证构建,并确认其 SHA-256 与上述全量命令新生成的 current.js 完全相同。
  • 对官方基线已生成的 263 张既有用例截图与修复后全量截图逐一核对,263/263 PNG 完全一致;新增用例已通过本地状态断言、稳定性及反例检查,保留其在旧基线的真实失败。

📝 Changelog

Language Changelog
🇺🇸 English Fix automatic sizing notifications overriding manual resize while preserving resized dimensions across chart remakes.
🇨🇳 Chinese 修复自动尺寸通知覆盖手动 resize 的问题,同时保持图表重建后的尺寸及真实容器变化的自动适配。

☑️ 自测

  • 文档:公开 API 未变,无需更新
  • Demo:已新增确定性视觉回归用例
  • Ts 类型定义:公开类型未变,无需更新
  • Changelog:已提供 patch 变更记录

🚀 Summary

copilot:summary

🔍 Walkthrough

copilot:walkthrough

@skie1997 skie1997 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已审查 a741d11,本轮未发现需要修改的确定性代码缺陷。

重点核对了 _lastAutoSize 与 _currentSize 的初始化、自动通知、手动 resize、updateSpec 重建及显式尺寸更新:自动通知按来源快照去重,真实来源变化仍更新当前尺寸;来源尺寸恰好等于当前画布时,也会推进自动快照。没有新增包依赖。

独立验证:将该提交源码导出到临时目录,复跑 resize-remake.test.ts、update-spec.test.ts、vchart.test.ts,3 个套件、75 项测试全部通过。没有修改 PR 代码;本轮未重跑全量视觉测试。PR 记录的新增视觉用例在旧基线失败,与所修复的回归一致,但不等于完整视觉对照通过。

CI 提醒:size (18.x) 仍失败,日志为产物 2.42 MB 超过 2 MB 门槛(超出 422.57 kB)。目前没有证据将这一总量超限归因于本次改动,故不作为本 PR 引入的代码缺陷,但合并前仍应确认该检查的处理方式。

@xile611
xile611 merged commit b0f9014 into develop Oct 16, 2026
12 of 14 checks passed
@xile611
xile611 deleted the codex/fix-resize-auto-fit branch October 16, 2026 06:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants