从main.js文件或index.html调用服务工作者是否正确?

问题描述 投票:0回答:1

我正在尝试使用Webpack在Vuejs上配置自定义服务工作者,但它并不完全使用事件或工作箱(取决于我调用sw.js文件的位置)。

以下来自Google的工作箱指南我已经将SW配置为注册和缓存数据,但正如我之前提到的,取决于我称之为SW的地方正在做错事(或者我可能只是愚蠢)。

例如,如果我在index.html上注册文件SW,如下所示:

index.html

<script>
    // Check that service workers are registered
    if ('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
            navigator.serviceWorker.register('service-worker.js').then(registration => {
                // registration.pushManager.subscribe({ userVisibleOnly: true, 
                //   applicationServerKey: key });
                console.log('SW registered: ', registration);
            }).catch(registrationError => {
                console.log('SW registration failed: ', registrationError);
            });
        });
    }
</script>

...我的SW已注册,但它无法捕获下面显示的SW文件(离线和在线)(service-worker.js)但我能够使用工作箱:

service-workers.js

import store from './store/index';

window.addEventListener('online', () => {
  console.log('Ando online compa');
  store.dispatch('IndexedDB/prueba');
});

window.addEventListener('offline', () => {
  console.log('Ando offline compa');
  store.dispatch('IndexedDB/prueba');
});

window.addEventListener('push', (event) => {
  const title = 'Get Started With Workbox';
  const options = {
    body: event.data.text(),
  };
  event.waitUntil(window.registration.showNotification(title, options));
});

workbox.core.skipWaiting();
workbox.core.clientsClaim();
workbox.precaching.precacheAndRoute(self.__precacheManifest);

...如果我从index.html中删除脚本标记并在main.js上调用并修改service-worker.js,如下所示:

main.js

import './vapidHelper';
import Vue from 'vue';
import './plugins/vuetify';
import VueSocketIO from 'vue-socket.io';
import App from './App.vue';
import router from './router';
import store from './store';
import './axiosConfig';
import initDB from './indexedDB/IndexedDB';
import './service-worker'; // <---- LINE

Vue.config.productionTip = false;
...

service-worker.js

import store from './store/index';

if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('service-worker.js').then((registration) => {
      // registration.pushManager.subscribe({ userVisibleOnly: true, 
      //   applicationServerKey: key });
      console.log('SW registered: ', registration);
    }).catch((registrationError) => {
      console.log('SW registration failed: ', registrationError);
    });
  });

  window.addEventListener('online', () => {
    console.log('Ando online compa');
    store.dispatch('IndexedDB/prueba');
  });

  window.addEventListener('offline', () => {
    console.log('Ando offline compa');
    store.dispatch('IndexedDB/prueba');
  });

  window.addEventListener('push', (event) => {
    const title = 'Get Started With Workbox';
    const options = {
      body: event.data.text(),
    };
    event.waitUntil(window.registration.showNotification(title, options));
  });
}

workbox.core.skipWaiting();
workbox.core.clientsClaim();
workbox.precaching.precacheAndRoute(self.__precacheManifest);

...在这种情况下,我能够听到事件,但我无法使用工作箱(我在控制台上收到一个错误,它是未定义的。)

你知道什么可能做错了吗?

vue.js webpack service-worker workbox workbox-webpack-plugin
1个回答
0
投票

我觉得你这里有些困惑,让我解释一下:)

服务工作者和Web应用程序/网页本身不共享相同的执行上下文。如果在SW脚本中定义变量,则页面上的“普通”JavaScript无法访问它,反之亦然。它们完全分开。

出于这个原因,如果你把这样的东西:

import store from './store/index';

在您的service-worker.js(Service Worker脚本)中,它与main.js中具有相同代码行的含义并不相同。您无法从SW脚本调度Vuex操作。

你怎么能从SW到“主捆”进行沟通?使用postMessage。使用postMessage,您可以将JSON消息从页面发送到SW,从SW发送到页面。然后,消息处理程序可以调度Vuex操作等。

这对你有用吗?

© www.soinside.com 2019 - 2024. All rights reserved.