1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PWA: Workbox Routing 和訳 (その2)

Posted at

Workbox Routing

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

Navigation Routeの書き方

あなたのサイトがSPA(シングルページアプリケーション)なら、navigation requestsに対するすべてのレスポンスにはNavigationRouteが使えます。

補足: navigation requestsの詳しい説明はこちら。ざっくり言うと「ナビゲーションリクエストとは、『document』を宛先とするリクエストである」とのことです。

workbox.routing.registerNavigationRoute(
  // 事前に'/single-page-app.html'がプリキャッシュされているとします
  // 一致するキャッシューキーを取得します
  workbox.precaching.getCacheKeyForURL('single-page-app.html')
)

*参考: getCacheKeyForURLはurlを引数にとりキャッシュキー(string型)を返します。もしurlが/index.htmlの様にバージョニングされていなければ、キャッシュキーは(searchパラメータ付きの)url自身になります。

ユーザーがブラウザからあなたのサイトにアクセスするたび、ページへのリクエストはnavigation request扱いになり、キャッシュされた/single-page-app.htmlがレスポンスとしてサーブされます。(注: workbox-cachingもしくはご自身のインストールステップ経由でページを事前にキャッシュしている場合)

デフォルトではすべてのnavigation requestsに適用されます。もしURLのサブセットのみに適用を制限知る場合は、whitelistblacklistでルーティングとマッチしたページをターゲットとすることが可能です。

workbox.routing.registerNavigationRoute(
  // 事前に'/single-pafe-app.html'がプリキャッシュされているとします
  // 一致するキャッシューキーを取得します
  workbox.precaching.getCacheKeyForURL('single-page-app.html', {
  whitelist: [
    new RegExp('/blog/')
  ],
  blacklist: [
    new RegExp('/blog/restricted/'),
  ]
  })
)

whitelistblacklistに同じURLが指定されている場合はblacklistの指定が生かされます。

Default Handlerの設定

ルートとマッチしていないリクエストに対して「ハンドラー」を設定したい場合、default handlerを使うことができます。

workbox.routing.setDefaultHandler(({url, event, params}) => {
  ...
});

Catch Handlerの設定

リクエストを捌いている時、ルートの設定がエラーとなってしまう場合は、catch handlerでレスポンスを設定
できます。

workbox.routing.setCatchHandler(({event}) => {
  if (event.request.mode === 'navigate') {
    return caches.match('/error-page.html');
  }
  return Response.error();
})

GET以外のリクエストへのルートの設定

デフォルトでは全てのルートはGETリクエストを想定しています。

POSTなど他のリクエストのルートを設定したい場合、リクエストを登録する際にメソッドを定義する必要があります。

workbox.routing.registerRoute(
  matchCb,
  handlerCb,
  'POST'
)

workbox.routing.regiterRoute(
  new RegExp('/api/.*\.json'),
  handlerCb,
  'POST'
)

ルーターのログ

workbox-routingはWorkboxで処理されるURLをハイライト表示してログを返してくれます。

ログを詳細に表示させるにはログレベルをdebugに設定します。詳細はこちら

補足:

workbox.core.setLogLevel(workbox.core.LOG_LEVELS.debug);

 応用編

handleRequest()メソッドを使用すればルーティングの細かな設定が可能です。

const router = new DefaultRouter();
self.addEventListener('fetch', (evebt => {}
  const responsePromise = router.handleRequest(event);
  if (responsePromise) {
  // 指定したリクエストを捌くルートが見つかったとき
   event.respondWith(responsePromise)
  } else {
    リクエストを捌くルートが見つからないとき
  }
))

Routerを直接使ってルートを設定する場合、Routeクラスもしくはextendされたクラスを使う必要があります。

const router = new DefaultRouter();
router.registerRoute(new Route(matchCb, handlerCb));
router.registerRoute(new RegExpRoute(new RegExp(...), handlerCb));
router.registerRoute(new NavigationRoute(handlerCb));
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?