Web编程技术营地
研究、演示、创新

注册空脚本1

撰写时间:2024-12-29

修订时间:2024-12-30

何为注册

所谓注册,是指在客户端浏览器的缓存区域建立起一种标识,当客户端访问服务器中特定路径的资源时,将优先使用缓存区中已缓存的内容。

navigator.serviceWorker.register('empty-caching-1.js', {scope: './'}) .then(registration => { pc.log(registration); showInfo("installing"); showInfo("waiting"); showInfo("active"); function showInfo(propName) { let serviceWorker = registration[propName]; pc.log('-------------------------------------------'); pc.log(`${propName} Service Worker:`); pc.log(serviceWorker); if (serviceWorker) { pc.log(serviceWorker.scriptURL); pc.log('state: ' + serviceWorker.state); } } });

首先,在客户端浏览器中,只要是指向同一个服务器路径的注册,均属于同一个ServiceWorkerRegistration。而同一个ServiceWorkerRegistration下面,可以有多个ServiceWorkers。

其次,registration.installing, registration.waiting, registration.active3个属性,所返回的正是位于同一路径下、不同状态的各个ServiceWorker

第三,尽管可以有多个ServiceWorkers,但任何时候,均只有一个ServiceWorker处于激活状态,其state属性值为activated。而其他的ServiceWorkers,要么处于正安装状态,要么处于等待状态。

第四,如果之前有已激活的ServiceWorker,则刚注册的ServiceWorker会处于等待状态,直至使用之前服务的所有客户端都关闭了相应网页后,处于等待状态的ServiceWorker才会自动转为激活状态。

第五,ServiceWorkerscriptURL所指定的.js文件,将由客户端自动下载并保存至客户端电脑,客户端只会运行客户端电脑中的复本。这样,在客户端关闭网页之前,即使服务器中已删除该文件,客户端仍可使用复本所提供的服务。但如果脚本文件名相同,且服务器端的脚本内容及客户端复本内容不同,则会自动触发相应的update事件。

第六,对于要添加的脚本,是否安装,则根据队列中不同状态的脚本名称来决定:

  1. 如果队列为空,则直接安装。
  2. 如果队列中没有waiting的脚本文件,只有active的脚本文件,如果两者文件名相同,不予安装;文件名不同,予以安装。
  3. 如果队列中有waiting的脚本文件,如果两者文件名相同,不予安装;文件名不同,予以安装。此时不考虑active的脚本文件名称。

第七,如果队列中有正在等待的脚本,则当所有客户端都不再使用正在激活的脚本时(例如,访问没有任何Service Workers代码的概述),当前激活的脚本将被卸载,而等待的脚本转为激活。

上面代码将使客户端记住,在向服务器请求当前路径下的资源时,将运行当前激活的ServiceWorkerscriptURL所指定的.js文件,由其负责提供缓存的网页内容。

本页面的所注册的脚本文件empty-caching-1.js,内容为空,本节中只注重考查注册时各个ServiceWorkers的状态。

参考资源

Specifications

  1. Service Workers (W3C CR Draft)
  2. Storage

MDN

  1. Service Workers (gitee)
  2. Service Worker API
  3. Cache