代码之家  ›  专栏  ›  技术社区  ›  Jason Allshorn

如何包含sw precache未命中的文件

  •  0
  • Jason Allshorn  · 技术社区  · 7 年前

    我正在使用包裹插件sw precache,它围绕sw precache进行包装,使其与parcel.js一起工作。一切正常,我一直在测试我的离线应用程序。

    问题

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

    我试过的

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

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

    问题

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jason Allshorn    7 年前

    在我探索答案的过程中。我放弃了使用包插件sw precache,转而使用workbox。如果您有兴趣使用Parcel.js创建脱机应用程序。然后我推荐Workbox,因为它是下一代sw precache。

    我就是这样让它工作的:

    学习

    了解Workbox是什么,以及它的作用 code lab.

    1) Install the Workbox CLI globally.
    -外壳是一个固定文件。Workbox向导将选取它并生成一个 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
    


    c:在运行向导时指定的位置生成新的sw.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 这对我也有一点帮助。

    推荐文章