* 仕様書

[REFS[
- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-06-10 18:36:00 +09:00]]) <https://html.spec.whatwg.org/#link-type-prefetch>
- [17] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-prefetch>
- [21] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-fetching-the-resource-hint-link>
- [27] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-load-and-error-events>
- [30] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-use-cases>
- [50] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-security-and-privacy>
]REFS]

* リンク型 [CODE(HTML)@en[prefetch]]

[25] [[リンク型]] [DFN[[CODE(HTML)@en[prefetch]]]] は、
指定された[[資源]]を[[利用者]]が必要とする可能性が高く、
予めこれを [[fetch]] して[[キャッシュ]]しておくのが有用である
([[fetch]] する[SHOULD[べき]] [SRC[>>17]]) と示します [SRC[>>22]]。

[23] [[リンク型]] [CODE(HTML)@en[prefetch]] は、 [CODE(HTMLe)@en[link]]
[[要素]]で指定でき、[[外部資源リンク]]を作成します [SRC[>>22]]。

[26] [CODE(HTTP)@en[Link:]] [[ヘッダー]]でも指定できます [SRC[>>21]]。

[24] この[[リンク型]]は [[body-ok]] です [SRC[>>22]]。つまりこの[[リンク型]]の
[CODE(HTMLe)@en[link]] [[要素]]は、 [CODE(HTMLe)@en[head]] [[要素]]内のみならず、
[CODE(HTMLe)@en[body]] [[要素]]内でも使えます。

[53] [[著者]]は、 [CODE(HTML)@en[prefetch]] [CODE(HTMLe)@en[link]] [[要素]]よりも前に関係する
[[CSP]] [CODE(HTMLe)@en[meta]] [[要素]]を置く[SHOULD[べきです]] [SRC[>>50]]。

[54] [[著者]]は、 [CODE(HTML)@en[prefetch]] [CODE(HTTP)@en[Link:]] [[ヘッダー]]を使うなら関係する
[[CSP]] [[ヘッダー]]も含める[SHOULD[べきです]] [SRC[>>50]]。

;; [55] >>53、>>54 に違反すると、処理順序の規定より、
[[CSP]] の制限が適用されないことになります。

[EG[
[32] ページ分けされた次のページや、検索結果の高順位など、[[利用者]]の次の行動が予測できるときに[[投機的fetch]]を行わせることができます。 [SRC[>>30]]
]EG]

[EG[
[34] [[navigate]] 先のページで埋め込まれる重要な[[資源]]が予めわかっている場合、
[[navigate]] 開始と同時に [CODE(HTML)@en[prefetch]] リンクを挿入して予め
[[fetch]] を開始させることができます。 [SRC[>>30]]
]EG]

* 処理

[46] [[fetch]] は、[[obtain the resource]] によります [SRC[>>21]]。

[49] [[混合内容]]に関して [[optionally blockable]] です [SRC[>>50]]。

[51] [[CSP]] や [[Referrer Policy]] が適用されます [SRC[>>50]]。

[52] 適用するかどうか、[[利用者]]が設定できるようにすることができます [SRC[>>50]]。

[28] 現在の [[navigate]] の処理への干渉するべきではありません。
そのために [[fetch]] を遅延させて構いません。 [SRC[>>21]]

[18] [[利用者エージェント]]は、指定された[[資源]]を[[前処理]]する[SHOULD[べきではありません]]。
現在のページの文脈で自動的に実行・適用しては[MUST[なりません]]。 [SRC[>>17]]

;; [20] [[前処理]]というのは、 [CODE(HTML)@en[prerender]] のような処理を指していると思われます。

[19] [CODE(HTMLa)@en[as][as=""]], [CODE(HTMLa)@en[crossorigin]] が処理に反映されます。

[31] [[利用者エージェント]]は、その判断により、[[投機的fetch]]を取り消しできます
[SRC[>>21]]。

[33] [[利用者エージェント]]は、次の [[navigate]] があっても[[投機的fetch]]を継続する[SHOULD[べきです]] [SRC[>>21]]。

[29] [[obtain the resource]] により [CODE(DOM)@en[load]]/[CODE(DOM)@en[error]]
[[イベント]]が[[発火]]されることになっています。しかし[[投機的fetch]]
の実行のタイミングは実装依存ですし、完全には処理されないかもしれません。
従ってできるだけ適切に[[発火]]する[SHOULD[べき]]ですが、
[[発火]]しなくても構いませんし、完全に処理せずとも[[発火]]することも認められています [SRC[>>27]]。

