coding, photo, plant and demo

*画像読み込みの最適化

btz 20100620 174530
現状このサイトでは画像のリンク先がスクリプトになっている。
これはpermissionの確認などの為なのだけど、そのせいで負荷が高い。読み込みも遅い。
画像を大量に張ると酷いことになる。どうにかしたい。

とりあえず思いつくもの。各々は直交する。効果は推定。

表示の高速化サーバの負荷帯域手間
直リンにする少し効く減る変化なしかかる。設計の見直しあり
遅延読み込み効くかなり減る減る殆どかからない
画像埋め込み効く減るサイズ依存そこそこ

1つ目は、現在スクリプトを介しているものをapacheだけで解決できるようにするというもの。permissionを真面目に考えると結構厄介な問題な気がする。publicなものとそうでないもので、置き場所を変えるとかかな。

2つ目は、jsを使ってスクロールするまで画像を読み込まないとかやる方法。
Lazy Load Plugin for jQuery等を使えば楽。
これはdocument.readyのタイミングでimgタグのsrcを一旦外して、view portに入ってきたら復活させるということをやっている。ただ、最近のブラウザだとリクエストを出すのが早いので、結局srcを外す前に既にリクエストが出てるような。意味ねー。

3つ目は、Google News等で使われる手法。base64でsrcタグにjpeg等をそのまま埋め込む。リクエストが減らせるけど、画像の転送量自体はbase64のため13%増えるので、ある程度小さい画像までなら有効。リクエスト自体のオーバーヘッドが1KB弱とすれば10KB以下なら埋め込んでも良さそう。


1つ目はちょっと面倒なことになりそうなのでパス。

で、2つ目と3つ目を導入した。
まずimg要素のsrcに低画質な1.5KB程度のjpegをbase64で埋め込み、original属性に本当のsrcを書く。
次にlazy load pluginを改造してsrcを一旦外すコードを消し、original属性があればlazy load対象とする。

これで画像を大量に張っても今見える範囲の分だけのリクエストしかでない。
そして、そのリクエストが完了するまでは低画質のサムネイルが出る寸法。
user agentが携帯等だったらlazy loadを殺して、低画質のサムネイルだけでよいかも。


しかし大して見に来る人もいないブログだというのに、そのブログのためにコード書いて、それでブログを更新するとはなんというメタブログなんだここは。