@duanyubin
2018-06-15T02:35:03.000000Z
字数 2911
阅读 529
javascript
https://www.youtube.com/watch?v=jCKZDTtUA2A
https://developers.google.com/web/fundamentals/getting-started/primers/service-workers
Proxy between browser and network
BEFORE:
AFTER:
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/path/sw.js', { scope: '/path/' }).then(function(registration) {
// Registration was successful
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
// registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
});
}
disable sw.js
http cache
If we register service worker at /path/sw.js
, only pages like /path/page1
/path/page2
will be under control by service worker.
Decide which files you want to cache
self.addEventListener('install', function(event) {
// 1. Open a cache.
// 2. Cache our files.
// 3. Confirm whether all the required assets are cached or not.
event.waitUntil(
caches.open('v1').then(function(cache) {
return cache.addAll([
'/sw-test/',
'/sw-test/index.html',
'/sw-test/style.css',
'/sw-test/app.js',
'/sw-test/image-list.js',
'/sw-test/star-wars-logo.jpg',
'/sw-test/gallery/',
'/sw-test/gallery/bountyHunters.jpg',
'/sw-test/gallery/myLittleVader.jpg',
'/sw-test/gallery/snowTroopers.jpg'
]);
})
);
});
Recieve request and return response cache if exist
this.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).catch(function() {
return fetch(event.request);
})
);
});
this.addEventListener('activate', function(event) {
var cacheWhitelist = ['v2'];
event.waitUntil(
caches.keys().then(function(keyList) {
return Promise.all(keyList.map(function(key) {
if (cacheWhitelist.indexOf(key) === -1) {
return caches.delete(key);
}
}));
})
);
});
staticFileGlobs: [
'./dist/js/**/*.js',
'./dist/css/*.css',
'./dist/img/**/*',
'./dist/*.html'
],
stripPrefixMulti: {
'./dist/js/': `${cdnPrefix}/js/`,
'./dist/css/': `${cdnPrefix}/css/`,
'./dist/img/': `${cdnPrefix}/img/`,
'./dist/': dev ? '/' : `https://xxx/${projectName}/`
}
After compilation:
self.__precacheManifest = [
{
"url": "http://localhost:3000/css/detail.79e341dd393ad094529c.css",
"revision": "a2eef255ee6f166e4050a6226270beb4"
},
{
"url": "http://localhost:3000/js/detail.ede7025524a699a749bb.js",
"revision": "e532f0c17656a3e1a9081fd1dcd11aac"
}
]
runtimeCaching: [{
urlPattern: /https:\/\/s3.pstatp.com\/pgc\/tech\/collect\/collect-.*/,
handler: 'cacheFirst',
options: {
cacheName: 'tea-sdk'
}
}, {
urlPattern: /https:\/\/m.dcdapp.com\/motor\/brand\/m\/v1\/brand/,
handler: 'staleWhileRevalidate',
options: {
cacheName: 'brand-list'
}
}],
staleWhileRevalidate
networkFirst