uhyohyo.net

JavaScript初級者から中級者になろう

十五章第二回 Navigation Timing

このページの最終更新日:

今回紹介するNavigation Timing APIは、ページを表示するときの時間経過とかを知ることができるAPIです。

ページを表示するのにどれだけかかったのかとか、そういう詳細情報を得ることができるのです。

前回も説明したように、Webアプリケーションがサクサク動くかどうかは死活問題です。ですので、ページを開くときに、例えば読み込みに時間がかかってしばらく画面が真っ白みたいなことが起こると大問題です。このAPIを使うとどこに時間がかかっているかという情報を得ることができ、読み込みが遅い場合の改善のヒントとなります。

このAPIは大きく分けて2つの部分からなっています。時間に関する情報を表すPerformanceTimingとその他に関するPerformanceNavigationです。

APIを使うには、window.performanceに入っているPerformanceオブジェクトを用います。ブラウザ上だとwindowのプロパティはグローバル変数として参照できるのはいまさら言うまでもありませんね。

このオブジェクトは、PerformanceTimingたるtimingプロパティと、PerfomanceNavigationたるnavigationプロパティの2つを持っています。

PerformanceTiming

PerformanceTimingはさまざまなタイミングを時刻で表すプロパティを持っています。今回、時刻は全て整数値で表されています。これは、世界標準時で1970年1月1日午前0時0分0秒ちょうどから経過したミリ秒数を表しています。この形式は数値で時刻を表すための結構一般的な方法で、UNIX timeと呼ばれます。UNIX timeというときはミリ秒ではなく秒数で表すことが多いようですが、JavaScriptではミリ秒とすることのほうが多いです。例えば2013年1月1日午前0時0分(世界標準時)だったら、1356998400000になります。

以下ではプロパティを時系列順に列挙します。

navigationStart
簡単に言えば、このページを開こうとした瞬間です。もうちょっと詳しく言うと、前のページでbeforeunloadイベントの処理が終了したあとunloadイベントが発生する直前の瞬間です。
unloadEventStart
前のページでunloadイベントが発生する直前のタイミングです。ただし、新しくこのページを開いた場合は前のページが存在しないので、0になります。また、前のページが別オリジンのページの場合は、セキュリティ上の理由から0になります。
unloadEventEnd
前のページでunloadイベントの処理が終了した瞬間のタイミングです。unloadEventStartが0のときはunloadEventEndも0になります。
redirectStart
もし前のページから移動した先がリダイレクトでそこを経由してこのページを表示した場合は、リダイレクトを読み込み始めた瞬間です。リダイレクトしていない場合は0です。また、リダイレクト中に他のオリジンを経由した場合も0です。
redirectEnd
リダイレクトがあった場合、リダイレクトページとの通信を終了した瞬間(その情報にしたがってこのページの読み込み処理を開始する直前)です。リダイレクトが無かった場合は0です。
fetchStart
このページを読み込む処理を開始した瞬間です。読み込み処理というのは与えられたURLを解析するところから始まるのでその瞬間です。
domainLookupStart
URLを解析したらDNSを用いて接続先のIPアドレスを取得します。その処理が始まる瞬間です。
domainLookupEnd
同様に、その処理が終了した瞬間です。
connectStart
接続先が決まり、Webサーバーに接続する直前の瞬間です。
connectEnd
Webサーバーとの接続が確立した瞬間です。
secureConnectionStart
プロトコルがHTTPSの場合、そのハンドシェイクを開始した瞬間です。HTTPSでない場合は0です。
requestStart
接続の確立後、HTTPリクエストをサーバーに送る直前の瞬間です。
responseStart
リクエスト送信後、サーバーからの応答を受信し始めた瞬間です。
responseEnd
サーバーからの応答を全て受信した瞬間です。
domLoading
サーバーからの応答をもとにDOMの構築を始めた瞬間です。具体的には、このページに対応するdocumentオブジェクトが生成された瞬間です。
domInteractive
DOMの構築が終了した瞬間(HTMLのパースが終了した瞬間)です。
domContentLoadedEventStart
DOMの構築が終了したあと、DOMContentLoadedイベントが発生しますが、それが発生する直前の瞬間です。ちなみにパース終了とDOMContentLoadedイベント発生の間には、読み込み終了時に実行するスクリプトが実行される処理が挟まっています。
domContentLoadedEventEnd
DOMContentLoadedイベントの処理が終了した瞬間です。
domComplete
ページの読み込みが全て終了した瞬間です。後述のloadEventStartとの違いがよくわかりません。
loadEventStart
ページの読み込みが終了するとloadイベントが発生しますが、それが発生する直前の瞬間です。
loadEventEnd
loadイベントの処理が終了した瞬間です。

以上です。けっこうたくさんありますね。これらを用いることで、ページ読み込みにかかった時間とかも知ることができます。例えば通信にかかった時間を知りたいなら、fetchStartからresponseEndまでの時間を計算すればよいでしょう。

それを知ったあとそれを使って何をするかはあなた次第です。

実際に通信にかかった時間を表示するサンプルを用意しました。恐らく2回目以降は1回目よりも表示される時間が短いと思います。これはキャッシュが効いているためですね。

また、このサンプルをパソコンに保存してからブラウザで開いてみると、通信にかかった時間の代わりにページをファイルから読みこむのにかかった時間を計算してくれます。

PerformanceNavigation

さて、もう一つがPerformanceNavigationです。その他といいましたが、実はここで得られる情報は2つだけです。

1つはtypeプロパティに入っていて、これはこのページを開いたときのナビゲーションの種類を表す数値です。これは以下の4種類があります。例によって定数が用意されていますので、それで説明します。

TYPE_NAVIGATE
リンクをクリックしたりアドレスをアドレスバーに入力して開いたときのような、通常のページ移動。
TYPE_RELOAD
ページを更新したとき。
TYPE_BACK_FORWARD
「戻る」ボタンや「進む」ボタンで移動してきたとき。
TYPE_RESERVED
上の分類に当てはまらない特殊な方法のとき。

これらの定数はPerformanceNavigationオブジェクトのプロパティです。

これを用いたサンプル2を用意しました。まずは普通に開いて、その後ページを更新したりこのページと「戻る」「進む」ボタンで行き来してみましょう。3種類の異なる表示を見ることができます。

PerformanceNavigationから得られるもう一つの情報は、リダイレクトの回数です。このページを開いた時に何回リダイレクトを経由したかの数値が、redirectCountプロパティに入っています。ただし、リダイレクトで違うオリジンを経由した場合はセキュリティ上の理由で0になります。

以上がNavigation Timingの全てです。

ちなみに、強化版のNavigation Timing 2というのが今作成中だそうです。そのうち紹介します。