@duanyubin
2018-06-15T02:35:03.000000Z
字数 2911
阅读 592
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 successfulconsole.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
