過去に
当ブログは、
試しに
作成に
作成に 至る 経緯
作るに
個人的に 良い ライブラリだと 思った
Google大変動
の
導入後に
Pageviewが 増加した。
導入後の1週間で 5%-10%
程度かと思いますが、 Pageviewが 増加しました。
ただこれはブラウザの prefetch 動作に 依存するので、 先読み ページの Google Analytics タグ が 起動している ケースも あるかもしれません。 導入が
簡単
Turbolinks との併用でしたが、 特に 競合する こともなく、 guess()
function との組み合わせで 先読みが 実装できました。
Webアーキテクチャに 左右されず、 様々な サイトで 使用できる
build は
フロントエンドの
サイトの
そもそも Guess-js とは 何か?
gatsby-plugin-guess-js を
初期読み 込み速度と、 次ページの 読み込み 速度
PageSpeed Insights は
初期読み
- HTML、
JS、 CSS 等の リソース縮小 - HTML、
JS、 CSS 等の リソース圧縮 - JS、
CSS 等の リソース結合 (HTTP接続本数を 減らす) - サーバーサイドレスポンス速度改善
- JS、
CSS 等の リソース非同期読み 込み - クリティカルCSS の
抽出 - Resource Hint API
次ページのJS、<wbr>CSS等の<wbr>リソースが<wbr>Cacheされている<wbr>
と
次ページの
- Pjax ライブラリを
使う。 - サイトを
SPAに する。 - PWA の
cache で 次ページの 表示時に 必要な リソースを 読み 込んで おく。 - Guess-js を
使う。
Guess-js は
Guess-js が 行っている 処理
Webpack での
geuss-webpack で
行う 処理 - Google Analytics の
アクセスデータから、 単純確率行列 (マルコフ連鎖) を 作成する。 - 作成した
行列を JSON化して、 エントリーポイントとなる JavaScript に 追加する。
- Google Analytics の
クライアント側で
guess()
function が行う 処理 - 引数が
指定されていなければ、 現在の ページの 次の ページを 単純確率行列から 取得する。 - Network Information API を
使い、 ブラウザの 回線を 特定する。 APIが 使用できない ブラウザは 3g
扱いにする。 - 各回線ごとの
閾値を 取得、 閾値以上の 確率を 持つ ページを 取得する。
- 引数が
各回線ごとの
閾値
デフォルトの閾値は 以下の 通りです。
4g
であれば15% 以上の 確率で 遷移する ページを 取得します。 閾値は、export const defaultPrefetchConfig: PrefetchConfig = { '4g': 0.15, '3g': 0.3, '2g': 0.45, 'slow-2g': 0.6 };
Webpack.config.js に 指定する こともでき、 指定する 場合は 以下のように 記載します。 new GuessPlugin( { GA: 'xxxxxxxxxx', debug: true, runtime: { basePath: '', // true > PrefetchPlugin 、false > PrefetchAotPlugin の切替を行う delegate: true, // 回線ごとの閾値の指定 prefetchConfig: { '4g': 0.15, '3g': 0.25, '2g': 0.45, 'slow-2g': 0.6 } } })
guess-js を 使う際の 考慮する 点
以下、
先読みしない
ブラックリストページの 制御が 必要
ページ表示時にデータ更新が 発生する ページは、 ユーザーの 意図しない 挙動に なる 可能性が あります。
ログアウトページや、ログイン処理、 入力フォームからの 遷移先なども 状態変化が 何かしら 起こる ため 先読みに 適さないかと 思います。
現状、guess-js には ブラックリストを 除外する 機能が ないため、 Google Analytics で 除外対象ページを 絞り 込んだ VIEW を 作成するか、 prefetch の 直前で ブラックリストページを 除外するのが 良いかと 思います。 Cache-Control ヘッダーとの
組み合わせでの 動作の 検証が 必要
Cache-Control ヘッダーに、no-store
が付与されている 場合、 prefetch しても Cache が 利用されず 再度取得する 可能性が あります。 サーバーへの
アクセスが 増えるので、 どの 程度追加の アクセスが 発生するか 見積もりして おく
通信量、サーバー負荷に 影響が あるかと 思います。
生成したJavaScript と 現状の アクセス数を 元に 程度、 見積もりしてどの 程度増加するのか 把握する 必要が あります。 Google Analytics の
アクセス数の 増減
prefetch が影響して、 Google Analytics の アクセス数の 増減が ないか、 HTTPサーバー側で 区別して 記録したいのか 等の 検討が 必要に なります。
Firefox の場合、 X-moz
という ヘッダーが 送信されるので これを 元に 区別しても いいかもしれません。 CrossDomain設定時の
URLの 調整
Google Analytics のCrossDomain 設定を 行なっている VIEW の 場合、 取得できる URLの 形式が www
で始まる 場合、 取得した URLでは prefetch できない 可能性が あります。
guess-webpack には、routeFormatter
という オプションを 指定できるので、 これで URLを 調整するか、 reportProvider
でGoogle Analytics からの データ取得方法を 変更するかどちらかの 方法で URL を 変更した 方が 良いかと 思います。 定期的に
JavaScript の 再生成が 必要
guess-webpack はビルド時点での Google Analytics の データを もとに ページ先読みの ための 行列を 生成しています。
サイト上でのアクセス傾向が 変化する 可能性が あるので、 定期的に JavaScript ファイルの 再生成が 必要に なります。
以下、
- ログイン、
末ログイン 等で ページの 表示が 切り替わる ページにはなんらかの 対策が 必要
prefetch でHTML の 先読みを 実施するので ログイン、 末ログインで 表示が 切り替わる 場合は、 Cache を 削除する。 そも そも prefetch させないなどの 対策が 必要かと 思います。 ログイン、 末ログインが 表示に 影響が ないような サイトで 使うのが よさそうに 思います。
guess-webpack-starter の 使い方
kemsakurai/guess-webpack-starter のREADME.md
に
- 補足
GuessPlugin のdelegate
オプションはtrue
を指定し、 PrefetchPlugin
を使用しています。 PrefetchAotPlugin
は、前もって 予測を 行うことができるようですが、 ドキュメントが なく イマイチ使い方が わかりませんでした。 Example 等が できたら こちらも 試してみたいと 思います。
参考
以下、
* Introduce AoT predictive prefetching by mgechev · Pull Request #94 · guess-js/guess
requestIdleCallback()に
よる 協調的バックグラウンド処理の 実現 / requestIdleCallback() - Speaker Deck
guess-js の内部で 使っていて、 気に なりました。 Cannot read property ‘guess’ of undefined · Issue #83 · guess-js/guess
GuessPlugin
プロパティの設定方法が この Isuue に 記載して あります。 prefetch
in combination ofCache-Control
· Issue #21 · GoogleChromeLabs/quicklink
以上です。
コメント