亜細亜ノ蛾 - Weblog

[SiteSearch Google]

November 19, 2006

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

[ad]

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

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

ありがたや!

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

──といいたいところですが、なんというか、自分は 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 で圧縮ファイルの方を渡すのがベネ! ──かもね。

Google Adsense

 

Related Posts with Thumbnails

コメント

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

なんか間違ってたら、指示してくれればやってみるヨン。

えっと、相変わらず分かりにくい文章で申し訳ない……。

要するに、下記のテストページに 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 を利用できるか」の検証になるかと。──思ったけど、「バージョン●●だとできない」な気がするなぁ……。

あぁ、やっぱり外してましたか。
それで、やっぱりSafariくんは、圧縮ファイル処理できませんでした。一応元の非圧縮ファイルのありかで、Ajax自体に問題ないのは確認しました。

ところで、コメント後のあのメッセージはなに?

おお、情報がそろった! 白発中ツモった! (でも誰かに上がられた!)

ということで、「ブラウザが gzip 圧縮に対応していない」か「Safari」の場合は圧縮していないファイルを返す──が無難ですね。ありがとうございます!!

あと、コメント後におかしな状態になりますね。最近、自分ではいじってないのですが、ちょっと見ておきます(本当に誰かに改竄されていたりして)。

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

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

過去の記事

カテゴリィ一覧
  1. その他
    1. 食・健康・生活
  2. ウェブデザイン・文章
    1. Movable Type
  3. ウェブ上で見つけたページ
  4. コンピュータ・エレクトロニクス
    1. PC
      1. Firefox
    2. カメラ・デジタルカメラ
  5. マンガ・アニメ・ゲーム
    1. エヴァンゲリオン/ ヱヴァンゲリヲン
    2. マンガ
      1. DEATH NOTE
      2. HUNTER×HUNTER
      3. SKET DANCE
      4. バクマン。
  6. 本・音楽・映画・TV
    1. 映画