项目页面加载慢的解决办法。ServiceWork的配置

6 篇文章 0 订阅
4 篇文章 0 订阅

1、减少 chunk-vendors.js 体积;项目实现 路由懒加载;(vue 访问那个页面,加载那个页面的 js)

2、增加网络带宽

3、实现缓存机制(ServiceWork)

1.对于 public 文件的操作(vue)
在index.html 写入以下 js

(1):在public 文件夹下创建 service-worker.js 写入以下代码


// const CACHE_NAME = Date.now(); // 版本号
const CACHE_NAME = '123'; // 版本号
self.addEventListener('install', function (event) {
  self.skipWaiting(); // 插队
  console.log('service-worker-----install', event);
  // Perform install steps
  event.waitUntil(
    caches.open('sw_demo')
      .then(cache => {
        console.log('service-worker-----install----cache', cache);
        return cache.addAll(
          []
        );
      }
      )
  );
});
self.addEventListener('fetch', function (event) {
  // console.log(event.request.url);
  event.respondWith(
    caches.match(event.request).then(res => {
      return res ||
        fetch(event.request)
          .then(responese => {
            const responeseClone = responese.clone();
            caches.open('sw_demo').then(cache => {
              // console.log('event.request', event.request);
              // console.log('responeseClone', responeseClone);
              if (event.request.url.indexOf('chrome-extension') === -1) {
                cache.put(event.request, responeseClone);
              }
            });
            return responese;
          })
          .catch(err => {
            console.log('fetch--错误', err);
          });
    })
  );
});
self.addEventListener('activate', function (event) {
  console.log('service-worker-----activate', event);
  // 监听worker的activate事件
  event.waitUntil( // 延迟activate事件直到
    caches.keys().then(function (keys) {
      return Promise.all(keys.map(function (key, i) { // 清除旧版本缓存
        if (key !== CACHE_NAME) {
          return caches.delete(keys[i]);
        }
      }));
    })
  );
});
// service-worker.js// SW 不再在 install 阶段执行 skipWaiting 了
self.addEventListener('message', event => {
  if (event.data === 'skipWaiting') {
    self.skipWaiting();
  }
});


(2):在public 文件夹下 index.html 写入以下 js

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <style>
        #updateBox{
            width: 100%;
            color: #ffffff;
            background: #606266;
            padding: 0 10px;
        }
        .updateBoxUp{
            transition: 1s;
            height: 40px;
            line-height: 40px;
        }
        .updateBoxDown{
            height: 0px;
            line-height: 0px;
        }
    </style>
  </head>
  <body>
    <p id="updateBox" class="updateBoxDown">站点发生更新,即将刷新当前页面</p>
    <div id="app"></div>
  </body>
  <script>
    const urlStr= urlMethods('#/')  // hash 模式
    // const urlStr= urlMethods('/', 'psiweb/')  // hash 模式
    if ('serviceWorker' in navigator) {
      console.log('支持缓存-----');
      console.log(urlStr+'service-worker.js');
      // 开始注册service workers
      // navigator.serviceWorker.register('https://yp.cwjly.vip/psiweb/service-worker.js', {
      navigator.serviceWorker.register(urlStr+'service-worker.js', {
        scope: './'
      }).then(function (registration) {
        console.log('注册成功',registration);
      }).catch (function (error) {
        console.log('注册没有成功',error);
      });
    } else {
      console.log('不支持');
    }
    // hash 模式 传 '#/'
    // history'/' ,二级子目录
    function urlMethods(str,directory){
      const url = window.location.href;
      if ( directory ){
        const urlArr = url.split(directory)
        console.log(urlArr);
        return urlArr[0] + directory
      }else {
        const urlArr = url.split(str)
        console.log(urlArr);
        return urlArr[0]
      }
    }

    let refreshing = false;
    navigator.serviceWorker.addEventListener('controllerchange', () => {
      if (refreshing) {
        return;
      }
      refreshing = true;
      console.log('更新----------');
      const updateDom = document.getElementById('updateBox');
      updateDom.style.display = 'block'
      updateDom.className='updateBoxUp'
      window.location.reload();
    });
  </script>
</html>

缓存成功后在谷歌控制面板可以看到
需要注意一下几点
1、本地开发,配置 registerServiceWork 必须是 localhost 打开的
2、线上的 必须是 https 的链接

network 的网络请求

在这里插入图片描述

application控制面板查看缓存的文件

在这里插入图片描述

实际测试图例 第一张 第一次加载 ;第二张 关闭后再次打开

(对比取决于 第一次加载的网络速度,测试地址https://yp.cwjly.vip/psiweb/

1、
在这里插入图片描述

2、
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值