ワークボックス ルーティング

Service Worker はページのネットワーク リクエストをインターセプトできます。次のような音声に反応することがあります。 キャッシュされたコンテンツ、ネットワークのコンテンツ、または生成されたコンテンツがあるブラウザ 必要があります。

workbox-routing は、簡単に「ルーティング」できるようにするモジュールです。これらのリクエストを さまざまな関数が用意されています。

ルーティングの実行方法

ネットワーク リクエストが原因で Service Worker のフェッチ イベントが発生すると、workbox-routing 指定されたルートとハンドラを使用してリクエストへの応答を試みます。

ワークボックスの配線図

上記からの主な注目点は次のとおりです。

  • リクエストのメソッドが重要です。デフォルトでは、Routes は GET リクエスト。他のタイプのリクエストをインターセプトする場合は、 メソッドを指定します。

  • ルート登録の順序は重要です。複数のルートが に登録済みのルート(最初に登録されたルートが を使用してリクエストに応答します。

経路を登録する方法はいくつかあります。コールバック、通常の Route インスタンスのみが含まれています。

ルートでの照合と処理

「ルート」「照合」という 2 つの関数に過ぎません。関数 ルートがリクエストと「処理」に一致するかどうかを判断します。関数 リクエストが処理され、レスポンスが返されます。

Workbox には、いくつかのヘルパーが用意されており、 ただし、別の動作が必要になった場合は、 カスタムマッチとハンドラ関数が最適です

match コールバック関数 渡される ExtendableEventRequest、 実行できる URL オブジェクト 真の値を返します。簡単な例として、2 つの単語を 次のような特定の URL を指定します。

const matchCb = ({url, request, event}) => {
  return url.pathname === '/special/url';
};

ほとんどのユースケースは、url または request

ハンドラ コールバック関数 同じ Pod が ExtendableEventRequestURL オブジェクトparams 値。これは「match」使用します。

const handlerCb = async ({url, request, event, params}) => {
  const response = await fetch(request);
  const responseBody = await response.text();
  return new Response(`${responseBody} <!-- Look Ma. Added Content. -->`, {
    headers: response.headers,
  });
};

ハンドラは、Response に解決される Promise を返す必要があります。この この例では asyncawait。 内部で、戻り値 Response は Promise にラップされます。

これらのコールバックは次のように登録できます。

import {registerRoute} from 'workbox-routing';

registerRoute(matchCb, handlerCb);

唯一の制限は、「一致」フィールドがコールバックは同期的に truthy を返す必要があります。 非同期処理を実行することはできませんその理由は、 Router がフェッチ イベントに同期的に応答するか、 他の取得イベントに渡します

通常、「handler」はコールバックは、指定されたいずれかの方法で workbox-strategies で確認できます。

import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';

registerRoute(matchCb, new StaleWhileRevalidate());

このページでは workbox-routing を中心に説明しますが、 ワークボックス戦略に関するこれらの戦略の詳細

正規表現ルートを登録する方法

一般的には、「match」ではなく正規表現を呼び出すことができます。 Workbox では次のように簡単に実装できます。

import {registerRoute} from 'workbox-routing';

registerRoute(new RegExp('/styles/.*\\.css'), handlerCb);

リクエストの送信元が 同じオリジン、 この正規表現は、リクエストの URL が 使用します。

  • https://example.com/styles/main.css
  • https://example.com/styles/nested/file.css
  • https://example.com/nested/styles/directory.css

ただし、クロスオリジン リクエストの場合、 URL の先頭と一致する必要があります。その理由は、 正規表現 new RegExp('/styles/.*\\.css') に該当する可能性は低い 第三者 CSS ファイルと一致するように意図されたコード。

  • https://cdn.third-party-site.com/styles/main.css
  • https://cdn.third-party-site.com/styles/nested/file.css
  • https://cdn.third-party-site.com/nested/styles/directory.css

この動作が望ましい場合は、通常の動作を URL の先頭を照合します。一致させたい場合、 https://cdn.third-party-site.com のリクエストの場合、通常の 式 new RegExp('https://cdn\\.third-party-site\\.com.*/styles/.*\\.css')

  • https://cdn.third-party-site.com/styles/main.css
  • https://cdn.third-party-site.com/styles/nested/file.css
  • https://cdn.third-party-site.com/nested/styles/directory.css

ローカルとサードパーティの両方を照合する場合は、ワイルドカード 最初の名前になりますが、これは慎重に行う必要があります ウェブアプリで予期しない動作が発生しないようにしてください。

ナビゲーション ルートの登録方法

サイトがシングルページ アプリの場合、 NavigationRoute~ すべてのユーザーに対して特定のレスポンスを返す ナビゲーション リクエスト

import {createHandlerBoundToURL} from 'workbox-precaching';
import {NavigationRoute, registerRoute} from 'workbox-routing';

// This assumes /app-shell.html has been precached.
const handler = createHandlerBoundToURL('/app-shell.html');
const navigationRoute = new NavigationRoute(handler);
registerRoute(navigationRoute);

ユーザーがブラウザでサイトにアクセスするたびに、ページのリクエストが ナビゲーション リクエストであり、キャッシュされたページ /app-shell.html が配信されます。 (注: ページは workbox-precaching または 独自のインストール手順を使用します)。

デフォルトでは、これはすべてのナビゲーション リクエストに応答します。目標 応答を一部の URL のみに制限する場合は、allowlist denylist オプションを使用すると、このルートと一致するページを制限できます。

import {createHandlerBoundToURL} from 'workbox-precaching';
import {NavigationRoute, registerRoute} from 'workbox-routing';

// This assumes /app-shell.html has been precached.
const handler = createHandlerBoundToURL('/app-shell.html');
const navigationRoute = new NavigationRoute(handler, {
  allowlist: [new RegExp('/blog/')],
  denylist: [new RegExp('/blog/restricted/')],
});
registerRoute(navigationRoute);

注意すべき点は、URL が両方に含まれる場合、denylist が優先されることです。 allowlistdenylist

デフォルト ハンドラの設定

「handler」を一致するルートがない場合、 デフォルト ハンドラを設定できます。

import {setDefaultHandler} from 'workbox-routing';

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

Catch ハンドラを設定する

いずれかのルートでエラーがスローされた場合は、 catch ハンドラを設定してグレースフル デグラデーションを行います。

import {setCatchHandler} from 'workbox-routing';

setCatchHandler(({url, event, params}) => {
  ...
});

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

デフォルトでは、すべてのルートが GET リクエスト用とみなされます。

POST リクエストなど、他のリクエストをルーティングする場合は、以下が必要です。 次のようにして、ルートの登録時にメソッドを定義します。

import {registerRoute} from 'workbox-routing';

registerRoute(matchCb, handlerCb, 'POST');
registerRoute(new RegExp('/api/.*\\.json'), handlerCb, 'POST');

ルーターのロギング

リクエストのフローは、 workbox-routing: 処理中の URL がハイライト表示されます ワークボックスから作成できます。

ルーティング ログ

さらに詳細な情報が必要な場合は、ログレベルを debug に設定して、 Router で処理されないリクエストのログを表示する詳しくは、 デバッグガイド ログレベルの設定です。

デバッグとログ ルーティング メッセージ

高度な使用方法

ワークボックス ルーターを付与するタイミングをより細かく制御したい場合 作成することもでき、 Router インスタンスと呼び出し handleRequest() です メソッドを使用する必要があります。

import {Router} from 'workbox-routing';

const router = new Router();

self.addEventListener('fetch', event => {
  const {request} = event;
  const responsePromise = router.handleRequest({
    event,
    request,
  });
  if (responsePromise) {
    // Router found a route to handle the request.
    event.respondWith(responsePromise);
  } else {
    // No route was found to handle the request.
  }
});

Router を直接使用する場合は、Route クラスも使用する必要があります。 または拡張クラスを使用してルートを登録します。

import {Route, RegExpRoute, NavigationRoute, Router} from 'workbox-routing';

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

NavigationRoute

NavigationRoute を使用すると、Terraform から ブラウザに一致する workbox-routing.Route [経路案内のリクエスト]https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests

次の条件を満たす受信リクエストのみが https://fetch.spec.whatwg.org/#concept-request-mode|mode navigate に設定されている。

このルートは、ナビゲーション リクエストのサブセットにのみ適用することもできます denylist パラメータと allowlist パラメータのいずれかまたは両方を使用します。

プロパティ

  • コンストラクタ

    void

    denylistallowlist の両方を指定すると、denylist は次のようになります。 リクエストはこのルートに一致しません。

    allowlistdenylist の正規表現 結合されたベクトルと [pathname]https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname および [search]https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search 部分に追加されます。

    : これらの正規表現は、評価期間中にすべてのリンク先 URL に対して評価されることがあります。 ナビゲーションです。使用を避けるべき表現: 複雑な正規表現 そうしないと、ユーザーがサイトを操作するときに遅延が発生することがあります。

    constructor 関数は次のようになります。

    (handler: RouteHandler, options?: NavigationRouteMatchOptions) => {...}

  • catchHandler
  • method

    HTTPMethod

  • setCatchHandler

    void

    setCatchHandler 関数は次のようになります。

    (handler: RouteHandler) => {...}

    • handler

      コールバック Response に解決する Promise を返す関数

NavigationRouteMatchOptions

プロパティ

  • 許可リストに掲載する

    RegExp[] 省略可

  • 拒否リスト

    RegExp[] 省略可

RegExpRoute

RegExpRoute を使用すると、正規表現ベースの workbox-routing.Route

同一オリジンのリクエストでは、RegExp は URL の一部とのみ一致すればよい。対象 指定する場合は、次に一致する RegExp を定義する必要があります。 付け足せます。

プロパティ

  • コンストラクタ

    void

    正規表現に [キャプチャ グループ]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references、 取得された値が workbox-routing~handlerCallback params 渡します。

    constructor 関数は次のようになります。

    (regExp: RegExp, handler: RouteHandler, method?: HTTPMethod) => {...}

    • regExp

      RegExp

      URL に対して照合する正規表現。

    • handler

      コールバック Response の結果を返す Promise を返します。

    • method

      HTTPMethod(省略可)

  • catchHandler
  • method

    HTTPMethod

  • setCatchHandler

    void

    setCatchHandler 関数は次のようになります。

    (handler: RouteHandler) => {...}

    • handler

      コールバック Response に解決する Promise を返す関数

Route

Route は、コールバック関数のペア「match」と、"handler" として指定します。 「一致」ルートを「処理」に使用するかどうかが 可能であれば、偽の値でない値を返すようにします。「handler」コールバック 一致した場合に呼び出され、解決する Promise を返します。 Response にマッピング。

プロパティ

  • コンストラクタ

    void

    Route クラスのコンストラクタ。

    constructor 関数は次のようになります。

    (match: RouteMatchCallback, handler: RouteHandler, method?: HTTPMethod) => {...}

    • ルートが特定のルールに一致するかどうかを判定するコールバック関数 fetch イベントを返します。

    • handler

      コールバック Response に解決する Promise を返す関数です。

    • method

      HTTPMethod(省略可)

  • catchHandler
  • method

    HTTPMethod

  • setCatchHandler

    void

    setCatchHandler 関数は次のようになります。

    (handler: RouteHandler) => {...}

    • handler

      コールバック Response に解決する Promise を返す関数

Router

Router を使用すると、1 つ以上のリソースを使用して FetchEvent を処理できます。 workbox-routing.Route。次の場合に Response を返します。 存在する必要があります。

指定されたリクエストに一致するルートがない場合、Router は「default」 ハンドラを定義します。

一致する Route がエラーをスローした場合、Router は「catch」を使用して 問題に適切に対処し、エラー メッセージで応答するように定義されている場合、 リクエスト。

リクエストが複数のルートと一致する場合、登録された最も古いルートが リクエストへの応答に使用できます。

プロパティ

  • コンストラクタ

    void

    新しい Router を初期化します。

    constructor 関数は次のようになります。

    () => {...}

  • ルート

    Map&lt;HTTPMethodRoute[]&gt;

  • addCacheListener

    void

    ウィンドウからキャッシュに保存する URL のメッセージ イベント リスナーを追加します。 これは、ページが読み込まれる前にページに読み込まれたリソースをキャッシュに保存する場合に便利です。 Service Worker で制御が開始されました。

    ウィンドウから送信されるメッセージ データの形式は、次のようになります。 ここで、urlsToCache 配列は URL 文字列または URL 文字列 + requestInit オブジェクト(fetch() に渡すのと同じ)

    {
      type: 'CACHE_URLS',
      payload: {
        urlsToCache: [
          './script1.js',
          './script2.js',
          ['./script3.js', {mode: 'no-cors'}],
        ],
      },
    }
    

    addCacheListener 関数は次のようになります。

    () => {...}

  • addFetchListener

    void

    ルートが一致したときにイベントに応答する fetch イベント リスナーを追加します。 返されます。

    addFetchListener 関数は次のようになります。

    () => {...}

  • findMatchingRoute

    void

    リクエストと URL(およびオプションでイベント)を、 一致するものがあれば、対応する (一致によって生成されたすべてのパラメータを含む)

    findMatchingRoute 関数は次のようになります。

    (options: RouteMatchCallbackOptions) => {...}

    • 戻り値

      オブジェクト

      route プロパティと params プロパティを持つオブジェクト。 一致するルートが見つかったか、undefined した場合に入力されます。 できません。

  • handleRequest

    void

    FetchEvent オブジェクトにルーティング ルールを適用して、 作成する必要があります。

    handleRequest 関数は次のようになります。

    (options: object) => {...}

    • オプション

      オブジェクト

      • イベント

        ExtendableEvent

        イベントをトリガーしたイベント リクエストできます。

      • request

        リクエスト

        処理するリクエスト。

    • 戻り値

      Promise&lt;Response&gt;

      Promise が返された時点で、 登録されたルートでリクエストを処理できます。一致するものがない場合 defaultHandler がない場合、undefined が返されます。

  • registerRoute

    void

    ルーターにルートを登録します。

    registerRoute 関数は次のようになります。

    (route: Route) => {...}

  • setCatchHandler

    void

    リクエストの処理中に Route がエラーをスローした場合、この handler が呼び出され、レスポンスを返す機会が与えられます。

    setCatchHandler 関数は次のようになります。

    (handler: RouteHandler) => {...}

    • handler

      コールバック Response の結果を返す Promise を返します。

  • setDefaultHandler

    void

    ルートが明示的に指定されていない場合に呼び出されるデフォルトの handler を定義する 照合します。

    各 HTTP メソッド(「GET」、「POST」など)は、それぞれ独自のデフォルト ハンドラを取得します。

    デフォルト ハンドラがない場合、一致しないリクエストは Service Worker が存在しないものとみなします。

    setDefaultHandler 関数は次のようになります。

    (handler: RouteHandler, method?: HTTPMethod) => {...}

    • handler

      コールバック Response の結果を返す Promise を返します。

    • method

      HTTPMethod(省略可)

  • unregisterRoute

    void

    ルーターからルートの登録を解除します。

    unregisterRoute 関数は次のようになります。

    (route: Route) => {...}

    • 経路

      登録を解除するルート。

メソッド

registerRoute()

workbox-routing.registerRoute(
  capture: string | RegExp | RouteMatchCallback | Route,
  handler?: RouteHandler,
  method?: HTTPMethod,
)

キャッシュ機能を使用して RegExp、文字列、関数を簡単に登録 シングルトン Router インスタンスにデプロイします。

この方法では、必要に応じてルートが自動的に生成され、 workbox-routing.Router#registerRoute を呼び出します。

パラメータ

  • キャプチャ

    string |正規表現 |RouteMatchCallback |ルート

    キャプチャ パラメータが Route の場合、他の引数はすべて無視されます。

  • handler

    RouteHandler オプション

  • method

    HTTPMethod(省略可)

戻り値

setCatchHandler()

workbox-routing.setCatchHandler(
  handler: RouteHandler,
)

リクエストの処理中に Route がエラーをスローした場合、この handler が呼び出され、レスポンスを返す機会が与えられます。

パラメータ

  • handler

    コールバック Response の結果を返す Promise を返します。

setDefaultHandler()

workbox-routing.setDefaultHandler(
  handler: RouteHandler,
)

ルートが明示的に指定されていない場合に呼び出されるデフォルトの handler を定義する 照合します。

デフォルト ハンドラがない場合、一致しないリクエストは Service Worker が存在しないものとみなします。

パラメータ

  • handler

    コールバック Response の結果を返す Promise を返します。