Svelte Flow 首次测量后换 nodes,节点一直隐藏
Svelte 5.57.1 至 5.57.3 中,同一轮首次测量后从 effect 重建 nodes,可能让 Svelte Flow 节点一直没有尺寸。保留原场景评估兼容版本,不强制显示未测量节点。
Svelte Flow 页面只剩空画布,控制台没有异常,节点元素却一直是 visibility: hidden。如果刚升级到 Svelte 5.57.1 之后,并在首次测量完成的 $effect 中重建了 nodes,应检查第二次测量是否发生。
这一具体组合见于 Svelte 5.57.1 至 5.57.3、@xyflow/svelte 1.7.0。相同场景在 5.57.0 可正常重新测量;它不等于所有空白流程图都有同一个版本问题。
新节点对象会丢掉已经测得的尺寸
Svelte Flow 会在节点尺寸尚不可用时保持隐藏,等测量完成后再显示。1.7.0 的 NodeWrapper 使用 ResizeObserver 观察节点,并根据尺寸等信息判断是否初始化。
如果首次测量一完成,effect 就用新对象替换整个 nodes 数组,新对象可能没有 measured。此时需要再走测量流程。受影响场景里,第一次观察通知已经到来,替换后却没有再次得到所需通知,于是节点一直保持隐藏,边也无法正常生成。
先查看节点是否实际存在、容器是否有尺寸、节点数据是否有宽高,以及替换数组的时机。应保留 experimental.async 是否开启、Svelte 编译器和运行时版本等信息;这个场景在异步实验选项关闭时也会发生。
不要靠 CSS 把节点强行显示
将 .svelte-flow__node 强制设为 visible,只能绕过外观上的隐藏。节点、连接点和边的坐标仍可能没有正确测量,缩放、拖动和自动布局也会继续出错。
同样,固定延迟 500 毫秒再替换数组,可能让更新落到另一轮而暂时恢复,但它依赖设备和页面负载,不能当作测量完成的可靠同步接口。
应用能调整初始化流程时,可以先准备节点数据,再交给流程图完成首次测量,避免在同一轮首次测量回调中又抹掉尺寸。但布局确实需要测量结果时,不能简单删掉重排功能,也不能复制过时尺寸去伪装新节点已测量。
需要保留原流程时,评估已知兼容版本
暂时没有合适的应用级改法,可在独立分支按项目原包管理流程评估锁定到先前正常的 Svelte 5.57.0,并检查框架、插件及其他功能是否兼容。保留原锁文件,以便回退;运行时与编译器必须来自同一套实际安装依赖,不能只替换某个源码文件。
5.57.0 只是这个具体场景的已知对照,不是对所有项目的通用降级建议。
回归要保留“首次尺寸到达后,同一轮 effect 重建 nodes”的条件,检查替换后节点取得正确尺寸、可见,边端点正确,拖动和后续重排正常。只看到开发服务 ready 或空白画布不再报错,没有覆盖这条测量失败。


