Как написать PWA в Vue js? - PullRequest
0 голосов
/ 22 апреля 2020

я писал pwa через vanilla javascript вот так

importScripts('/src/js/idb.js');
importScripts('/src/js/utility.js');

const CACHE_STATIC_NAME = 'static-v4';
const CACHE_DYNAMIC_NAME = 'dynamic-v2';
const STATIC_FILES = [
  '/',
  '/index.html',
  '/offline.html',
  '/src/js/app.js',
  '/src/js/feed.js',
  '/src/js/promise.js',
  '/src/js/fetch.js',
  '/src/js/idb.js',
  '/src/js/material.min.js',
  '/src/css/app.css',
  '/src/css/feed.css',
  '/src/images/main-image.jpg',
  'https://fonts.googleapis.com/css?family=Roboto:400,700',
  'https://fonts.googleapis.com/icon?family=Material+Icons',
  'https://cdnjs.cloudflare.com/ajax/libs/material-design-lite/1.3.0/material.indigo-pink.min.css'
 ];

 self.addEventListener('install', function(e) {
    e.waitUntil(
      caches.open(CACHE_STATIC_NAME)
       .then(function(cache) {
           console.log('[Service Worker] Installing Service Worker ...');
              cache.addAll(STATIC_FILES);
       })
    );
 });

 self.addEventListener('activate', function(e) {
    console.log('[Service Worker] Activating Service Worker ...');

    // clear old cache
    e.waitUntil(
        caches.keys()
          .then(function(cachedKeys) {
              return Promise.all(cachedKeys.map(function(key) {
                  if(key !== CACHE_STATIC_NAME && key !== CACHE_DYNAMIC_NAME) {
                    return caches.delete(key);
                  }
              }))
          })
    );
// Tell the active service worker to take control of the page immediately.
    return self.clients.claim(); // to ensure that activating is correctly done
});

//After install, fetch event is triggered for every page request
self.addEventListener('fetch', function(event) {
  let url = 'https://pwa-training-4a918.firebaseio.com/posts.json';

  if(event.request.url === url) {
    event.respondWith( 
      fetch(event.request).then(res => {
          let clonedRes = res.clone();
          // in order to clear ol data if new data is different from the original one
          clearAllData('posts')
            .then(() => {
              return clonedRes.json()
            })
            .then(data => {
              for(let key in data) {
                writeData('posts', data[key])
              }
            });


          return res;
        })
      );
    // USE Cache only Strategy if the request is in the static Files
  } else if(STATIC_FILES.includes(event.request.url)) {
    event.respondWith(
      caches.match(event.request)
    ); 
  } else {
    event.respondWith(
      caches.match(event.request).then(response => {
        return response || fetch(event.request).then(response => {
          return caches.open(CACHE_DYNAMIC_NAME).then(cache => {
            cache.put(event.request, response.clone());
  
            return response;
          })
        })
      })
      .catch(err => {
        return caches.open(CACHE_STATIC_NAME).then(cache => {
          // i need to show offline page only if the failure is in the help Page
          // because it does not make any sence if i show this page in case of the failure in files like css 
          if(event.request.headers.get('accept').includes('text/html')) {
            return cache.match('/offline.html');
          }
        })
      })
    );
  }
});

но когда я пытаюсь написать свое собственное приложение в vuejs, я установил pwa через vue add pwa, он создал для меня файл с именем registerServiceWorker.js, который я надену не понимаю, потому что я не привык его использовать

enter image description here

Этот файл содержит следующее

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

Я не знаю, как написать свой собственный код pwa здесь или где я могу это сделать? Также я не знаю, будет ли он работать на локальном хосте или нет, потому что, как я заметил, он работает в Production

Так что мой вопрос, как я могу написать PWA, как я делал это с vanilla js в vue приложении? Какие шаги я должен сделать, чтобы выполнить sh мой полностью настраиваемый PWA?

Могу ли я сделать это без использования рабочего окна?

, если кто-нибудь может мне помочь, я буду признателен.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Я / (почти наверняка большинство из нас) вряд ли будет бросать вызов работнику сервиса с нуля в любом проекте, Workbox также рекомендует инструменты для страницы разработчиков Google, кроме Vue CLI.

Как registerServiceWorker.js, это шаблон для вашего рабочего цикла сервисов в вашем приложении, поскольку журналы довольно просты в потоке процесса вашего приложения

Если вы хотите делать все с нуля, Я бы предложил прочитать https://developers.google.com/web/fundamentals/primers/service-workers/, чтобы понять основы. Я бы порекомендовал, потому что service-worker в значительной степени "Я надеюсь, что вы знаете, что вы делаете со своим приложением, например, что делать, когда обновлять / кэшировать / делать, когда оффлайн /"

...