2017-01-06 11 views
1

プログレッシブウェブアプリケーションを試してみましたが、オフラインキャッシュについては誤解しています。プログレッシブウェブアプリケーション - オフライン時に複数のキャッシュされたページ間を移動する

私は、同一の2 HTMLページ(index.htmlindex2.html)を持っている以下のコード:私から、

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test PWA</title> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width,initial-scale=1.0" /> 
    <link rel="stylesheet" type="text/css" href="/assets/app_styles.css" /> 
    <link rel="manifest" href="/manifest.json" /> 
    <link rel="shortcut icon" href="/assets/icon1.png" /> 
</head> 
<body> 
    <header class="header"> 
     <h1>Test web app</h1> 
    </header> 
    <nav> 
     <a href="/index.html">Page 1</a> 
     <a href="/index2.html">Page 2</a> 
    </nav> 
    <script type="text/javascript" src="/assets/app_scripts.js"></script> 
</body> 
</html> 

そして以下フェッチしてインストールイベントメソッドだけでなく、キャッシュの内容で、ネットワークがない場合にはキャッシュされた内容を返すべきです。

var CacheName = 'TestPWA_Cache'; 
var CacheContents = [ 
    '/', 
    '/index.html', 
    '/index2.html', 
    '/assets/app_scripts.js', 
    '/assets/app_styles.css', 
    '/assets/icon1.png', 
    '/assets/icon2.png', 
    '/assets/icon3.png' 
]; 

self.addEventListener('install', function (event) { 
    event.waitUntil(caches.open(CacheName).then(function (cache) { 
     console.log("Service worker install sucess."); 
     return cache.addAll(CacheContents).then(function() {self.skipWaiting(); }); 
    }).catch(function (err) { 
     console.log("Service worker install failed! "+err); 
    })); 
}); 

self.addEventListener('fetch', function (event) { 
    event.respondWith(caches.match(event.request).then(function (response) { 
     if (response) return response; 
     return fetch(event.request); 
    })); 
}); 

、私の問題は、私がオフラインに行くとき、それはindex.htmlページを開くだろう、ですが、私は2つのページ間を移動しようとすると、それが自然に真である、私はオフラインだと言って私にエラーを与えます私がオフラインになっている間に複数のキャッシュされたページ間を移動できるような方法でファイルをキャッシュするはずのオフラインキャッシュの背後にあるアイデアですか?

もしそうなら、どこが間違っていますか?

もしそうでなければ、オフラインでキャッシュされたページを切り替える方法が提供されるまで、いつでもすぐにネイティブアプリケーションを置き換える方法はわかりません。

PS。 WindowsとAndroidでGoogle Chromeを使用しています。

+0

self.clients.claim()の使用に関する詳細情報があります。実際にキャッシュにデータを挿入するコードを表示できますか? – Claies

+0

@Claiesインストールイベントを含むように編集しました。 – Anomaly

+0

[サービスワーカー](https://developers.google.com/web/fundamentals/getting-started/primers/service-workers)を参照してください。彼らはオフラインのもののためにすばらしい仕事をします。 –

答えて

1

サービスワーカーのfetchイベントハンドラが、制御するクライアントからのナビゲーション要求に対してトリガされます。それは間違いなく、サービスワーカーにとっての意図されたユースケースの1つです。

サービスワーカーのactivateイベントでself.clients.claim()に電話していないことがわかりました。これは問題ではありませんが、新しくインストールされたサービスワーカーが現在のクライアントタブ/ウィンドウを制御しないことを意味します。 次はになり、サービスワーカーがページを制御し、fetchイベントハンドラをトリガーするWebアプリケーションにアクセスするまではありません。したがって、新しいサービスワーカーをインストールした直後にオフラインナビゲーションをテストしている場合は、サイトを閉じてから再訪する前に、あなたが見ていることが説明されます。

あなたはまだあなたがまだオンラインである一方で、各ページの内容を取得する必要がhttps://developers.google.com/web/fundamentals/instant-and-offline/service-worker/lifecycle#clientsclaim

+0

'clients.claim()'を実装すると感謝しました。私は、キャッシュがすぐに利用できるようになったので、私が望んだとおりに動作することに気付きました。 – Anomaly

関連する問題