✍️

Web 技術解体新書「第二章 Cache 解体新書」リリース

2022/06/09に公開

Web 技術解体新書「第二章 Cache 解体新書」リリース

Intro

「Web 技術解体新書(Web Anatomia)」の第二章として「Cache 解体新書(Cache Anatomia)」をリリースしました。

Cache 解体新書(Cache Anatomia)

これで予定している八章のうち二章が終わりました。

Cache 解体新書

以下の Response Header Field がどういう意味を持つか正確に説明できますか?

Cache-Control: max-age=3600

おそらく多くの Web 開発者が一度は見たことがあり、これを「1 時間キャッシュする」という意味で指定している人もおおいでしょう。

では、どこから 1 時間で、 1 時間経ったらなにが起こるのか、これが Response でなく Request に付与されたらどう変わるのか、きちんと把握できていますか?

そもそも、一般的にキャッシュ機構における有効期限の指定は "Expire" や "TTL" など多くの表現方法がありますが、なぜ HTTP は max-age なんでしょうか? なぜ別途 Expires があるのに、 Cache-Control には expires ディレクティブが無いのでしょうか?

また、最近では Service Worker でも JS からキャッシュの制御ができますが、それと Cache-Control による制御は何が違うんでしょうか? Offline 対応じゃなくても Service Worker は入れた方がいいのでしょうか?

サブリソースはともかく、メインリソースはキャッシュがしにくいものが多いですが、その場合はキャッシュはあきらめるしかないのでしょうか? つけるべきは no-store ですか、本当にそれでいいですか? ETag の生成は考えていますか?

本章は、「この Header をつけるとこうなる」「このライブラリを入れるとこうなる」という話ではなく、「Web におけるキャッシュがどう設計されているのか」を正しく知ることで、その仕組を「どう使うと正しくメリットが得られるのか」について、ブラウザのキャッシュだけではなく CDN など、近年では普通となった構成を念頭に網羅的に解説することを目的としています。

対応 RFC

本章は、 2022 年 6 月 6 日に公開された最新の RFC に対応しています。(ドラフトの段階から書き始め、 RFC 公開と同時に zenn に公開しました)

MDN の書き直し

本章を書く上で MDN を確認したところ、内容が非常に古く間違った記述も多くありました。(Wiki としてだれでも自由に更新できたためその名残です)

そこで、 MDN にあった Caching に関するページを全て書き直しました。古いもの、間違ったものを消し、最新の仕様についても盛り込んであります。

前者は Cache-Control の仕様そのものに関するページ。後者はそれを用いた Cache についての総括的なページです。いずれも、本章を要約したものになっています。

また、前者の仕様の方のページは、まさしく IETF の HTTPWG で HTTP の仕様を策定している mnot 氏本人から直々にレビューを受けることができました。この世で最も仕様を正確に把握している人物であるため、もちろんかなり多くの指摘を受け、自分の Cache に関する間違った認識もだいぶ修正できました。その修正はもちろん本書にも反映しています。

注意点として、 MDN の記述は「同じ人物(筆者)」が「同じ時期」に「同じ内容」について書いたものです。 MDN と見比べて本書が MDN のパクリであるという誤解を招かないことを祈ります。 MDN に提出した画像も、本書のために作った画像をもとに MDN 用に色や配置を変えて提供したものです。似てはいますが、本書の画像は MDN からパクったものではないということも書き添えておきます。

Outro

真剣に調べて妥協なく盛り込むことを重視したところ、時間も分量もかなりのものになってしまいました。

これでも、長すぎて断念したページが実はあと 2 節あります。しばらくは三章以降を優先しますが、いずれはそれらもアップデートで含められればと思っています。

その分かなり網羅的に書き上げたため、 Web における Caching について包括的に把握する上で、参考になればと思います。

Jxck

Discussion