js操作serviceWorker缓存静态文件

serviceWorker的作用就是用来做离线应用的,在手机端程序中用的较多

  1. 先看下效果

  2. index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box{
    background-image: url("./img/alt.png");
    width: 100px;
    height: 100px;
    }
    </style>
    </head>
    <body>
    <!-- <img src="./img/alt.png" alt=""> -->
    <div class="box"></div>
    <script>
    if(navigator.serviceWorker) {
    navigator.serviceWorker.register('./sw.js').then(function(res){
    console.log(res.scope + "->" + "service worker注册成功");
    }).catch(function(err){
    console.log(err);
    })
    }else{
    alert("你的浏览器不支持serviceWorker");
    }
    </script>
    </body>
    </html>
  3. sw.js

    var version = "v1::"; // 设置版本号
    
    self.addEventListener("install", function (event) { // serviceworker第一次加载的时候调用,可以在此时缓存静态资源
    event.waitUntil(
    // caches帮助我们缓存资源
    caches
    .open(version + 'fundamentals')
    .then(function (cache) {
    // 将列出的文件缓存起来
    return cache.addAll([
    '/',
    '/img/alt.png'
    ]);
    })
    .then(function () {
    console.log('缓存完毕');
    })
    );
    }); self.addEventListener('activate', function (event) { // install方法调用完毕后就调用此方法,主要用来删除过期的缓存 event.waitUntil(
    caches
    // keys方法用来获取缓存版本号
    .keys()
    .then(function (keys) {
    // 下面的方法用来删除不是以version开头的缓存版本
    return Promise.all(
    keys
    .filter(function (key) {
    return !key.startsWith(version);
    })
    .map(function (key) {
    return caches.delete(key);
    })
    );
    })
    .then(function () {
    console.log('WORKER: 激活完毕.');
    })
    );
    }) self.addEventListener('fetch', function (event) { // 请求外部资源时调用 // 只捕获get请求
    if (event.request.method !== 'GET') {
    // 只让get请求去缓存中查找
    console.log('WORKER: 被拦截的api.', event.request.method, event.request.url);
    return;
    } // 让get请求取缓存中查找资源
    event.respondWith(
    caches
    .match(event.request)
    .then(function (cached) {
    // 将缓存中的资源立即返回,并且同时去服务器下载最新的资源存到缓存中
    var networked = fetch(event.request)
    .then(fetchedFromNetwork, unableToResolve)
    .catch(unableToResolve); // 通过caches.match这个方法,如果缓存中有资源,直接就返回了,如果没有转向网络
    console.log('WORKER: fetch event', cached ? '(cached)' : '(network)', event.request.url);
    return cached || networked; function fetchedFromNetwork(response) {
    // 从网络中加载资源
    var cacheCopy = response.clone();
    console.log('WORKER: 从网络中拉取的资源地址.', event.request.url);
    caches
    // 存储资源
    .open(version + 'pages')
    .then(function add(cache) {
    cache.put(event.request, cacheCopy);
    })
    .then(function () {
    console.log('WORKER: 从网络中拉取的资源已经缓存', event.request.url);
    });
    return response;
    } // 既不能从网络中获取资源又不能从缓存中获取,就会调用此方法
    function unableToResolve() {
    console.log('WORKER: 获取资源失败.');
    return new Response('<h1>Service Unavailable</h1>', {
    status: 503,
    statusText: 'Service Unavailable',
    headers: new Headers({
    'Content-Type': 'text/html'
    })
    });
    }
    })
    );
    })

最新文章

  1. HDU 4833 Best Financing (DP)
  2. 如何升级Ceph版本及注意事项
  3. storyBoard配置错误导致崩溃 superview]: unrecognized selector...
  4. Hue中给BI分配的权限
  5. 【转】VMware设置共享文件夹之后Ubuntu中看不到怎么办?
  6. 使用gradle构建java项目
  7. Contest20140709 testA 树型DP
  8. Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 下
  9. mysql sql limit where having order
  10. 总线接口与计算机通信(三)UART起止式异步通用串行数据总线
  11. WEB中间件--tomcat爆破,burp和python脚本
  12. Jenkins部署的时候报错
  13. linux 指令 备份
  14. 全面解读第四代基因测序技术Oxford Nanopore--转载
  15. 搜索插入位置的golang实现
  16. 【php增删改查实例】第十九节 - session的使用: 让服务器知道你是谁?
  17. 11、Logback日志框架介绍和SpringBoot整合实战 2节课
  18. day44 数据库学习 索引 引用自egon 老师博客
  19. Automapper实现自动映射
  20. 前端学习笔记之CSS过渡模块

热门文章

  1. js的onclick字符串参数的解决办法
  2. swagger 文件上传
  3. 【Python】序列的方法
  4. BZOJ3528: [Zjoi2014]星系调查
  5. 【河南第十届省赛-D】年终奖金
  6. 用工具快速建立hibernate框架
  7. Application的作用
  8. CSS:Tutorial two
  9. react:高阶组件wrappedComponent
  10. 关于vsftpd.conf配置