如何使用 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 的内容作为新的缓存项。检查它,你可以看到你的索引缓存在那里。
我在 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 的内容作为新的缓存项。检查它,你可以看到你的索引缓存在那里。