パフォーマンス最適化小冊子-プログラム可能キャッシュ:Service Workers
9961 ワード
Service Workersは、単に
いくつかの注意点
Service workerは、指定されたソースおよび経路に登録されたイベント駆動ウォーカーである.
ウォーカーコンテキストで動作していますが、DOMにはアクセスできません.駆動アプリケーションの主JavaScriptスレッドに対して、他のスレッドで実行されていますので、ブロックが発生しません.
それはJavaScriptを採用して関連しているページあるいはウェブサイトを制御して、アクセスと資源の要求を遮断して修正して、きめ細かい粒度で資源をキャッシュします.特定のシナリオ(最も一般的な場合はネットワークが利用できない)でのアプリケーションの表現を完全に制御することができます.
完全非同期API(XHRやlocal Strageなど)はService workerでは使用できないように設計されています.
すでに
ブラウザのペアを理解する
serivceワーカーのサポート.
コード例が現在のバージョンのブラウザでどのように正常に動作しないかを発見したら、ブラウザの関連設定を開く必要があります.
また、安全のためにService WorkersはHTTPSの下で運行しなければならないということに注意したい.現地開発のために、
Service Workerを登録します.
この文書の
この目的を達成するために、
Cacheインターフェースはworkersのように、windowの役割領域に露出しています.service workerの標準に定義されていますが、service workerに協力して使う必要はありません.
もし
注意:
fetchで要求をブロックする
サイトリソースは現在キャッシュされていますが、また
表示
Fetch API documentationは、RequestおよびReponseオブジェクトに関するより多くの情報を知る.
キャッシュ・リストを更新し、は、古いキャッシュをどのように削除し、キャッシュを更新するかについて、MDN教程を推薦する. は、 最適化後の効果
Chromeは一つあります
付
同じシリーズの記事: この文章 性能最適化小冊子-非同期スタック追跡:どうしてawaitがPromiseに勝るのですか? 性能最適化小冊子-分類構築:良いwebpack hashを利用する 関連文献 Service WorkカーAPI-性能は小冊子を最適化します。ウェブページの応答速度を高めます。CDNの性能を最適化します。 Service Workers-https://developer.mozilla.org... を使用する. Cache-https://developer.mozilla.org... Cache.addAll()-https://developer.mozilla.org... CacheStrage.open()-https://developer.mozilla.org... CacheStrage.match()-https://developer.mozilla.org... Fetch API https://developer.mozilla.org... WorkOrGlobal Schope.fetch()-https://developer.mozilla.org... Fetchovent-https://developer.mozilla.org... Request-https://developer.mozilla.org... Resonse-https://developer.mozilla.org...
PWA
、PC端末もその強大な機能を利用していくつかの面白い最適化を実現することができます.ネットワークの中にService Workersについて紹介されたいい文章がたくさんあります.Service Workers
の詳細な教程.いくつかの注意点
Service workerは、指定されたソースおよび経路に登録されたイベント駆動ウォーカーである.
ウォーカーコンテキストで動作していますが、DOMにはアクセスできません.駆動アプリケーションの主JavaScriptスレッドに対して、他のスレッドで実行されていますので、ブロックが発生しません.
それはJavaScriptを採用して関連しているページあるいはウェブサイトを制御して、アクセスと資源の要求を遮断して修正して、きめ細かい粒度で資源をキャッシュします.特定のシナリオ(最も一般的な場合はネットワークが利用できない)でのアプリケーションの表現を完全に制御することができます.
完全非同期API(XHRやlocal Strageなど)はService workerでは使用できないように設計されています.
すでに
serivce worker
がサポートされているブラウザのバージョンでは、多くの特性がデフォルトで開かれていません.ブラウザのペアを理解する
serivceワーカーのサポート.
コード例が現在のバージョンのブラウザでどのように正常に動作しないかを発見したら、ブラウザの関連設定を開く必要があります.
また、安全のためにService WorkersはHTTPSの下で運行しなければならないということに注意したい.現地開発のために、
localhost
もブラウザから安全源として認識されている.Service Workerを登録します.
ServiceWorkerContainer.register()
関数を使用してサイトのservice worker
を登録する(service sorker
はJavaScriptスクリプトだけ).この文書の
url
は対である.origin
は、参照されたJSファイルに対してではなく、.
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/serviceworker.js")
.then(function(reg) {
if(reg.installing) {
console.log('Service worker installing');
} else if(reg.waiting) {
console.log('Service worker installed');
} else if(reg.active) {
console.log('Service worker active');
}
})
.catch(console.error);
}
キャッシュリストの設定Service Worker
に登録した後、ブラウザはあなたのページまたはサイトのためにインストールしてアクティブにすることを試みる.install
イベントは登録完了後にトリガされ、install
イベントは一般的にブラウザのキャッシュ機能を満たすために使用される.この目的を達成するために、
Service Worker
の新しいフラグを使用した記憶API-Cache
、service worker上のグローバルオブジェクトは、ネットワーク応答で送信されたリソースを記憶し、それらの要求に応じてkey
を生成することができる.Cacheインターフェースはworkersのように、windowの役割領域に露出しています.service workerの標準に定義されていますが、service workerに協力して使う必要はありません.
// serviceworker.js
const cacheName = 'my-cache';
// self worker ,
self.addEventListener('install', event => {
//
const filesToCache = [
'/',
'/static/css/reset.css',
'/static/css/css-loader.css',
'/static/css/create-version.css',
'/static/css/bootstrap-grid.css',
'/static/css/bootstrap.css',
'/static/js/css-animations.js',
'/static/js/vue.js',
];
event.waitUntil(
// caches CacheStorage :caches instanceof CacheStorage -> true
// CacheStorage.open(cacheName) Cache
caches.open(cacheName)
// URL
.then(cache => cache.addAll(filesToCache))
.catch(e => console.error(e))
);
});
ここでは、install
イベントモニターを追加し、次いでイベントにExtensdable Event.wait Unitil()方法を接続した.waitUntil()
は、サービスワーカーがwaitUntil()
の中のコードが実行される前にインストールされないようにするために使用されています.もし
caches.open(cacheName)
rejected
,インストールが失敗します.worker
は、何もしない(例えば、URLのスペルミス).注意:
Service Worker
スレッドの最初の登録/起動ページは、再度ローディングする必要があります.Service Worker
スレッドは、インストールが完了してアクティブ状態になる前にfetch
イベントおよびpush
イベントを受信しない.fetchで要求をブロックする
サイトリソースは現在キャッシュされていますが、また
Service Worker
にこれらのキャッシュコンテンツを使って何をするかを教える必要があります.fetch APIを介してブロックすることができます.//fetch ,
self.addEventListener('fetch', e => {
e.respondWith(
caches.match(e.request)
.then(response => response ? response : fetch(e.request))
)
});
caches.match(event.request)
は、ネットワーク要求のリソースとcache
で取得可能なリソースとをマッチングさせ、キャッシュに対応するリソースがあるかどうかを確認することができる.このマッチングは、通常のurl
によって要求されるように、vary header
およびhttp
によって行われる.表示
Fetch API documentationは、RequestおよびReponseオブジェクトに関するより多くの情報を知る.
catch
リソースに一致すると、caches.match(event.request)
はresolve
になり、then
のフィードバックでresponse
に直接に戻ることができる.caches.match(e.request)
.then(response => response)
リソースにマッチしていない場合は、caches.match(event.request)
はreject
を使用してデフォルトのネットワーク要求をブラウザに直接に伝えることができる.(ネットワークが利用可能な場合は、直接にサーバにリソースを要求することができることを意味する)caches.match(e.request)
.then(response => response ? response : fetch(e.request))
キャッシュを更新キャッシュ・リストを更新し、
fetch
イベントによって処理することができ、本明細書の判例コードは実現されていない.clients.claim()を使用してページを制御権取得するだけで、その後にページを開くとバージョン更新されたキャッシュが使用される.self.addEventListener('activate', e => self.clients.claim());
activate
プロジェクトにおいてSPA
を導入することによってURLの変化を引き起こすことができるということについて、この場合、hash
のキャッシュをどのように更新するかを推奨する.Chromeは一つあります
Service Worker
は、現在のデバイスにおいてアクティブで記憶されているserviceワーカーを示すことができる.もう一つありますchrome://inspect/#service-workers
は、ウォーカーのプロセスを開始/停止/調整することができます.chrome://serviceworker-internals
のChrome devTools
を通して、現在のサービス作業スレッドの動作状況を確認することができます.付
Application Tab
完全コード:
const cacheName = 'my-cache';
// self.clients.claim() ,
self.addEventListener('activate', e => self.clients.claim());
self.addEventListener('install', event => {
//
const filesToCache = [
'/',
'/static/css/reset.css',
'/static/css/css-loader.css',
'/static/css/create-version.css',
'/static/css/bootstrap-grid.css',
'/static/css/bootstrap.css',
'/static/js/css-animations.js',
'/static/js/vue.js',
];
event.waitUntil(
// caches CacheStorage :caches instanceof CacheStorage -> true
// CacheStorage.open(cacheName) Cache
caches.open(cacheName)
// filesToCache ( URL )
.then(cache => cache.addAll(filesToCache))
.catch(e => console.error(e))
);
});
// fetch
self.addEventListener('fetch', e => {
e.respondWith(
caches.match(e.request)
.then(response => {
return response ? response : fetch(e.request)
})
)
});
拡張読書のオススメ:サービスワーカーのモバイル端末H 5項目への適用.同じシリーズの記事: