Skip to content

finding(plugin-kanban): chunk 加载与数据 commit 是两个无序竞态 —— objectui#8534 关掉了镜子那一半,React.lazy 这一半仍然开着 #8827

Description

@os-zhuang

domain:ui @ objectui 派发席开出,作为 objectui#8534 的第二半。⛔ 未认领。

为什么单独开卡

objectui#8534 点出看板首帧有两个互不排序的竞态:

  • 已关闭 —— 镜子晚一拍。 KanbanImplcolumns prop 镜像进 state 并由 passive effect 回同步 ⇒ 每次 prop 驱动的变化晚一个 commit 上屏。由 PR fix(plugin-kanban): align the columns mirror during render, not in an effect #8825 改为渲染期对齐后关闭。
  • 仍然开着 —— 本卡。 KanbanRenderer 通过 React.lazySuspense 后加载 KanbanImpl(packages/plugin-kanban/src/index.tsx:137,边界在 :233 / :372)⇒ chunk 到达与数据到达之间没有任何东西排序。

⚠️ #8534 已被 PR #8825 关闭,所以若不单独立卡,这一半会随那张卡一起消失。PR #8825 的正文明确写着它只关掉一个,⛔ 不得被读成「首帧问题已解决」。

为什么它没有搭在 #8534

PR #8825 的判断,派发席确认:动它会移动 chunk 边界与包体 —— 那是与「组件内部状态同步时机」完全不同的机制和验证面。⇒ 分开是对的。

⚠️ 证据限度 —— ⛔ 请勿当成已复现

本卡没有实测。 #8534 的原始测量与 PR #8825 的测量都只针对镜子那一半;React.lazy 这一半是读源码点名的,不是跑出来的。

承接第一步(⛔ 不可跳过):先实跑复现。 造出「chunk 后到 / 数据后到」两种顺序,量出各自的首帧是什么。带亮对照 —— 一个已知会变的读数必须显示差异,否则你的「两种顺序看起来一样」是仪器没接上。

⚠️ 并且先回答:关掉镜子那一半之后,这个竞态还剩多少可观察后果? ⛔ 有可能 #8825 已经顺带削弱了它 —— 若实测发现首帧已经没有可观察问题,那本卡应当被关闭而不是被修,请带读数关闭它。证伪比修复有价值。

待判定(若复现成立)

  1. 该不该排序它 —— 例如让数据加载与 chunk 加载共用一个 Suspense 边界,还是在 chunk 就绪前不发起数据请求?
  2. 代价是什么 —— 任何排序都会延后首屏可见时间以换取首帧正确,这是一个产品取舍,⛔ 不是纯技术选择。
  3. 这个形状是不是 kanban 独有?⚠️ 其它 React.lazy 插件(plugin-gridplugin-detail 等)可能同形 —— 未测,承接者若要主张「只此一处」需自己量。

⛔ 承接约束

Dedup

⚠️ 派发席没有为本卡跑带亮对照的查重 ⇒ 上面没有「未见重复」的断言,承接者请自行查重。已知相邻:objectui#8534(母卡)· PR #8825(关掉的那一半)· objectui#8532 / PR #8533(测试侧的那一半)。

来源

objectui#8534 · PR #8825 的「Which race this closes — and which it does NOT」一节与其 验收备注 第一条 · packages/plugin-kanban/src/index.tsx:137 / :233 / :372

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions