【问题标题】:VueJS service-worker.js is ignored in my PWAVueJS service-worker.js 在我的 PWA 中被忽略
【发布时间】:2019-05-10 09:26:27
【问题描述】:

我使用 VueJS 创建了一个渐进式 Web 应用程序,文件由 vuecli 生成。所以我有默认的 registerServiceWorker.js 我只是评论环境条件:

/* eslint-disable no-console */

import { register } from 'register-service-worker'

// if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready () {
      console.log(
        'App is being served from cache by a service worker.\n' +
        'For more details, visit https://...'
      )
    },
    registered () {
      console.log('Service worker has been registered.')
    },
    cached () {
      console.log('Content has been cached for offline use.')
    },
    updatefound () {
      console.log('New content is downloading.')
    },
    updated () {
      console.log('New content is available; please refresh.')
    },
    offline () {
      console.log('No internet connection found. App is running in offline mode.')
    },
    error (error) {
      console.error('Error during service worker registration:', error)
    }
  })
// }

这是我的简单 service-worker.js

const PRECACHE = 'precache-v1';
const RUNTIME = 'runtime';

// A list of local resources we always want to be cached.
const PRECACHE_URLS = [

];

// The install handler takes care of precaching the resources we always need.
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(PRECACHE)
      .then(cache => cache.addAll(PRECACHE_URLS))
      .then(self.skipWaiting())
  );
});

// The activate handler takes care of cleaning up old caches.
self.addEventListener('activate', event => {
  const currentCaches = [PRECACHE, RUNTIME];
  event.waitUntil(
    caches.keys().then(cacheNames => {
      return cacheNames.filter(cacheName => !currentCaches.includes(cacheName));
    }).then(cachesToDelete => {
      return Promise.all(cachesToDelete.map(cacheToDelete => {
        return caches.delete(cacheToDelete);
      }));
    }).then(() => self.clients.claim())
  );
});

// The fetch handler serves responses for same-origin resources from a cache.
// If no response is found, it populates the runtime cache with the response
// from the network before returning it to the page.
self.addEventListener('fetch', event => {
  // Skip cross-origin requests, like those for Google Analytics.
  if (event.request.url.startsWith(self.location.origin)) {
    event.respondWith(
      caches.match(event.request).then(cachedResponse => {
        if (cachedResponse) {
          return cachedResponse;
        }

        return caches.open(RUNTIME).then(cache => {
          return fetch(event.request).then(response => {
            // Put a copy of the response in the runtime cache.
            return cache.put(event.request, response.clone()).then(() => {
              return response;
            });
          });
        });
      })
    );
  }
});

当我启动我的应用程序时,如果我查看 chrome 控制台,另一个 service-worker.js 会覆盖我的。如果在我的项目中,我不明白我没有的这个服务人员是什么:

/* global self */

// This service worker file is effectively a 'no-op' that will reset any
// previous service worker registered for the same host:port combination.

// It is read and returned by a dev server middleware that is only loaded
// during development.

// In the production build, this file is replaced with an actual service worker
// file that will precache your site's local assets.

self.addEventListener('install', () => self.skipWaiting())

self.addEventListener('activate', () => {
  self.clients.matchAll({ type: 'window' }).then(windowClients => {
    for (const windowClient of windowClients) {
      // Force open pages to refresh, so that they have a chance to load the
      // fresh navigation response from the local dev server.
      windowClient.navigate(windowClient.url)
    }
  })
})

我如何使用我的 Service Worker?

【问题讨论】:

  • 这是故意的,只是为开发使用不同的名称来克服它的默认替换,这实际上是为了禁用服务工作者并让您的生活更轻松升级您的网站等

标签: javascript vue.js service-worker progressive-web-apps


【解决方案1】:

这似乎确实是故意的。如果你真的想测试你的服务工作者,那么可以随意将文件名更改为不同于默认名称的名称:service-worker.js,例如service-worker-dev.js。原因是在开发模式下使用 service worker 会导致极其混乱的调试情况。

注意替换service-worker的评论中有提示:

// This service worker file is effectively a 'no-op' that will reset any
// previous service worker registered for the same host:port combination.

// It is read and returned by a dev server middleware that is only loaded
// during development.

// In the production build, this file is replaced with an actual service worker
// file that will precache your site's local assets.

一旦您对 service-worker 的工作感到满意,您就会喜欢在开发模式下工作时完全禁用它的事实 :-) 希望这会有所帮助!

【讨论】:

  • 嗯好吧我明白了,但是你知道默认文件在哪里吗?我不明白。我必须把我的 service-worker-dev.js 放在哪里?在公共文件夹或 src 中?
  • 关于放置的位置,您可以将它放在 src 中,只要它最终通过 gulp 或任何正在部署它的东西 (VueCli) 复制到公共文件夹。理想情况下,服务工作者需要放置在您域的 / 中,因此相对路径将是 /service-worker-dev.js。这是因为 service worker 只会控制其当前位置下的资源。例如,如果你希望它只控制 /some/folder/,那么你可以将 service worker 放在 /some/folder/service-worker-dev.js 中。公共文件夹很可能是 /
  • 当您使用的部署工具应该为您将src 中的资源部署到public 中时,直接保存到公用文件夹是一种不好的做法。这是因为下次您使用部署工具时,您的文件可能会丢失,因为它不会在 src 中!
  • 好的,但是当我把它放到 public 时它可以工作,但是当我把它放到 src 时它找不到路径
  • 我只用npm run build
猜你喜欢
  • 2019-07-18
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多