* アドレスバー

[35] [[アドレスバー]]への[[利用者]]の入力により先読みが行われる場合もあります。
[[アドレスバー]]参照。

* 歴史


[44] 
[CITE@ja[ユーザ設定をする - [[超漢字]]ウェブサイト]], [TIME[2010-11-10T00:22:27.000Z]], [TIME[2022-09-03T07:42:13.232Z]] <http://www.chokanji.com/ckv/manual/05-01-03.html>

[45] 
[CITE[[[超漢字]]]]の標準[[Webブラウザー]][CITE[[[BBB]]]]は[[リンク]]を
「リンク色」、
「訪れたリンク色」
で区別する
[SEE[ [[:visited]] ]]
他に
「切れたリンク色」
を区別できました。
「リンクチェック」
オプション (既定値: 無効)
を有効にしておくと、
[[リンク切れ]]を色で判別できました。
[SRC[>>44]]

[47] 
これを実現するためには当然ながら[[レンダリング]]時点ですべての[[ハイパーリンク]]を開いていたと思われます。
(さすがに無理があるのでデフォルトで無効だったのでしょう。)



[1]
[CITE[Link Prefetching FAQ]] <http://www.mozilla.org/projects/netlib/Link_Prefetching_FAQ.html>

[2] [CITE@en-us[Link prefetching FAQ - MDC]] ([TIME[2008-12-25 22:31:51 +09:00]] 版) <https://developer.mozilla.org/ja/Link_prefetching_FAQ>


[3] 
[PRE(HTML example code)[
<link rel="prefetch alternate stylesheet" title="Designed for Mozilla" href="mozspecific.css">
]PRE]

>>2 より。これ他のブラウザでも動くの?

[4] [CITE@ja-JP[FireFox先読み機能対策(X-Moz : prefetch) - Yaibeen]] ([[yaibeen]] 著, [TIME[2008-11-21 12:52:09 +09:00]] 版) <http://nucleus.yaibeen.com/item245.html>

>FireFox 1.5系のブラウザで当サイト(Nucleus)へアクセスするとページを表示させる度にxml-rss2.phpへのアクセスが発生します。
原因はFireFoxの機能である『先読み』であることはわかりました。※FireFox 2.0.0.2では同現象は確認できませんでした。
サーバへの負荷が気になるのでxml-rss2.phpへ対策用のコードを加えて(&修正)みました。
Nucleus側で『先読み:X-Moz: Prefetch』であることを判別し、2回目以降の先読みはレスポンスとして『HTTP/1.0 304 Not Modified』を返却します。これで転送量削減と、サーバへの負荷軽減になると思います。

>ちなみにFireFox 2.0.0.2ではライブブックマークの更新時は『X-Moz:livebookmarks』という値を送信しているようです。1.5.0.10では『livebookmarks』という値は確認できませんでした。livebookmarksで購読者数のチェック等に使えるかもしれませんね。

[5] 2002年12月の [[XHTML2]] 仕様案で[[リンク型]]の ISSUE として [CODE(HTML)@en[[[prefetch]]]]
が検討対象として挙げられています。

;; [CITE@en[- Module Definition Conventions]] ([TIME[2002-12-12 23:58:38 +09:00]] 版) <http://www.w3.org/TR/2002/WD-xhtml2-20021211/abstraction.html#dt_LinkTypes>


