【发布时间】:2018-05-22 07:00:54
【问题描述】:
我正在使用带有 Angular-cli-1.6.0 的 workbox-build-2.1.2 和 workbox-sw-2.1.2,一切正常,但是当我更新应用程序并为生产和 sw.js 构建它时文件被修改然后在 chrome 浏览器中服务工作者没有更新它继续使用旧版本,直到我手动取消注册它。它是否应该不安装新的 sw.js 文件,当它安装新版本时,它还会清理网站旧数据兑现并自动开始新的石板,还是我需要设置那部分?
这是我在 Angulars 主文件中注册 sw.js 的方法:
platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(registerServiceWorker)
.catch(err => console.log(err));
function registerServiceWorker() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('sw.js')
.then(reg => {
log('Registration successful', reg);
reg.onupdatefound = () => {
const installingWorker = reg.installing;
installingWorker.onstatechange = () => {
switch (installingWorker.state) {
case 'installed':
if (navigator.serviceWorker.controller) {
log('New or updated content is available', installingWorker);
} else {
log('Content is now available offline', installingWorker);
}
break;
case 'redundant':
console.error('The installing service worker became redundant', installingWorker);
break;
default:
log(installingWorker.state);
break;
}
};
};
})
.catch(e => {
console.error('Error during service worker registration:', e);
});
} else {
console.warn('Service Worker is not supported');
}
}
我使用 npm 运行的 generate-sw 文件
const workboxBuild = require('workbox-build');
const SRC_DIR = 'src';
const BUILD_DIR = 'public';
const SW = 'sw.js';
const globPatterns = [
"**/*.{ico,html,css,js,woff,json}"
];
const globIgnores = [
"sw.js"
];
const input = {
swSrc: `${SRC_DIR}/${SW}`,
swDest: `${BUILD_DIR}/${SW}`,
globDirectory: BUILD_DIR,
globPatterns: globPatterns,
globIgnores: globIgnores,
maximumFileSizeToCacheInBytes: 4000000
};
workboxBuild.injectManifest(input).then(() => {
console.log(`The service worker ${BUILD_DIR}/${SW} has been injected`);
});
和基础 sw.js 文件
importScripts('workbox-sw.prod.v2.1.2.js');
const workboxSW = new self.WorkboxSW({clientsClaim: true});
workboxSW.precache([]);
workboxSW.router.registerNavigationRoute('/index.html');
*****更新*****
将 express.js 用于开发服务器,我将 Cache-Control 设置为零,现在当我重新加载页面时,服务工作者会更新到较新的版本。我在生产中感到困惑,将 Cache-Control 设置为天/年,服务工作者需要多长时间才能更新,它会清除旧的现金和 indexDB,还是我们必须手动进行
这里是快递的代码:
app.use('/', express.static(publicFolderPath, {maxAge: 0}));
app.get('*', (req, res) => {
res.sendFile('index.html');
});
【问题讨论】:
-
确保 sw.js 确实发生了变化。如果它没有改变,但你更新了你导入的脚本,浏览器不知道这些文件已经更新。当我开始将逻辑抽象为单独的文件时,我发现了类似的行为。让我发疯 :) 我为您提供的最佳实践是,当您更新逻辑脚本时,您还应该修改您的服务工作者。我的 sw.js 文件中有一个版本参数,并在需要时修改它们。
-
Jeff 谢谢你的链接,但是我的服务器工作人员很好,它只是保护最终用户的浏览器,如果它发生了变化,它将每 24 小时更新一次,无论 Cache-Control 设置多长时间。缓存会自动清除数据吗? .Chris 我尝试添加一个版本参数并不断更新它,但浏览器不会重新加载它,我正要修改文件名只是为了让它更新。
标签: node.js angular service-worker workbox