prototype.jsを10KBにする方法の続き(.htaccessをスマートに使う)

シェアする

2006-11-26T00:53:01+09:00 追記

いろいろ問題がありました(またか……)。記事を修正し、新しくサンプルページ(prototype.jsをgzip圧縮して利用するテスト(Safari 対応版))を作りました。

ありがたや!

prototype.jsを10KBにする方法 : 亜細亜ノ蛾 は思っていた以上に反響(というかブクマ)があって、うれしい限り。

──といいたいところですが、なんというか、自分は return false ってなんスか? というひと(JavaScript 解ってない)なので、もうちょっと「それは違うよ」という批判記事が読みたいような。──スンマセンね、ツン照れというか天の邪鬼なので。

.htaccess をスマートに使う

そんな中で、今回はいいモン仕入れて来たよー、というハック(むしろ基本テク?)。

Accept-Encoding に gzip が含まれるときだけ gzip 圧縮された prototype.js.gz を、 含まれないときは prototype.js を返すようになる。

odz buffer – Apache で gzip 圧縮されたファイルを返す

さっそくやってみた

ほうほう、と JavaScript ファイルをぶっ込んであるディレクトリに下記を記述した .htaccess を置いてみた。

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz

odz buffer – Apache で gzip 圧縮されたファイルを返す

ディレクトリ内には prototype.js(gzip 圧縮なし) と prototype.js.gz(gzip 圧縮あり) があると思いねェ(ベベン!)。熱くほてった下記のコードでソイヤっと読み込みング。

<script type="text/javascript" src="prototype"></script>

──404 エラー。あれ? と思って id:odz さんの記事と Content Negotiation でリクエストに応じて gzip 圧縮ファイルを返すを読み直すと──ああ、Content Negotiation が働いていないのでした。MultiViews ってやつですよね。

ただ、ふと思いついて

<script type="text/javascript" src="prototype.js"></script>

と記述すると、上記の .htaccess のままで

  1. Accept-Encoding に gzip を含まない場合は prototype.js をそのまま読み込む
  2. Accept-Encoding に gzip が含まれ、prototype.js.gz が存在すれば prototype.js.gz を読み込む
  3. Accept-Encoding に gzip が含まれ、prototype.js.gz が無ければ prototype.js を読み込む

という、理想的な動きを! ktkr!!

シンジラレナーイ という人のために

Web-Sniffer で Accept-Encoding の状態によって返すファイルが変化するか確認してみましょう。

Accept-Encoding: gzip の有無 Content-Length (bytes)
Accept-Encoding: gzip 有りで prototype.js を読み込む 10437
Accept-Encoding: gzip 無しで prototype.js を読み込む 22583

この通り、同じ prototype.js にアクセスしても、状態によって gzip 圧縮してあるファイルを UA に渡しています。

ちなみに、.js.gz がない場合はこんな感じ。404 エラーになったりはしません。

Accept-Encoding: gzip の有無 Content-Length (bytes)
Accept-Encoding: gzip 有りで nifty.js を読み込む 4690
Accept-Encoding: gzip 無しで nifty.js を読み込む 4690

Safari 使いの反応求む!

ところで、今回の前提として、

Safari って Content-type: application/x-javascript 、 Content-Encoding: gzip にしておいても gzip 圧縮された JavaScriptソースを正しく扱えなかったりするんだろうか。

odz buffer – Apache で gzip 圧縮されたファイルを返す

という問題がまだ残っておりまして。

どう考えても「Safari が gzip 圧縮されたファイルを扱えない」わけは無いのですが、問題の焦点は「Safari が gzip 圧縮された JavaScript ファイルを扱えない」が true か false か──。

ブクマで好いからお返事待ってます> Safari 使いの皆様

この問題が解決すれば、「Safari には .js のファイルを 通信時に gzip 圧縮して渡す」と、ディ・モールトいい感じ。

2006-11-20T22:58:35+09:00 追記

オラオラの中の人、oscar さんから有り難いコメントをいただきました! 検証の結果、やっぱり Safari は「.js.gz な JavaScript ファイル」は処理できないみたいです。

ということで、.htaccess にちょっと一行追加。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !.*Safari.*
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz

UA を Safari にして JavaScript ファイルにアクセスすると、圧縮していないファイルを返すようになりました(Content-Length が 22583 bytes になっている)。メデタシ(──かな?)。


2006-11-26T00:55:23+09:00 追記

odz buffer – Safari と gzip 圧縮 JavaScriptユンサンの/???/YungSang’s: .jgz と .js.gz と Apache の設定を参考に、新しく下記の .htaccess ファイルとサンプルページを作りました。ありがとうございます!

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} !\.gz$
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule .+ %{REQUEST_URI}.gz
ForceType application/x-javascript
AddEncoding x-gzip .gz

prototype.jsをgzip圧縮して利用するテスト(Safari 対応版)から動作を確認してみてください(こんどこそ、おk?)。

ところで

今さらながら、gzip 圧縮するのは JavaScript に限らず、CSS や HTML でもいいわけで。デザインに凝ったサイトは CSS のファイルサイズが大きくなりがち。CSS も .css.gz なファイルを用意しておいて、上記の .htaccess で圧縮ファイルの方を渡すのがベネ! ──かもね。

コメント

  1. oscar より:

    会社のG4で試してみました。Safari1.3.2で。
    といっても、どうすれば確認できるのか実は良く解ってないんですが。
    Web-Snifferのリンク試せばいいのかな。
    User agentは自己申告だから、別にそのままでだいじょぶだよね?
    ちゃんとContent-Lengthが10437と22583になってますよ。
    なんか間違ってたら、指示してくれればやってみるヨン。

  2. asiamoth より:

    えっと、相変わらず分かりにくい文章で申し訳ない……。
    要するに、下記のテストページに Safari でアクセスして、ちゃんと「AJAX でテキストファイルを読み込み」できればおk、かと。
    http://asiamoth.com/sample/2006-11-16/prototype.gz-test.html
    読み込むファイルを prototype-1.4.0.gz に決め打ちしているのと、1.4.0 はわざと .js を用意していないので、「Safari で .gz な JavaScript を利用できるか」の検証になるかと。──思ったけど、「バージョン●●だとできない」な気がするなぁ……。

  3. oscar より:

    あぁ、やっぱり外してましたか。
    それで、やっぱりSafariくんは、圧縮ファイル処理できませんでした。一応元の非圧縮ファイルのありかで、Ajax自体に問題ないのは確認しました。
    ところで、コメント後のあのメッセージはなに?

  4. asiamoth より:

    おお、情報がそろった! 白発中ツモった! (でも誰かに上がられた!)
    ということで、「ブラウザが gzip 圧縮に対応していない」か「Safari」の場合は圧縮していないファイルを返す──が無難ですね。ありがとうございます!!
    あと、コメント後におかしな状態になりますね。最近、自分ではいじってないのですが、ちょっと見ておきます(本当に誰かに改竄されていたりして)。

  5. mtrt より:

    こんにちは。
    Safariでも、「(ブラウザから見える)拡張子を js に、 Content-type を application/x-javascript にして」おけば、圧縮しているファイルも処理できることがわかりました。id:odzさんの日記のコメント欄で議論しましたので、そちらをご覧ください。
    http://d.hatena.ne.jp/odz/20061120/1164089177#c

  6. oscar より:

    Safari対応版で確認しました。おけです!