【PWA】用Service Worker实现离线应用

没有离线缓存的应用,没有网络时就毛都访问不了。但是当我们利用service worker设置了离线缓存,那我们的应用就算没网也能访问,是不是很神奇,下面是其简单的用法。
想了解service worker相关知识,可以看我另一篇文章service worker相关知识

1.注册service worker
调用navigator.serviceWorker.register方法即可在应用中注册需要用到的serviceWorker文件。
注意:要在页面加载完成后再进行注册,以防影响有网络情况下页面的加载速度!

// 注册 service worker
//要在async函数中使用,没有的话,去掉await关键词
if ("serviceWorker" in navigator) {
   try {
     const registration = await navigator.serviceWorker.register(
       "../src/assets/sw.js"
     );
     console.log("注册成功");
   } catch (error) {
     console.log("注册失败", error);
   }
 }
  1. 配置sw.js
//sw.js 内容
//设置缓存名字 用于版本比较删除之前的cache
const CACHE_NAME = "cache_name_v1";
this.addEventListener("install", async (event) => {
  // 开启一个cache 得到一个cache对象
  const cache = await caches.open(CACHE_NAME);
  // 等待cache把所有的资源存储
  await cache.addAll([
    "/index.html",
    "/manifest.json",
    "/img/icon.png",
    "/css/index.css",
    "/js/index.js",
  ]);
  // 等待skipWaiting结束才进入到activate
  await this.skipWaiting();
});

//sw.js 内容
// 主要清除旧的缓存
this.addEventListener("activate", async (event) => {
    const keys = await caches.keys();
    // 判断key 删除旧的资源
    keys.forEach((key) => {
      if (key !== CACHE_NAME) {
        caches.delete(key);
      }
    });
    // 表示service worker激活后,立即活的控制权
    await this.clients.claim();
  });

  //sw.js 内容
this.addEventListener("fetch", (event) => {
    const req = event.request;
    event.respondWith(networkFirst(req));
  });
  // 网络优先
  async function networkFirst(req) {
    try {
      // 优先网络读取最新的资源
      const fresh = await fetch(req);
      return fresh;
    } catch (e) {
      // 去缓存中读取
      const cache = await caches.open(CACHE_NAME);
      const cached = await cache.match(req);
      return cached;
    }
  }
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现离线缓存可以通过 Service Worker 技术来实现,下面是详细的步骤: 1. 创建 Service Worker 文件 在项目根目录下创建一个名为 `sw.js` 的文件,并在其中编写以下代码: ```javascript // 定义需要缓存的文件列表 const cacheFiles = [ '/', '/index.html', '/app.js', '/style.css', '/images/logo.png' ]; // 监听 install 事件,缓存需要缓存的文件 self.addEventListener('install', function(event) { event.waitUntil( caches.open('my-cache').then(function(cache) { return cache.addAll(cacheFiles); }) ); }); // 监听 fetch 事件,从缓存中获取文件 self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request).then(function(response) { return response || fetch(event.request); }) ); }); ``` 在上面的代码中,我们首先定义了需要缓存的文件列表,然后在 `install` 事件中将这些文件缓存起来,最后在 `fetch` 事件中从缓存中获取文件。 2. 注册 Service Worker 在项目中使用 Service Worker,需要先注册 Service Worker,可以在 `main.js` 中添加以下代码: ```javascript if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(function(registration) { console.log('Service Worker 注册成功'); }).catch(function(error) { console.log('Service Worker 注册失败:', error); }); } ``` 在上面的代码中,我们检查浏览器是否支持 Service Worker,如果支持,则注册 Service Worker。 3. 配置离线缓存 在 Vue CLI 3 中,可以通过在 `vue.config.js` 中配置 `pwa` 选项来配置离线缓存。具体配置如下: ```javascript module.exports = { pwa: { name: 'My App', themeColor: '#4DBA87', msTileColor: '#000000', appleMobileWebAppCapable: 'yes', appleMobileWebAppStatusBarStyle: 'black', // 配置离线缓存 workboxOptions: { runtimeCaching: [{ urlPattern: new RegExp('^https://my\.api\.com/'), handler: 'networkFirst' }] } } } ``` 在上面的配置中,我们首先设置了应用名称和主题色等基本信息,然后在 `workboxOptions` 中配置了离线缓存,这里我们使用了 Workbox 提供的 `runtimeCaching` API,来配置缓存策略。在这里我们配置了一个 `networkFirst` 的缓存策略,表示优先从网络获取数据,如果网络不可用则从缓存中获取数据。 4. 构建应用 在完成上述配置之后,我们需要重新构建应用,可以使用以下命令来构建: ```bash npm run build ``` 构建完成之后,在浏览器中访问应用,即可实现离线缓存功能。当网络不可用时,应用会从缓存中获取数据,保证应用的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端阿彬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值