当前位置:首页 > 技术分析 > 正文内容

原生支持bgFetch?大文件下载这么玩?

ruisui885个月前 (01-24)技术分析48

家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

Background Fetch简称bgFetch。

1.为什么是Background Fetch?

1.1 为什么要Background Fetch?

当 Web 应用程序需要下载大文件时,例如电影、音频文件和软件,通常可能会出现问题,因为用户需要保持与页面的连接才能完成下载。 如失去连接,关闭选项卡等任务将停止。

Background Synchronization 为 service workers 提供了一种延迟处理直到用户连接的方法。但是不能用于长时间运行的任务,例如下载大文件。 同时,要求 service worker 在完成之前保持活动状态,因为为了节省电池寿命、防止在后台发生不需要的任务,浏览器将在某个时候终止任务。

1.2 Background Fetch解决了什么痛点?

Background Fetch API 解决了这个问题。 它为 Web 开发人员创建了一种方式,让浏览器在后台执行一些操作,例如,当用户单击按钮下载视频文件时。 然后浏览器以用户可见的方式执行提取,显示进度、提供取消下载的方法。 下载完成后,浏览器会打开 Service Worker,此时应用程序可以根据需要对响应执行某些操作。

如果用户在离线时启动进程,后台提取 API 将启用提取。 一旦连接起来,它就会开始。 如果用户下线,该过程将暂停,直到用户再次上线。

2.Background Fetch如何工作?

Background Fetch工作流程如下:

  • 告诉浏览器在后台执行一组fetch。
  • 浏览器调用fetch,向用户显示进度。
  • 一旦获取完成或失败,浏览器就会打开service workers并触发一个事件来告诉你发生了什么,由开发者决定如何处理响应。

如果用户在第 1 步后关闭了站点的页面,下载将继续。

fetch是高度可见的并且很容易中止,所以不存在太长的后台同步任务的隐私问题。 而且service worker 也不会持续运行,所以不用担心滥用系统,例如在后台挖矿。

在某些平台(例如 Android)上,浏览器可能会在第 1 步后关闭,因为浏览器可以将fetch操作交给操作系统。如果用户在离线时开始下载,或者在下载过程中离线,后台fetch将暂停并稍后恢复。

3.浏览器兼容

3.1 特征检测

与任何新功能一样,需要检测浏览器是否支持它。 对于 Background Fetch,可以通过如下代码快速检测:

if ('BackgroundFetchManager' in self) {
  //浏览器支持Background Fetch!
}

从caniuse的数据来看,该API的浏览器整体支持率达到了73.58%。Chrome从74版本开始,Edge从79版本开始都已经支持Background Fetch。不过,可惜的是,FireFox和Safari目前支持并不好。

3.2 实例化Background Fetch

使用 Background Fetch 需要注册一个 service worker。 然后调用 backgroundFetch.fetch() 来执行,同时返回一个Promise。

Background Fetch提取可能会请求多个文件。 在下面的示例中,请求了 MP3 和 JPEG。

navigator.serviceWorker.ready.then(async (swReg) => {
  const bgFetch = await swReg.backgroundFetch.fetch(
    // service worker的fetch方法
    "my-fetch",
    ["/ep-5.mp3", "ep-5-artwork.jpg"],
    // 请求MP3和JPEG
    {
      title: "Episode 5: Interesting things.",
      icons: [
        {
          sizes: "300x300",
          src: "/ep-5-icon.png",
          type: "image/png",
        },
      ],
      downloadTotal: 60 * 1024 * 1024,
    }
  );
});

3.3 获取已有的Background Fetch


navigator.serviceWorker.ready.then(async (swReg) => {
  const bgFetch = await swReg.backgroundFetch.get('my-fetch');
});

通过传递Background Fetch的id来获取, 如果没有使用该 ID 的Background Fetch,则返回 undefined。

Background Fetch从它被注册的那一刻起就被认为是“活跃的”,直到它成功、失败或被终止。可以使用 getIds 获取所有活动Background Fetch的列表:

navigator.serviceWorker.ready.then(async (swReg) => {
  const ids = await swReg.backgroundFetch.getIds();
});

3.4 跟踪Background Fetch进度

可以通过进度事件来完成。请记住,downloadTotal可以是任何值,未提供,则为 0。

bgFetch.addEventListener('progress', () => {
  // If we didn't provide a total, we can't provide a %.
  if (!bgFetch.downloadTotal) return;
  const percent = Math.round(bgFetch.downloaded / bgFetch.downloadTotal * 100);
  console.log(`Download progress: ${percent}%`);
});

3.5 获取请求和响应

bgFetch.match('/ep-5.mp3').then(async (record) => {
  if (!record) {
    console.log('No record found');
    return;
  }

  console.log(`Here's the request`, record.request);
  const response = await record.responseReady;
  console.log(`And here's the response`, response);
});

在 Chrome 当前的实现中,您只能在 backgroundfetchsuccess、backgroundfetchfailure 和 backgroundfetchabort service worker 事件期间获取请求和响应(见下文)


4.本文总结

本文主要和大家介绍浏览器的新特性Background Fetch,因为Background Fetch本身的复杂性,文章没有过多的展开。但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。


参考资料

https://developer.mozilla.org/en-US/docs/Web/API/Background_Fetch_API

https://caniuse.com/?search=Background%20Fetch

https://developer.chrome.com/blog/background-fetch/

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/535.html

分享给朋友:

“原生支持bgFetch?大文件下载这么玩?” 的相关文章

深入理解Vue.js组件通信:父子组件与子父组件数据交互详解

什么是Vue组件通讯 Vue.js 组件通信是指在 Vue 应用的不同组件之间进行数据交换和状态同步的过程。由于 Vue 的组件是基于单文件组件(SFCs)的模块化设计,每个组件都有自己的作用域,因此它们不能直接访问彼此的数据。为了使组件之间能够协同工作,Vue 提供了几种不同的通信方式。以下是 V...

代码管理-9-gitlab的使用和设置

gitlab使用1、外观设置完成后保存,返回登录页面查看关于注册,有些公司是不允许打开的,,有些人数非常多的公司就需要打开注册的功能,让人员自己注册,我们来给他特定的权限就可以,毕竟人非常多的时候还由我们来给她们注册就非常不现实了,工作量会很大2、自动注册3、组&用户&项目创建组设置组名称、描述等创...

继Yuzu后,任天堂要求移除多个Switch模拟器项目

IT之家 7 月 11 日消息,任天堂美国分公司 (Nintendo of America) 已要求移除多个用于模拟 Nintendo Switch 游戏的开源模拟器项目,其中包括 Suyu、Nzu、Uzuy、Torzu、Sudachi 和 Yuzu-vanced 等。这些模拟器均被指控包含绕过任天...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing 发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。早在2021年,腾讯的 TDesing 刚发布不久,我就写了一篇简短的文章来介绍,当时主要关注的是 TDesign 的 Vue 组件库和用来搭建 admin 后台系统的实用性。虽然当时看起来不错,但还处于测试版,...

深入理解同步/异步与阻塞/非阻塞区别

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由「那谁」投稿。转载请注明来自高可用架构公众号「ArchNotes」。「那谁」,codedump.info 博主,多年从事互联网服务器后台开发工作。几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误...