Service Workカー学習と実践(一)——オフラインキャッシュ
10864 ワード
何が ブラウザキャッシュ 用オフライン を実現します.メッセージプッシュ
例
ウェブサイトに
インストールが完了したら、ダウンロード( インストール( 起動( ユーザが初めて はダウンロードが完了した後、 はインストールが完了すると、起動されます.ブラウザは 図に示すように、
ページのすべてのネットワーク要求は、はまずホワイトリストがあります.ホワイトリストの の後、 淘汰 sw-precache-webpack-plugin
sw-precache-webpack-pluginは
一番簡単な構成は以下の通りです.
一番簡単な例です.キャッシュと更新は共存しています.バージョンを更新するたびに、 侵入なし式: は流されにくいです. オフライン: しかし、
後の話
本明細書では、
Service Worker
ですか?Service Worker
は、本質的にはWebアプリケーションとブラウザとの間のプロキシサーバとして機能し、ネットワークが利用可能な場合はブラウザとネットワーク間のプロキシとして機能してもよい.これらは、ネットワーク要求をブロックし、ネットワークが利用可能かどうかおよび更新されたリソースがサーバ上に存在するかどうかに基づいて適切な動作をとるために、有効なオフライン体験を作成することを目的とする.彼らはまた、訪問プッシュ通知とバックグラウンド同期API
を許可する.Service Worker
の本質はWeb Worker
であり、JavaScript
のメインスレッドから独立しているので、DOM
に直接アクセスすることもできず、window
オブジェクトに直接アクセスすることもできない.Service Worker
は、navigator
ページのすべてのネットワーク要求を制御することができるネットワークエージェントである.JavaScript
は、自身のライフサイクルを持ち、Service Worker
を上手に使う鍵は、そのライフサイクルを柔軟に制御することである.Web
の役割Service Worker
Service Worker
互換性Service Worker
は、近代的なブラウザの高機能であり、Web APP
、Service Worker
、Service Worker
などに依存しており、fetch API
は、Cache Storage
オブジェクトペアの記憶メカニズムを提供し、Promise
は複数のCache
を記憶する.例
Request / Response
の原理を理解する前に、セクションCache Storage
の例を先に見てみる.self.importScripts('./serviceworker-cache-polyfill.js');
var urlsToCache = [
'/',
'/index.js',
'/style.css',
'/favicon.ico',
];
var CACHE_NAME = 'counterxing';
self.addEventListener('install', function(event) {
self.skipWaiting();
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
self.addEventListener('activate', function(event) {
var cacheWhitelist = ['counterxing'];
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
次は段階を追って分析して、Cache
の神秘的なベールを開けます.Service Worker
最初の行を参照してください.Service Worker
は、ここにCache APIのpolyfillを導入しています.このService Worker
は、より低いバージョンのブラウザの下でpolyfill
を使用することができるようにサポートしています.self.importScripts('./serviceworker-cache-polyfill.js');
の機能を実現するには、一般的には、polyfill
プロキシネットワーク要求をキャッシュに組み合わせる必要がある.Cache Storage API
スレッドでは、Service Worker
を使用してCache API
スクリプトを導入し、低バージョンブラウザの互換性を目的としている.Service Worker
And importScripts
その後、1つのpolyfill
リストを使用してキャッシュが必要な静的リソースを宣言し、もう1つの変数Cache Resources List
を使用してキャッシュのCache Name
を決定し、ここではurlsToCache
はCACHE_NAME
であり、Cache Storage Name
はCache Storage
であると理解できる.var urlsToCache = [
'/',
'/index.js',
'/style.css',
'/favicon.ico',
];
var CACHE_NAME = 'counterxing';
DB
CACHE_NAME
は、ブラウザDB
のメインスレッドから独立しており、独自のライフサイクルがある.ウェブサイトに
Lifecycle
をインストールする必要がある場合、Service Worker
メインスレッドには、以下のコードを使用してJavaScript
を導入する必要がある.if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log(' ', registration.scope);
}).catch(function(err) {
console.log(err);
});
}
ここで、Service Worker
ファイルのパスに注意しなければならない.私の例では、現在のドメインルートディレクトリの下にある.これは、JavaScript
とウェブサイトが同じソースであることを意味し、現在のウェブサイトのすべての要求のためにプロキシをすることができ、Service Worker
に登録されたら、プロキシsw.js
の下のネットワーク要求しかできない.Service Worker
コンソールを使用して、現在のページのService Worker
状況を確認できます.インストールが完了したら、
/imaging/sw.js
は次のライフサイクルを経験します./imaging
)Chrome
)Service Worker
)Service Worker
が制御するウェブサイトまたはページにアクセスすると、download
はすぐにダウンロードされる.その後少なくともinstall
時間ごとにダウンロードされます.もっと頻繁にダウンロードされるかもしれませんが、activate
時間ごとに必ず一回ダウンロードされます.Service Worker
のインストールを開始します.インストール段階では、通常、私たちがあらかじめ宣言している静的リソースをキャッシュする必要があります.Service Worker
スクリプトファイルをダウンロードしようとします.ダウンロードが成功すると、前回キャッシュされた24
スクリプトファイルと比較します.前回の24
スクリプトファイルと違って、Service Worker
が新たになったと証明され、urlsToCache
イベントをトリガします.アクティブ化が完了しましたService Worker
のおおよそのライフサイクルである.Service Worker
インストールが完了したら、いくつかの静的リソースをキャッシュしようとします.self.addEventListener('install', function(event) {
self.skipWaiting();
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
return cache.addAll(urlsToCache);
})
);
});
まず、Service Worker
は、待ち時間をブラウザに直接飛ばしてくださいと通知し、Service Worker
の期限切れのactivate
スクリプトを淘汰して、新しいService Worker
の起動を直接試みる.install
を使用してself.skipWaiting()
を開き、sw.js
を介して予め宣言した静的ファイルのキャッシュを試みる.Service Worker
を傍受し、代理ネットワーク要求ページのすべてのネットワーク要求は、
Service Worker
のcaches.open
イベントを通じてトリガされ、Cache
はcache.addAll
を介して、fetch
からキャッシュを検索しようと試み、キャッシュが命中したら、直接キャッシュ中のService Worker
に戻り、そうでなければ、リアルなネットワーク要求を作成する.self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
要求中に新たなキャッシュをfetch
に追加する必要がある場合、Service Worker
方法によって追加することができ、以下の例を参照してください.self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
//
if (response) {
return response;
}
// , clone
// response Stream, response
// response, , 。
// , , clone
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
// , , , ,
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// ,
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
);
})
);
});
プロジェクトの中で、必ずキャッシュを制御することに注意して、インターフェースの要求は普通はキャッシュを推薦しないのです.ですから、自分のプロジェクトの中では、ここでダイナミックなキャッシュプランを作っていません.caches.match
Cache
は常に更新が必要な日があります.バージョンの反復に伴い、ある日、私たちは新しいバージョンの機能をオンラインにリリースする必要があります.この時は古いキャッシュを淘汰する必要があります.古いresponse
とCache Storage
はどうやって淘汰しますか?self.addEventListener('activate', function(event) {
var cacheWhitelist = ['counterxing'];
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
cache.put
は淘汰されません.activate
を通じて、すべてのService Worker
を取得し、ホワイトリストにないService Worker
を淘汰します.Cache Storage
メソッドを使用します.これは、Cache
をパラメータとして受信し、caches.keys()
のすべてのキャッシュを削除する.sw-precache-webpack-pluginは
Cache Storage
であり、Cache
をパッケージ化する際に、私たちが欲しいcaches.delete()
のcacheName
のシナリオを構成することによって生成することができる.一番簡単な構成は以下の通りです.
var path = require('path');
var SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
const PUBLIC_PATH = 'https://www.my-project-name.com/'; // webpack needs the trailing slash for output.publicPath
module.exports = {
entry: {
main: path.resolve(__dirname, 'src/index'),
},
output: {
path: path.resolve(__dirname, 'src/bundles/'),
filename: '[name]-[hash].js',
publicPath: PUBLIC_PATH,
},
plugins: [
new SWPrecacheWebpackPlugin(
{
cacheId: 'my-project-name',
dontCacheBustUrlsMatching: /\.\w{8}\./,
filename: 'service-worker.js',
minify: true,
navigateFallback: PUBLIC_PATH + 'index.html',
staticFileGlobsIgnorePatterns: [/\.map$/, /asset-manifest\.json$/],
}
),
],
}
cacheName
パッキングを実行すると、バッファwebpack plugin
がパッキングした後の静的ファイルという名前のファイルが生成される.一番簡単な例です.
webpack
VS sw.js
Service Worker
バッファに比べて、webpack
はservice-worker.js
に協力しても自分の強みがあります.webpack
を介してキャッシュを使ってすぐに戻すことができますが、同時に要求を開始して、新しいバージョンの更新があるかどうか確認してもいいです.Service Worker Cache
値は本当にみっともないです.Http Cache
はキャッシュが流されやすく、期限が切れやすいです.Http Header
は流されにくいです.有効期限が過ぎたという話もありません.Service Worker
を介してオフラインアクセスアプリケーションを実現することができます.Cache Storage
はService Worker
、hash
、Http
、Cache Storage
などに依存しているため、互換性があまり良くないという欠点がある.後の話
本明細書では、
Service Worker
の基本的な使用とクライアントキャッシュとしてのService Worker
の使用を簡単にまとめただけの簡単な方法であるが、fetch API
の役割は、例えば、Promise
を介してオフラインアプリケーションを行い、ネットワークアプリケーションのプッシュ(push−notificationsを参照することができる)などにとどまらない.Cache Storage
を借りて、インタフェースをキャッシュしてもいいです.私のプロジェクトの中では、そんなに複雑なことはしません.しかし、インターフェースキャッシュをするメリットはオフラインアクセスをサポートし、オフライン状態でも正常にアクセスできるService Worker
アプリケーションです.Service Worker
とService Worker
はいつも切り離せません.Service Worker
の最適な使い方は、実はService Worker
に協力してオフラインキャッシュをすることである.Web
により、ネットワーク要求に対する制御が容易に実現され、異なるネットワーク要求に対して異なるポリシーが実行される.例えば、Cache Storage
のポリシーについても、様々な場合がある.例えば、ネットワーク要求を優先的に利用しても良いし、ネットワーク要求が失敗した時にキャッシュを再利用しても良いし、キャッシュとネットワーク要求を同時に利用しても良いし、一方ではチェック要求があり、一方ではキャッシュをチェックして、二人のどちらが速いかを見て、誰を使用しても良い.