用途:当导出或下载看似执行成功,却生成空文件、缺失文件或无法使用的文件时使用本技能。它针对浏览器预览、iframe 截图和 Electron 外壳场景调优。
核心原则:把“捕获”与“保存”分开。先证明导出负载字节数非零,再排查目标路径。0 KB 文件通常意味着原生选择器或宿主先创建了目标文件,随后写入失败或被阻止。
证据收集:记录负载类型、MIME 类型、字节长度、对象 URL 或 data URL 路径,以及抛出的错误名称与消息。检查浏览器控制台输出和应用日志中与 showSaveFilePicker、createWritable、<a download>、URL.createObjectURL 及 URL 撤销相关的信息。在 Electron 中检查 will-download 路径:文件名、MIME、扩展名、保存对话框过滤器、取消情况和最终文件大小。确认磁盘上实际下载文件的大小,以及能否用普通图片查看器打开。
修复顺序:先准备并校验导出负载,字节可用前禁用“保存”。优先为宿主选择最简单稳定的保存通道;若 showSaveFilePicker().createWritable() 失败、被沙箱限制或产生空文件,改用 <a download> 或 Electron 下载管理器。避免在负载就绪前打开原生选择器,以防后续写入失败时宿主创建空目标文件。PNG 回退时,若 blob URL、撤销时机、CSP 或 iframe 沙箱可疑,优先使用已验证非空的 data URL。在 Electron 中为导出图片扩展名(.png、.jpg、.jpeg、.webp)添加明确的另存为过滤器。界面保持克制:格式选择、文件名/路径提示、清晰的等待与错误状态,以及一个主保存操作。
验证:为非空负载准备、回退保存行为、扩展名/MIME 映射及 UI 禁用/错误状态添加或更新测试。运行聚焦的导出测试,然后执行 pnpm --filter @open-design/web typecheck。若 Electron 下载处理有改动,还需运行 pnpm --filter @open-design/desktop typecheck。落地前运行 pnpm guard,检查暂存差异中是否有无关文件、生成产物和意外密钥,若修复需提交评审则使用仓库的 PR 质量门禁工作流。