/** * Blob 下载仪式单一出口:创建对象 URL → 触发锚点点击 → 回收。 * api.ts 的响应式下载与各组件的 JSON 导出都走这里,不再各自手写 DOM 副作用。 */ export function downloadBlob(blob: Blob, filename: string): void { const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = filename a.click() URL.revokeObjectURL(url) } export function downloadJson(data: unknown, filename: string): void { downloadBlob(new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }), filename) }