PWA: Workbox Strategies 和訳

# Workbox Strategies

参照元ページ: https://developers.google.com/web/tools/workbox/modules/workbox-strategies

## Workbox Strategiesとは？

サービスワーカーが導入されて初めて、キャッシングストラテジーが登場しました。キャッシングストラテジーとは、`fetch`イベント後にサービスワーカーが作り出すレスポンスの返し方の様式のことです。

`workbox-strategies`を使えば、よく使われるキャッシングストラテジーをサービスワーカーで使用できます。

ここではWorkboxでサポートされているストラテジーに絞って説明しますが、さらに学びたいのであれば[こちら](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/)を参照してください。

## ストラテジーを使う

以下の例では、`workbox-routing`を利用したWorkbox cachingの使い方をお見せします。各ストラテジーのオプションの設定方法は[こちら](https://developers.google.com/web/tools/workbox/modules/workbox-strategies#configuring_strategies)を参考にしてください。

[上級者セクション](https://developers.google.com/web/tools/workbox/modules/workbox-strategies#advanced_usage)では`workbox-routing`を使わないキャッシングストラテジーの使い方をカバーしています。

### Stale-While-Revalidate

補足: staleの意味は「古い」ので、直訳すると「(キャッシュ更新)有効中は古い」となります。

![](https://developers.google.com/web/tools/workbox/images/modules/workbox-strategies/stale-while-revalidate.png)

[stale-while-revalidate](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate)パターンでは

1. キャッシュが利用可能であれば即座にキャッシュしたコンテンツ

2. キャッシュがない場合はネットワークからのコンテンツ

を返します。さらにネットワークへリクエストを飛ばし、キャッシュを更新します。

アプリケーションで常に最新版のリソースを出さなくても良い場合、Stale-While-Revalidateはよく採用されます。

### Cache First (Cache Falling Back to Network)

![](https://developers.google.com/web/tools/workbox/images/modules/workbox-strategies/cache-first.png)

オフラインのアプリケーションはキャッシュへ大きく依存しますが、クリティカルでなく（古い）キャッシュをアセットとして使えるケースでは[cache-first](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network)が最良の選択肢です。

もしすべてのリクエストにキャッシュされたコンテンツで返すことができればネットワークへのリクエストは発生しません。もしキャッシュされたコンテンツがない場合、ネットワークへリクエストが飛び、レスポンスはキャッシュされます。次のリクエストがキャッシュで返されるように。

## Network First (Network Falling Back to Cache)

![](https://developers.google.com/web/tools/workbox/images/modules/workbox-strategies/network-first.png)
 リクエストの内容が頻繁に更新される場合、[network first](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache)ストラテジーは最良の選択肢です。デフォルトでは、ネットワークから最新のリクエストをフェッチします。もしリクエストが成功すれば、レスポンスをキャッシュします。もしネットワークリクエストが失敗した場合、キャッシュされたコンテンツが使用されます。

```js
workbox.routing.registerRoute(
  new RegExp('/social-timeline/'),
  new workbox.strategies.NetworkFirst()
);
```

### Network Only

![](https://developers.google.com/web/tools/workbox/images/modules/workbox-strategies/network-only.png)

もしネットワークからのレスポンスのみを使いたい場合は[network only](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only)が使うべきストラテジーです。

```js

workbox.routing.registerRoute(
  new RegExp('/admin/'),
  new workbox.strategies.NetworkOnly()
);
```

### Cache Only

![](https://developers.google.com/web/tools/workbox/images/modules/workbox-strategies/cache-only.png)

[cache only](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only)ストラテジーはキャッシュだけにリクエストを投げます。Workboxではこの使用ケースは稀ですが、プリキャッシングの仕方によっては役に立つでしょう。

```js

workbox.routing.registerRoute(
  new RegExp('/app/v2/'),
  new workbox.strategies.CacheOnly()
);
```

## ストラテジーの設定

すべてのストラテジーでは次の項目が自由に設定できます。

- キャッシュの名前
- キャッシュの有効期限
- ライフサイクルメソッドが呼ばれる時に使いたいプラグインの配列

### ストラテジーで使用されるキャッシュの変更

キャッシュの名前を変更することでキャッシュを更新することができます。これによりデバッグ時のアセットファイルを分離することができます。

### プラグインを使う
Workboxはこれらのストラテジーで使えるプラグインを用意しています。

- workbox.expiration.Plugin
- workbox.cacheableResponse.Plugin
- workbox.broascastUpdate.Plugin
- workbox.backgroundSync.Plugin

上記のプラグイン（もしくはカスタムプラグイン）を使うには、`plugin`オプションで指定します。

```js

workbox.routing.registerRoute(
  new RexExp('/images/'),
  new workbox.strategies.CacheFirst({
    cacheName: 'image-cache',
    plugins: [
      new workbox.expiration.Plugin({
        // リクエストのキャッシュ期間は１週間
        maxAgeSeconds: 7 * 24 * 60 * 60,
        // 10リクエストのみキャッシュする
        maxEntries: 10.
      })
    ]
  })
)
```

## 応用編
自分で書いたフェッチイベントのロジック内でストラテジーを使いたい場合、イベント内でストラテジーのクラスを記述します。

例えば、`stale-while-revalidate`を使いたい場合、次のように記述できます。

```js

self.addEventListener('fetch', (event) => {
  if (event.request.url === '/') {
    const staleWhileRevalidate = new workbox.strategies.StaleWhileRevalidate();
    event.respondWith(staleWhileRevalidate.handle({event}));
  }
})
```

[こちら](https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies)で利用可能なクラス一覧を見つけられます。