Service Workerの概念と応用紹介
17838 ワード
Service workers
は、本質的にはWebアプリケーションとブラウザとの間のプロキシサーバとして機能し、ネットワークが利用可能な場合はブラウザとネットワークとの間のプロキシとして機能してもよい.Service worker
は、指定されたソースと経路の下に登録されているイベントドライバである.JavaScript
を用いて、関連ページまたはウェブサイトを制御し、アクセスおよびリソース要求を遮断し、修正し、リソースを細々とキャッシュする.特定のシナリオ(最も一般的な場合はネットワークが利用できない)でのアプリケーションの表現を完全に制御することができます.Service worker
は、worker
コンテキストで動作し、したがって、DOMにアクセスできない.駆動アプリケーションのメインJavaScript
スレッドに対して、他のスレッドで動作しているので、ブロックが発生しない.完全非同期のAPI(XHR
およびlocalStorage
など)はservice worker
では使用できないように設計されている.セキュリティ上の観点から
Service workers
はHTTPS
によってしか積載できません.何しろ、ネット上で要求された能力を修正して中間者に暴露するのは危険です.service worker手順を使う
serviceWorker.register.( service work )
を介して// js main.js
navigator.serviceWorker.register('sw.js')
.then(function(registration) {
console.log('Registered events at scope: ', registration.scope);
});
service worker
はServiceWorkerGlobalScope
環境で実行される.これは、特別なタイプのwoker
コンテキスト実行環境であり、メイン実行スレッド(実行スクリプト)とは独立しており、DOM
にアクセスする能力もない.service worker
は、事件を処理することができます.service worker
によって制御されているページは、初めて開いた後にservice worker
のインストールを試みる.service worker
に最初に送信されたイベントは、インストールイベント(このイベントでパディングIndexDB
およびキャッシュサイトリソースが開始され得る)// sw.js service worker
// self worker
self.addEventListener('install', function(event) {
event.waitUntil( // ExtendableEvent.waitUntil() 。 , 。
caches.open('v1').then(function(cache) { // caches service worker
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/bountyHunters.jpg',
'/sw-test/gallery/myLittleVader.jpg',
'/sw-test/gallery/snowTroopers.jpg'
]);
})
);
});
install
イベントの処理プログラムが実行された後、ServiceWorker
はinstalled
状態になり、メインスレッドに戻ってきたregistration.waiting
属性はinstalled
状態に入ったServiceWorker
navigator.serviceWorker.register('./sw.js').then(function(registration) {
if (registration.waiting) {
// Service Worker is Waiting
}
})
service worker
のインストールが完了したら、他のservice workerがなかったら、swは次の段階に進みます.もし以前にservice workerがあったら、このswは三つの状況を待っています.ServiceWorker
スレッドコードにself.skipWaiting()
ServiceWorker
が解放されたときServiceWorker
次の段階に入ると、サブスレッド(例の
sw.js
)はアクティブイベントを受信する.activating
段階の主な用途は、以前のバージョンのservice workerスクリプトで使用されたリソースを整理することである.const cacheStorageKey = ' '
self.addEventListener('activate', function(e) {
// active
var cacheDeletePromises = caches.keys().then(cacheNames => {
console.log('cacheNames', cacheNames, cacheNames.map);
return Promise.all(cacheNames.map(name => {
if (name !== cacheStorageKey) { // key key
console.log('caches.delete', caches.delete);
var deletePromise = caches.delete(name);
console.log('cache delete result: ', deletePromise);
return deletePromise;
} else {
return Promise.resolve();
}
}));
});
console.log('cacheDeletePromises: ', cacheDeletePromises);
e.waitUntil(
Promise.all([cacheDeletePromises]
)
)
})
e.waitUntil
が受信したPromise
が成功状態に入ると、ServiceWorker
のライフサイクルはactivated
状態になる.このとき、メインスレッド内のregistration
のactive
属性は、activated
状態に入るServiceWorker
の例を表している.navigator.serviceWorker.register('./sw.js').then(function(registration) {
if (registration.active) {
// Service Worker is Active
}
})
self.addEventListener('fetch', function(event) {
event.respondWith(
// caches.match() resolves , , undefined
caches.match(event.request).then(function() {
return fetch(event.request).then(function(response) {
return caches.open('v1').then(function(cache) {
cache.put(event.request, response.clone()); //
// clone : 。 , 。 , 。 。
return response;
});
});
}).catch(function() {
return caches.match('/sw-test/gallery/myLittleVader.jpg');
})
);
});
参照リンク:https://developer.mozilla.org/zh-CN/docs/Web/API/Service_ワーカーカーAPI/Using_Service_Worket.
https://www.cnblogs.com/dojo-lzz/p/8047336.htm