downloads API 构建一个小型下载管理器。后台脚本负责启动和取消下载,popup 展示实时进度。
你要构建什么
Manifest
manifest.json
启动和取消下载
filename 是相对于浏览器下载目录的路径。允许子文件夹,不允许绝对路径和 .. 片段。
background.js
pause、resume 与 erase,可以实现完整的管理器行为。
在 popup 中显示进度
onChanged 会在状态转换时触发,但它不会流式提供字节数。对进行中的条目轮询 search(),并从结果中读取 bytesReceived 与 totalBytes。
popup.html
popup.js
扩展能并行下载吗?
网络队列归浏览器所有,扩展无法改变这一点。Chromium 本来就会同时运行多个下载,但会对同一服务器的并发连接设上限,其余的排队等待。扩展既不能提高这些限制,也不能像下载加速器那样把一个文件切成多段。 扩展能做的是编排:用多次download() 调用启动一批下载,监听 onChanged,在一个完成时启动下一个。这样你就得到了一个带进度的有序队列,而这正是大多数”并行下载”需求真正想要的。
运行
Firefox 说明
- Firefox 以
browser.downloads的形式支持同一 API 并返回 promise,chrome.downloads别名也可用。 - Firefox 不支持
chrome.downloads.setUiOptions,它用于隐藏 Chrome 的下载 UI。 onChanged的 delta 形状和search()的查询形状在两个浏览器之间一致。
从模板开始
action 模板自带这份教程使用的后台加工具栏 popup 的布局。
最佳实践
- 把文件名统一放在一个文件夹命名空间下,让用户能找到你的文件。
- 没有进行中的下载时停止
setInterval轮询。 - 处理
interrupted状态,并把item.error呈现给用户。 - 只对用户明确请求的文件保持
saveAs: false。 - 用
erase清理历史条目,而不是删除文件。

