美文网首页
关于Service workers最强整理

关于Service workers最强整理

作者: 曲昶光 | 来源:发表于2021-10-14 10:41 被阅读0次

    一、什么是Service workers

    Service workers 本质上充当 Web 应用程序、浏览器与网络(可用时)之间的代理服务器。这个 API 旨在创建有效的离线体验,它会拦截网络请求并根据网络是否可用采取来适当的动作、更新来自服务器的的资源。它还提供入口以推送通知和访问后台同步 API。
    简单来说就是:Service workers在浏览器与服务器之间充当中间人的角色。他会拦截网站中的所有请求,判断直接读取本地缓存还是请求服务器。
    注意:
    基于web worker(一个独立于JavaScript主线程的独立线程,在里面执行需要消耗大量资源的操作不会堵塞主线程)
    在web worker的基础上增加了离线缓存的能力
    本质上充当Web应用程序(服务器)与浏览器之间的代理服务器(可以拦截全站的请求,并作出相应的动作->由开发者指定的动作)
    创建有效的离线体验(将一些不常更新的内容缓存在浏览器,提高访问体验)
    由事件驱动的,具有生命周期
    可以访问cache和indexDB
    支持推送
    并且可以让开发者自己控制管理缓存的内容以及版本
    出于安全考量,Service workers只能由HTTPS承载,毕竟修改网络请求的能力暴露给中间人攻击会非常危险。

    二、Service workers的使用步骤

    网站中应用Service workers需要进行:注册、下载、安装、激活

    注册Service workers

    注册Service workers之前需要先创建Service workers文件例如创建sw.js 文件:

    // sw.js 文件
    
    // 安装
    self.addEventListener('install', function (e) {
        // 缓存 App Shell 等关键静态资源和 html (保证能缓存的内容能在离线状态跑起来)
    });
    
    // 激活
    self.addEventListener('activate', function (e) {
        // 激活的状态,这里就做一做老的缓存的清理工作
    });
    
    // 缓存请求和返回(这是个简单的缓存优先的例子)
    self.addEventListener('fetch', function (e) {
        e.respondWith(caches.match(e.request)
            .then(function (response) {
                if (response) {
                    return response;
                }
                // fetchAndCache 方法并不存在,需要自己定义,这里只是示意代码
                return fetchAndCache(e.request);
            })
        );
    });
    

    然后将sw.js放到网站根目录使用ServiceWorkerContainer.register()方法进行注册

    if (navigator.serviceWorker) {
        navigator.serviceWorker.register('/sw.js');
    }
    

    语法

    ServiceWorkerContainer.register(scriptURL, options)
        .then(
            function(ServiceWorkerRegistration) {
                // do something
            }
    );
    

    scriptURL:service worker脚本的URL.
    options 可选:注册时提供选项的配置对象。 目前可用的选项包括:* scope: 一个 USVString,表示定义service worker注册范围的URL ;service worker可以控制的URL范围。通常是相对URL。默认值是基于当前的location,并以此来解析传入的路径.
    Service Worker 的载入是完全异步的(Chrome DevTools 中 Network 的 XHR 中可以找到),注册的时候不用担心 block 的问题。

    下载、安装和激活

    用户首次访问service worker控制的网站或页面时,Service worker会立刻被下载。
    在默认情况下,Service Worker 必定会每24小时被下载一次,如果下载的文件是最新文件,那么它就会被重新注册和安装,但不会被激活,当不再有页面使用旧的 Service Worker 的时候,它就会被激活。

    注意事项

    Service worker运行在worker上下文 --> 不能访问DOM

    它设计为完全异步,同步API(如XHR和localStorage)不能在service worker中使用

    出于安全考量,Service workers只能由HTTPS承载

    在Firefox浏览器的用户隐私模式,Service Worker不可用

    其生命周期与页面无关(关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动)

    具体详情请查看以下参考文章

    参考
    如何优雅的为 PWA 注册 Service Worker
    Service Worker ——这应该是一个挺全面的整理
    service worker 是什么?看这篇就够了
    Service Worker API
    ServiceWorkerContainer.register()

    相关文章

      网友评论

          本文标题:关于Service workers最强整理

          本文链接:https://www.haomeiwen.com/subject/tgvyoltx.html