* 仕様書

[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-preconnect>
- [10] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-preconnect>
- [29] [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>
- [32] [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[preconnect]]

[25] [[リンク型]] [DFN[[CODE(HTML)@en[preconnect]]]] は、
指定された[[資源]]の[[起源]]にある[[資源]]を[[利用者]]が必要とする可能性が高く、
予め当該[[起源]]への[[接続]]を開始しておくことで[[利用者]]の[[体験]]を向上させられることを示します [SRC[>>22]]。

[23] [[リンク型]] [CODE(HTML)@en[preconnect]] は、 [CODE(HTMLe)@en[link]]
[[要素]]で指定でき、[[外部資源リンク]]を作成します [SRC[>>22]]。

[30] [CODE(HTTP)@en[Link:]] [[ヘッダー]]でも指定できます [SRC[>>29]]。

[24] この[[リンク型]]は [[body-ok]] です [SRC[>>22]]。つまりこの[[リンク型]]の
[CODE(HTMLe)@en[link]] [[要素]]は、 [CODE(HTMLe)@en[head]] [[要素]]内のみならず、
[CODE(HTMLe)@en[body]] [[要素]]内でも使えます。

[11] [CODE(HTMLa)@en[href][<link href>]] [[属性]]の [[URL]] に特に制約はありませんが、
[[userinfo]]、[[query][URL query]]、[[素片][素片識別子]]は指定しても意味がありません。
([[port][URL port]] は[[同じ起源]]かどうかの検査に使われますから、
全く無意味ではありません。)
[[URL scheme]] も、 [[HTTP(S) scheme]] でなければ無視されるので意味がありません。

[53] [[著者]]は、 [CODE(HTML)@en[preconnect]] [CODE(HTMLe)@en[link]] [[要素]]よりも前に関係する
[[CSP]] [CODE(HTMLe)@en[meta]] [[要素]]を置く[SHOULD[べきです]] [SRC[>>50]]。

[54] [[著者]]は、 [CODE(HTML)@en[preconnect]] [CODE(HTTP)@en[Link:]] [[ヘッダー]]を使うなら関係する
[[CSP]] [[ヘッダー]]も含める[SHOULD[べきです]] [SRC[>>50]]。

;; [55] >>53、>>54 に違反すると、処理順序の都合により、
[[CSP]] の制限が適用されないことになります。

[EG[
[34] [[資源]]の [[URL]] が[[クライアント]]側で組み立てる場合で、
[[サーバー]]が個別の [[URL]] を事前に判断できない場合でも、
その[[起源]]がわかっているなら、 [CODE(HTML)@en[preconnect]]
により予めその[[起源]]への接続を指示できます。 [SRC[>>32]]
]EG]

[EG[
[35] 何らかの理由で[[リダイレクト]]を挟んで本来の[[リンク先]]へと [[navigate]]
させるときに、本来の[[リンク先]]の[[起源][URLの起源]]への接続を予め用意させることができます。
[SRC[>>32]]
]EG]

* 処理

[49] [[混合内容]]に関して [[optionally blockable]] です [SRC[>>50]]。
仕様書上は明確ではありませんが、趣旨からすると、
[[混合内容]]制約が適用されるものと思われます。

[51] 仕様書上は明確ではありませんが、趣旨からすると、 [[CSP]]
制約が適用されるものと思われます。

;; [36] 接続段階では[[参照元]]を送信することはないので、 [[Referrer Policy]] 
の指定は関係しません。

[52] 適用するかどうか、[[利用者]]が設定できるようにすることができます [SRC[>>50]]。

[12] [CODE(HTMLe)@en[link]] [[要素]][VAR[要素]]の[DFN[[RUBYB[事前接続を開始]@en[initiate a preconnect]]]]するには、
次のようにしなければ[MUST[なりません]] [SRC[>>10]]。
[FIG(steps)[
= [13] [VAR[URL]] を、[VAR[要素]]の [CODE(HTMLa)@en[href]] [[属性]]の[[解決][URLの解決]]の結果に設定します。
= [14] [VAR[URL]] が失敗なら、
== [17] ここで停止します。
= [15] [VAR[URL]] の [F[scheme][URL scheme]] が [[HTTP(S) scheme]] でなければ、
== [16] ここで停止します。
= [18] [VAR[起源]]を、[VAR[URL]] の[F[起源][URLの起源]]に設定します。
= [19] [VAR[要素]]の [CODE(HTMLa)@en[crossorigin]] [[属性]]の状態が[[匿名]]で、
[VAR[起源]]と[VAR[要素]]の[F[節点文書]]の[F[起源][文書の起源]]が[[同じ起源]]でなければ、
== [20] [VAR[credentials]] を、[[偽]]に設定します。
= [21] それ以外なら、
== [26] [VAR[credentials]] を、[[真]]に設定します。
= [27] [VAR[起源]]と [VAR[credentials]] について[[接続を得ます][接続を得る]]。
[VAR[事前]]は[[真]]とします。
]FIG]

[28] ここで、[[接続を得る]]によって新しい[[接続][HTTP接続]]が確立され、
[[接続プール]]で保持されます。以後の [[fetch]] で[[接続を得る]]時にこの[[接続プール]]が参照されるので、
[[事前接続]]として確立された[[接続][HTTP接続]]があれば、利用される可能性があります。
なお、[[接続を得る]]は通常の [[HTTP]] の処理に使う[[接続][HTTP接続]]を確立するもので、
[[WebSocket]] には使われません。つまり[[事前接続]]は [[WebSocket]]
には効果がありません。

[31] [[利用者エージェント]]は、その判断により、[[事前接続]]を取り消しできます
[SRC[>>29]]。

[33] [[利用者エージェント]]は、次の [[navigate]] があっても[[事前接続]]を継続する[SHOULD[べきです]] [SRC[>>29]]。

* 歴史

[1] [CITE@en[Resource Hints]]
( ([TIME[2014-08-05 22:14:16 +09:00]] 版))
<https://igrigorik.github.io/resource-hints/#preconnect>

[2] [CITE@en[Resource Hints]]
( ([TIME[2014-10-17 03:41:00 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-resource-hints-20141021/>

[3] [CITE@en[Resource Hints]]
( ([TIME[2014-10-17 03:41:00 +09:00]] 版))
<http://www.w3.org/TR/2014/WD-resource-hints-20141021/>

[4] [CITE@en[Resource Hints]]
([TIME[2015-04-23 05:55:03 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-resource-hints-20150422/>

[5] [CITE@en[Resource Hints]]
([TIME[2015-04-23 05:55:03 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-resource-hints-20150422/>

[6] [CITE@en[Resource Hints]]
([TIME[2015-04-23 22:12:34 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-resource-hints-20150423/>

[7] [CITE@en[Merge pull request #45 from w3c/preconnect-fetch · w3c/resource-hints@ad3ade9]]
([TIME[2015-10-07 14:01:14 +09:00]] 版)
<https://github.com/w3c/resource-hints/commit/ad3ade98d93d5cdc71adaed5e99c01ab73e1e9e6>

[8] [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>

[9] [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>




[37] 
[CODE[<link rel=preconnect>]] の次の行に [CODE[<link rel=stylesheet>]]
で同じドメイン書いてあるの見たけど意味あんのこれ?
どっかの解説サイトか例文配布がなんとなく速くなりそうだと思っててきとーに書いたのがコピペで広まってるだけちゃうん?
[TIME[2023-05-17T13:24:20.600Z]]

[38] 
余計な[[要素]]1個増えてる分遅くなりそうよね、誤差だろうけど。早くなることはないんちゃう?




