如何使用 sw-precache 缓存除内容以外的所有内容

How to cache everything but content using sw-precache

我在 jekyll 网站中使用 sw-precache 添加离线功能,配置如下:

gulp.task('generate-service-worker', function(cb) {
  var path = require('path');
  var swPrecache = require('sw-precache');
  var rootDir = '_site';
  var packageJson = require('./package.json');

  swPrecache.write('./service-worker.js', {
    staticFileGlobs: [rootDir + '/**/*.{html,css,png,jpg,gif,svg}', rootDir + '/js/*'],
    stripPrefix: rootDir + '/',
    runtimeCaching: [{
      urlPattern: /\/$/,
      handler: 'networkOnly'
    }],
    handleFetch: argv.cacheAssets || false,
    maximumFileSizeToCacheInBytes: 10485760, // 10 mb
    cacheId: packageJson.name + '-v' + packageJson.version
  }, cb);
});

问题是,当我更改网站内容时(例如,博客 post 中的文本,或索引页面中的某些文本),直到新的 serviceworker 才会显示更改已安装版本并刷新浏览器,这当然是 cacheFirst.

的预期行为

我想要的是始终首先网络对站点索引的请求,这就是我在这里尝试的:

runtimeCaching: [{
  urlPattern: /\/$/,
  handler: 'networkFirst'
}]

但这不起作用,索引总是从 serviceworker 而不是从网络获取,我该如何实现?

我的问题是我为预缓存包含了实际页面内容:'/**/*.{html,css,png,jpg,gif,svg}'

排除 html 文件按预期工作:

'/**/*.{css,png,jpg,gif,svg}'

将 url 模式更改为

urlPattern: "'/'"

这是一个完全匹配模式。您的索引将与此匹配,仅此而已。

解决方法是,将您的 index.html 视为动态内容。

将您的 sw webpack 配置更改为

new SWPrecacheWebpackPlugin({
  cacheId: 'yourcacheid',
  filename: 'service-worker.js',
  staticFileGlobs: [
    'dist/**/*.{js,css}'
  ],
  minify: true,
  stripPrefix: 'dist/',
  runtimeCaching: [{
    urlPattern: /\/$/,
    handler: 'networkFirst'
  }]
})

从 staticFileGlobs 中删除你的 index.html 并将你的根索引添加到运行时缓存。

然后看看你的缓存存储。您将看到类似于 $$$toolbox-cache$$$https://your-domain.com 的内容作为新的缓存项。检查它,你可以看到你的索引缓存在那里。