workbox-build-2.1.2 と workbox-sw-2.1.2 を Angular-cli-1.6.0 で使用していますが、すべて正常に動作しますが、アプリを更新して本番用にビルドすると、sw.js ファイルが変更されますその後、クロムブラウザでは、サービスワーカーは更新されず、手動で登録解除するまで古いバージョンを使用し続けます。新しい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 をゼロに設定し、ページをリロードすると Service Worker が新しいバージョンに更新されます。サービスワーカーが更新するのにどれくらいの時間がかかるか、それとも手動で行う必要がありますか?
エクスプレスのコードは次のとおりです。
app.use('/', express.static(publicFolderPath, {maxAge: 0}));
app.get('*', (req, res) => {
res.sendFile('index.html');
});