[6] [CITE@en[HTML5 Revision Tracker]]
([TIME[2010-08-10 00:29:56 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=5247&to=5248>

[7] [CITE[''''''[''''''whatwg'''''']'''''' Support of link rel=prefetch]]
( ([TIME[2012-12-29 16:40:25 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038481.html>

[8] [CITE@en[Web Developer's Guide to Prerendering in Chrome - Google Chrome — Google Developers]]
( ([TIME[2012-03-30 22:53:52 +09:00]] 版))
<https://developers.google.com/chrome/whitepapers/prerender?hl=ja>

[9] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#the-prefetch>

[10] [CITE[Add manifest and prefetch contexts. https://www.w3.org/Bugs/Public/show_... · ca784a7 · whatwg/fetch]]
( ([TIME[2014-05-29 04:53:31 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/ca784a76050352fbc4ceb61e39ae71475197398c>

[11] [CITE@ja[プリレンダリングとプリフェッチのサポート (Windows)]]
([TIME[2015-05-07 17:14:15 +09:00]] 版)
<https://msdn.microsoft.com/library/dn265039(v=vs.85).aspx>

[12] [CITE@en[Merge pull request #53 from w3c/prefetch-relationship · w3c/preload@ab0f23c]]
([TIME[2016-01-31 11:49:44 +09:00]] 版)
<https://github.com/w3c/preload/commit/ab0f23ca8aadf5aef94de62f03b1e23ef7510b56>

[13] [CITE@en['prefetch' is erroniously listed as optionally-blockable. · w3c/webappsec-mixed-content@01cc333]]
([TIME[2016-02-12 14:46:54 +09:00]] 版)
<https://github.com/w3c/webappsec-mixed-content/commit/01cc3336c1e87ebc1bfd6d5f02e87042c07e279e>

[14] [CITE@en[Allow pingback/prefetch/stylesheet links in body · whatwg/html@179983e]]
([TIME[2016-03-04 21:32:40 +09:00]] 版)
<https://github.com/whatwg/html/commit/179983e9eb99efe417349a40ebb664bd11668ddd>

[15] [CITE@en[Link relations: add dns-prefetch/preconnect/prerender; update prefetch]]
( ([[domenic]]著, [TIME[2016-04-28 07:26:36 +09:00]]))
<https://github.com/whatwg/html/commit/0f54b54307647ca15ace16ef03c570db1b918193>

[16] [CITE@en[Treat <link rel="next"> as a general resource hint]]
( ([[domenic]]著, [TIME[2016-05-19 16:38:13 +09:00]]))
<https://github.com/whatwg/html/commit/7ff5b096d423bf5750463957aed69680368ed99e>

[36] [CITE@en[Introduce 'prefetch-src'. (#283)]]
([[mikewest]]著, [TIME[2018-01-15 23:18:59 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/91adc4ab7beb21bcc05e3ebeeb035d2745c7817d>

[37] [CITE@en[Specify behavior of prefetch requests · Issue #107 · w3c/webappsec-csp]]
([TIME[2018-01-16 11:09:59 +09:00]])
<https://github.com/w3c/webappsec-csp/issues/107>

[38] [CITE@en[Introduce 'prefetch-src'. Closes w3c/webappsec-csp#107. by mikewest · Pull Request #283 · w3c/webappsec-csp]]
([TIME[2018-01-16 11:15:07 +09:00]])
<https://github.com/w3c/webappsec-csp/pull/283>

[39] [CITE@en[Add prefetch and prerender initiators]]
([[yoavweiss]]著, [TIME[2018-04-27 17:36:34 +09:00]])
<https://github.com/whatwg/fetch/commit/d5d084096392f2c47841308952a76751bafdd375>

[40] [CITE@en[Add a `prefetch` initiator by yoavweiss · Pull Request #659 · whatwg/fetch]]
([TIME[2018-05-02 13:02:47 +09:00]])
<https://github.com/whatwg/fetch/pull/659>

[41] [CITE@en[Introduce 'prefetch-src'. Closes w3c/webappsec-csp#107. by mikewest · Pull Request #283 · w3c/webappsec-csp]]
([TIME[2018-05-02 13:06:19 +09:00]])
<https://github.com/w3c/webappsec-csp/pull/283>

[42] [CITE@en[Request.destination for `<link rel=prefetch>` · Issue #658 · whatwg/fetch]]
([TIME[2018-05-02 13:07:20 +09:00]])
<https://github.com/whatwg/fetch/issues/658>

[FIG(quote)[
[FIGCAPTION[
[43] [CITE@ja[【注意】ブラウザの先読み機能による大量アクセスについて - 電子ジャーナル・電子ブックを使う - Keio University LibGuides at Keio University Media Center / 慶應義塾大学メディアセンター]]
([TIME[2018-06-21 12:15:15 +09:00]])
<https://libguides.lib.keio.ac.jp/e-resource/link-prefetching>
]FIGCAPTION]

> 最近、Webブラウザの「リンク先読み機能」により、利用者が意図せずとも、大量ダウンロード/大量アクセスを起こしてしまうケースが頻発しています。
> 「リンク先読み機能」では、ページを閲覧中に、バックグラウンドでページ内のリンクへのアクセスが繰り返されます。そのため、本人は普通に電子ジャーナルを利用していたつもりでも、気が付かないうちに大量ダウンロード/大量アクセスになってしまうことがあります。
> 以下の設定変更により、この機能を無効にしていただきますよう、ご協力をお願いいたします。
> 特にMicrosoft Edgeでの発生事例が多く報告されていますので、ご注意ください。

]FIG]
