VueJS service-worker.js игнорируется в моем PWA

Я создал прогрессивное веб-приложение с VueJS, файлы генерируются vuecli. Итак, у меня есть registerServiceWorker.js по умолчанию, я просто комментирую условие env:

/* 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.info(
        'App is being served from cache by a service worker.\n' +
        'For more details, visit https://...'
      )
    },
    registered () {
      console.info('Service worker has been registered.')
    },
    cached () {
      console.info('Content has been cached for offline use.')
    },
    updatefound () {
      console.info('New content is downloading.')
    },
    updated () {
      console.info('New content is available; please refresh.')
    },
    offline () {
      console.info('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;
            });
          });
        });
      })
    );
  }
});

И когда я запускаю свое приложение, другой service-worker.js переопределяет мое, если я смотрю консоль Chrome. Я не понимаю, что это за сервисный работник, которого у меня нет, если внутри моего проекта:

/* 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)
    }
  })
})

Как я могу использовать своего сервис-воркера?

Это сделано намеренно, просто используйте другое имя для разработки, чтобы обойти его замену по умолчанию, которая эффективно направлена ​​​​на отключение сервисного работника и облегчение вашей жизни при обновлении вашего веб-сайта и т. д.

dankilev 10.05.2019 12:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
1
2 840
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это кажется действительно преднамеренный. Если вы действительно хотите протестировать сервис-воркер, не стесняйтесь изменить имя файла на другое, отличное от имени по умолчанию: service-worker.js, например, service-worker-dev.js. Причина этого в том, что использование сервисного работника в режиме разработки может привести к чрезвычайно запутанным ситуациям отладки.

Note that there is a hint in the comment of the replacement 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-dev.js? в общей папке или src?

John 10.05.2019 13:20

Что касается места для размещения, вы можете поместить его в src, поскольку в конечном итоге он будет скопирован в общую папку с помощью gulp или того, что его развертывает (VueCli). В идеале сервис-воркер должен быть размещен в / вашего домена, чтобы относительный путь был /service-worker-dev.js. Это связано с тем, что сервисный работник будет контролировать ресурсы только в своем текущем местоположении. Например, если вы хотите, чтобы он контролировал только /some/folder/, вы можете поместить работника службы в /some/folder/service-worker-dev.js. Общая папка, скорее всего, /

dankilev 10.05.2019 13:46

Плохая практика — сохранять непосредственно в общедоступную папку, когда вы используете инструмент развертывания, который должен развертывать ресурсы из src в public для вас. Это связано с тем, что в следующий раз, когда вы будете использовать инструмент развертывания, вы, скорее всего, потеряете свой файл, поскольку его не будет в src!

dankilev 10.05.2019 13:52

Хорошо, но когда я публикую его, он работает, но когда я помещаю его в src, он не может найти путь

John 10.05.2019 13:57

Вероятно, это связано с тем, что когда вы поместили его в src, вы не использовали какой-либо инструмент развертывания для своей среды разработки, чтобы скопировать его для общего доступа. общедоступная папка — это та, которая содержит данные, к которым браузер должен получить доступ по пути /

dankilev 10.05.2019 14:05

Я просто использую npm run build

John 10.05.2019 14:11

Другие вопросы по теме