如何包含sw-precache丢失的文件

时间:2018-10-30 09:22:15

标签: service-worker offline-caching workbox sw-precache parceljs

上下文

我正在使用包裹包裹sw-precache的parcel-plugin-sw-precache,以使其与Parcel.js一起使用。一切都按预期进行,并且我一直在测试离线应用程序。

问题

我在项目中添加了react-pdf.js,当该库的依赖项之一由sw-precache生成时,不会被添加到服务工作者中。我知道这是因为,当我切换到离线模式时,文件“ pdf.worker.entry.7ce4fb6a.js”给出了304错误。

我尝试过的事情

我正在尝试使用以下代码将文件手动添加到package.json parcel-plugin-sw-precache配置:

 "sw-precache": {
    "maximumFileSizeToCacheInBytes": 10485760,
    "staticFileGlobs": [
      "/pdf.worker.entry.7ce4fb6a.js"
    ]
  },

我不确定文件路径是相对于package.json还是相对于生成的服务工作者。无论如何,不​​会像我期望的那样添加手动指定的文件来生成服务工作程序。如下所示。

self.__precacheManifest = [{
  "url": "index.html",
  "revision": "ac5ace7a43a0fef7ae65fd3119987d1f"
}, {
  "url": "castly.e31bb0bc.css",
  "revision": "657409f7159cb857b9409c44a15e653f"
}, {
  "url": "castly.e31bb0bc.js",
  "revision": "018d4664d809ec19d167421b359823ad"
}, {
  "url": "/",
  "revision": "af5513bb330deae3098ab289d69a40c7"
}]

问题

如果sw-precache或parcel-plugin-sw-precache似乎缺少一些文件,我如何确保将它们添加到生成的服务程序中?

1 个答案:

答案 0 :(得分:0)

在我的探索中寻找答案。我放弃使用parcel-plugin-sw-precache,而是改用Workbox。如果您有兴趣使用Parcel.js创建脱机应用程序。然后,我建议使用Workbox,因为它是下一代sw-precache。

这是我的工作方式:

学习

了解此code lab.

是什么,它是什么?

正在执行

1)Install the Workbox CLI globally.
2)在根目录中创建一个占位服务工作器。例如sw_shell.js      -外壳是一个保存文件。 Workbox向导会选择它并生成一个        新的sw.js文件。 3)将以下代码添加到sw_config.js:

importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");

if (workbox) {
workbox.skipWaiting();
workbox.clientsClaim();
workbox.precaching.suppressWarnings();

// The next line came from the code lab
workbox.precaching.precacheAndRoute([]);
workbox.routing.registerNavigationRoute("/index.html");
} else {
  console.log(`Boo! Workbox didn't load `);
}

4)从项目的根目录中打开的命令行运行此代码。

workbox wizard --injectManifest

5)按照向导中的步骤进行操作。为了开发目的,将“根Web应用程序”指向您的包裹dist文件夹。 Workbox发挥了魔力,并拾取了这些文件以散列为新的sw.js文件。

6)向导将询问您现有的sw.js文件。就我而言,我使用sw_shell.js。

a:Workbox选择sw_shell.js。
  c:在运行向导时指定的位置中作为新的sw.js文件生成,并注入文件以脱机运行。

在我的情况下,我让新的sw.js在我的根文件夹中生成,因为Parcel会根据index.js中的脚本自动将其拾取。

'use strict';
if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('sw.js').then(function(reg) {
      console.log('Worker registration started')
      reg.onupdatefound = function() {
         console.log('update found')
        var installingWorker = reg.installing;
        installingWorker.onstatechange = function() {

          console.log('installing worker')
          switch (installingWorker.state) {

            case 'installed':
              if (navigator.serviceWorker.controller) {
                console.log('New or updated content is available.');
              } else {
                console.log('Content is now available offline!');
              }
              break;

            case 'redundant':
              console.error('The installing service worker became redundant.');
              break;
          }
        };
      };
    }).catch(function(e) {
      console.error('Error during service worker registration:', e);
    });
  });
} 

7)将workbox injectManifest添加到package.json中,以确保Workbox可以对文件进行任何更改:

  "scripts": {
    "start": "parcel index.html workbox injectManifest"
}

如果您想进一步了解此信息,请告诉我。有video here也对我有帮助。