【问题标题】:Workbox precache doesn't precache工作箱预缓存不预缓存
【发布时间】:2020-12-10 00:05:55
【问题描述】:

我正在尝试实现工作箱以在网站上预缓存图像和视频资产。

我创建了一个服务工作者文件。它似乎在我的应用程序中被成功引用和使用。服务人员:

import { clientsClaim, setCacheNameDetails } from 'workbox-core';
import { precacheAndRoute, addRoute } from 'workbox-precaching';

const context = self; // eslint-disable-line no-restricted-globals

setCacheNameDetails({ precache: 'app' });

// eslint-disable-next-line no-restricted-globals, no-underscore-dangle
precacheAndRoute(self.__WB_MANIFEST);

context.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('dive').then((cache) => {
      console.log(cache);
    }),
  );
});

context.addEventListener('activate', (event) => {
  console.log('sw active');
});

context.addEventListener('fetch', async (event) => {
  console.log(event.request.url);
});

context.addEventListener('message', ({ data }) => {
  const { type, payload } = data;

  if (type === 'cache') {
    payload.forEach((url) => {
      addRoute(url);
    });

    const manifest = payload.map((url) => (
      {
        url,
        revision: null,
      }
    ));

    console.log('attempting to precache and route manifest', JSON.stringify(manifest));
    precacheAndRoute(manifest);
  }
});

context.skipWaiting();
clientsClaim();

应用程序使用 workbox-window 加载、引用和消息服务工作者。该应用程序如下所示:

import { Workbox } from 'workbox-window';

workbox = new Workbox('/sw.js');

workbox.register();
workbox.messageSW({
  type: 'cache',
  payload: [
    { url: 'https://media0.giphy.com/media/Ju7l5y9osyymQ/giphy.gif' }
  ],
});

这个项目使用 vue 和 vue-cli。它有一个 webpack 配置,允许将插件发送到 webpack。配置如下:

const { InjectManifest } = require('workbox-webpack-plugin');
const path = require('path');

module.exports = {
  configureWebpack: {
    plugins: [
      new InjectManifest({
        swSrc: path.join(__dirname, 'lib/services/Asset-Cache.serviceworker.js'),
        swDest: 'Asset-Cache.serviceworker.js',
      }),
    ],
  },
};

我可以看到消息已成功发送到服务人员并包含正确的有效负载。但是,这些资产永远不会出现在 Chrome 开发工具缓存存储中。我也从未看到任何与通过 messageSW 发送的资产相关的工作箱日志记录。我还通过禁用我的互联网进行了测试,资产似乎没有加载到缓存中。我在这里做错了什么?

我发现工作箱文档有点不清楚,并且还尝试从服务人员中删除消息事件处理程序。然后,像这样向 service worker 发送消息:

workbox.messageSW({
  type: 'CACHE_URLS',
  payload: { urlsToCache: [ 'https://media0.giphy.com/media/Ju7l5y9osyymQ/giphy.gif'] },
});

这似乎对缓存也没有影响。

【问题讨论】:

  • 您是否有机会将其部署到公共 URL 并分享?我想重现和调试这个。
  • @JeffPosnick - 感谢您回复我。我把这个搞砸了,看起来从消息监听器内部调用 precacheAndRoute 并没有做任何事情。将相同的调用移到处理程序之外可以正常工作。我整理了一个小 git repo github.com/joelongstreet/workbox-doesnt-precache 并在这里发布了我的项目 - joelongstreet.com/workbox-doesnt-precache

标签: service-worker workbox workbox-webpack-plugin sw-precache workbox-window


【解决方案1】:

precacheAndRoute()precache 部分通过将installactivate 侦听器添加到当前服务工作线程来工作,利用service worker lifecycle。如果 Service Worker 在被调用时已经完成安装和激活,这实际上是一个空操作,如果您通过 message 处理程序有条件地触发它,则可能是这种情况。

我们可能应该警告人们在我们的 Workbox 开发版本中这种无效使用 precacheAndRoute();我已经提交了an issue 来跟踪它。

【讨论】:

  • 感谢您创建问题以更新文档。我认为您的链接末尾有一个额外的零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多