应该在何时调用URL.revokeObjectURL?

前端开发 2026-07-10

我在一个通过 URL.createObjectURL 创建的对象URL中有一些数据。我想让用户把它保存为一个文件下载,然后我想调用 URL.revokeObjectURL 以避免内存泄漏。应该在何时真正调用 URL.revokeObjectURL

看起来对我来说可能性有以下几种:

  1. 下载完成后。这在对象URL在撤销时变得不可读时才对。
  2. 下载开始后立即。这在浏览器对数据进行某种引用计数时才对,只有对象URL和下载都用完时才释放数据。
  3. 下载启动后的下一个事件循环轮次(setTimeout(revoke, 0))。如果浏览器确实执行了“引用计数”,但要到当前轮次结束才意识到下载已经开始,这种说法就对。
  4. 下载启动后的一段延时(setTimeout(revoke, 10_000))。如果浏览器确实做了“引用计数”,但直到……某个时间才意识到下载已经开始,可能几毫秒就行,也可能越久越可靠?
  5. 其他?

解决方案

  1. 下载完成后

这是你唯一可以确定不会再为保存获取新的blobPart的时机,因此此时URL也就不会再被使用了。
然而对于简单的 <a download>,并没有事件能通知我们何时会是这种情况,除了一个涉及 ServiceWorker 的变通方法来对数据data1进行流式传输之外,找不到安全的方式知道下载何时真正结束。

供参考,Eli Grey的 [FileSaver.js](在跨浏览器支持方面可以算是参考之一)在锚点点击后的 [40s延迟] 来撤销该URL。

  1. 如果你想走这条路线,可以查看Jimmy Warting的 [StreamSaver.js] 项目。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章