折叠 Markdown 标题后插入单元格,JupyterLab 页面卡死
JupyterLab 4.5.1、4.5.2 在折叠标题下插入单元格可让页面无响应,小 Notebook 也能触发。说明展开后插入及过期折叠回调的边界。
选中一个已折叠的 Markdown 标题,点击工具栏 + 或在命令模式按 B 插入单元格,JupyterLab 标签页随即无响应。即使文件只有几十个单元格、没有输出,也可能触发;不要只围绕 Notebook 大小清理数据。
具体记录涉及 JupyterLab 4.5.1、4.5.2。插入位置处于折叠标题的范围内时,重新折叠与展开活动单元格的操作可能交错。异步标题解析完成后再回写旧状态,触发新的折叠信号,最终反复切换,拖住前端。
先保存并展开标题,再插入
页面仍能响应时,先保存当前文件,并在副本中确认触发条件:标题处于折叠状态,插入的新活动单元格落在它管理的范围内。展开标题后再插入,或选择明确位于该折叠范围之外的单元格,属于避免这条交互路径的临时做法。
页面已经卡死时,不要连续点击插入按钮,也不要同时在另一个标签页覆盖同一文件。保留最后保存版本,按正常恢复流程重新打开,核对单元格数量及最近修改;强制关闭页面可能丢失尚未保存的编辑。
这个缓解不要求删除 Markdown 标题、清空所有输出或重启执行内核。服务器出现断线提示也可能只是前端无法及时处理连接,不能据此直接增加内核内存或杀掉正在计算的任务。
正式实现需要忽略过期的折叠回调
JupyterLab 4.5.9 的正式实现,在异步标题解析完成后检查单元格是否已经销毁,以及 Markdown 的当前折叠状态是否仍与回调携带的状态一致。不再一致时直接返回,避免把已经过期的状态写回去。
项目能够采用包含该保护的前端版本时,按原扩展兼容与部署流程更新,再让浏览器加载新的前端资源。已有旧页面不会因为内核包更新就自动换掉菜单与单元格组件。这里的判断针对前端交互,不能仅用 jupyter lab --version 在另一个环境的输出代替。
在小副本上重复原动作
验收应在不含敏感数据的副本中创建 Markdown 标题、折叠它,再从原插入入口新增单元格。确认页面保持响应、只增加预期单元格、标题能正常展开与再次折叠,随后保存并重新打开核对内容。
还应检查未折叠标题、普通代码单元格和不同层级标题的插入。避免只在全展开状态下验收,否则没有覆盖原先的异步交错。若卡顿发生在输出渲染、其他扩展弹窗或完全不同操作中,应保留前端日志另查,不继续归到折叠标题。
保留原版本与依赖记录便于恢复。回退前确认文件已经完整保存;切换前端版本不能把浏览器内尚未写出的编辑恢复到磁盘。


