Gigazineにて『CDNの共通ライブラリファイルをローカルに保存してセキュリティ&閲覧速度を高めるFirefoxアドオン「Decentraleyes」』なる記事が公開されていた。このDecentraleyesなるアドオンは、ギガジン曰く
JavaScriptライブラリやフレームワークの中でもjQueryやEmberのようなインターネット利用者がよく使うファイルはContent Delivery Network(CDN)サイト上に置かれており、CDNにアクセスして読みこむ仕組みとなっています。しかし、CDNにアクセスすることでわずかながら読み込みに時間がかかりページ表示速度が遅くなったり、CDNによって行動履歴を追跡されたりする危険性があるため、「なるべくならばアクセスをなくしたい」と考えた技術者によって、頻繁に使われるJavaScriptライブラリ/フレームワークをローカルに保存してCDNへのアクセスを減らすFirefoxアドオン「Decentraleyes」が開発され、GitHub上で公開されています。
ということらしい。つまるところ、有名なライブラリ等はパブリックCDNから頻繁に読み込まれるので、アドオン側でキャッシュを返すようにしたら良くない?という発想だろう。
しかし怪しい。疑問をもたざる得ない。セキュリティ云々はともかく、スピードアップにどれだけ寄与するのだろう。だってブラウザにはキャッシュを利用するシステムがすでにあるじゃないか。
ブラウザのキャッシュは馬鹿なのか?
公開されているパブリックなCDNは、出来るだけ長い間(大抵1年)ブラウザがキャッシュを利用するように適切なhttpレスポンスヘッダを付与するはずだ。例えばGoogle Hosted Librariesでは静的なファイルにCache-Control: public, max-age=31536000を設定している。これは一年(31536000秒)ファイル使いまわせ、ということだ。一年間、キャッシュを保持している限り、二度とダウンロードされないし、大抵のブラウザはファイル変更確認の為のリクエストすら出さないはずだろう。(いや、詳しくはしらんけど)
すなわち、理想的な状況なら、Decentraleyesが活躍するのは最初のファイルダウンロードと、その後一年ごとのリクエストだけ、ということになる。果たして、これにどれほどの意味が見いだせるのだろうか?
ちなみに、ちょこっと検索したら、同じような事を書いてあるはてブコメントがあった。
Synzvato/decentraleyes · GitHub
cdnjsなど外部CDN経由で取得するjavascriptライブラリをブラウザに取り込んでおき、CDNから取得するトラフィックを削減するFirefoxアドオンらしいが、CDNは十分なmax-ageが設定されてて2回目以降キャッシュ使うので殆ど意味ない
もちろん、ブラウザのキャッシュストレージサイズには限りがあるので、一年間キャッシュが保持され続ける保証はない。近頃のウェブサイトは1MB以上あるのが普通なので、ドンドンキャッシュを貯めこんでいけばいずれキャッシュはパージされるだろう。しかし、最近のブラウザは少し賢いようだ。単純に古いものからキャッシュを削除するのではなく、古いキャッシュでも、頻繁に参照されるようなファイルは残される。
cache v2では、保存するデータがディスクキャッシュの上限に達した場合、不要なエントリから適切に排除されるようになっている(Bug 913808)。エントリの選別にはfrecencyと呼ばれるアルゴリズムが採用されており、最近保存されたエントリや、頻繁に再利用されるエントリは残る仕組みだ。
賢いブラウザは有名なライブラリやフレームワークのキャッシュを残しておいた方が後々有利だとわかっているだろう。
測ったわけではないから推測だが、一年間とは言わずとも、一ヶ月ぐらいはキャッシュを持っているのではないだろうか。やっぱりDecentraleyesを使うメリットは、言うほど多くないように見えるが、果たしてどうなのだろうか。有名サイトで、パブリックCDNのキャッシュ保持率を計測した実験でもあればいいのだけどね。
ただ、これと言ってこのアドオンを利用するデメリットも思いつかないので、全く無駄と言う気もない(このアドオンを信頼するなら)。