SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CoffeeScriptによるモダンなWebアプリケーション開発

CoffeeScriptベストプラクティス集
ブラウザ向けJavaScript編(2)

CoffeeScriptによるモダンなWebアプリケーション開発 第8回

  • X ポスト
  • このエントリーをはてなブックマークに追加

パフォーマンス向上のためのテクニック

リクエスト数を減らす

 ページのロード処理で一番ボトルネックになりやすいのはネットワーク通信です。ページから読み込む外部CSSや外部JavaScriptのファイル数に比例してリクエスト数は多くなり、ページのロードが完了するまでにかかる時間も長くなります。

 分割しておく必要のないJavaScriptやCSSファイルを1つのファイルに結合したり、後述するように画像をCSSスプライト化することでリクエスト数を減らすことができます。

JavaScriptやCSSを外部ファイル化する

 リクエスト数を減らしたほうがよいとはいえ、JavaScriptやCSSはHTMLに埋め込むよりも外部ファイルにしておくほうが望ましいです。HTMLは比較的頻繁にコンテンツが更新されるので、更新のたびにページ全体を新しく読み込む必要があります。比較的更新頻度の低いJavaScriptやCSSは、HTMLが更新されても新しく読み込み直す必要はない場合が多く、外部ファイル化しておけば以前ブラウザに読み込まれた時のキャッシュを使うことができます。HTMLにJavaScriptやCSSを埋め込んでしまうと、そのようなキャッシュの使い方はできなくなります。

 Webサイトを最適化した状態の一例として、HTMLファイル1つ、JavaScriptを結合したファイル1つ、CSSを結合したファイル1つ、画像をCSSスプライト用に結合したファイル1つ、という合計4つのファイルで構成することができます。この場合、更新されたファイルだけを読み込み直せば残りの3ファイルについてはキャッシュを利用できます。

CSSスプライト

 CSSスプライトは、複数の細かな画像をまとめて一つの大きな画像を作り、それをCSSで分割して表示する手法です。複数の画像を1ファイルにまとめることでリクエスト数を減らせるためページのロードを高速化できます。ブラウザ側でCSSを使って画像を部分的に切り取って表示することにより、異なる画像ファイルを個々に表示するのと同じ見た目を実現できます。

図2 Googleが使用しているCSSスプライト用の画像(出典
図2 Googleが使用しているCSSスプライト用の画像

 CSSスプライトによるもう一つのメリットとして、マウスオーバー時の画像を事前にロードできるという点があります。マウスオーバー時に表示する画像をマウスオーバーしてから読み込むと、画像を新たにダウンロードする必要があるため表示が変わるまでにタイムラグが生じます。この現象を回避するにはJavaScriptで事前にロードしておく手法もありますが、CSSスプライトを使えばそのようなテクニックは必要ありません。ボタンの通常時の画像とマウスオーバー時の画像をひとまとめにしてCSSスプライトで表示すれば、タイムラグを生じさせることなく画像を切り替えられます。

 注意点としては、極端に縦横サイズが大きい画像を作らないようにしてください。スプライト化した画像の一辺が数千ピクセルを超えるほどになると、その画像を表示するのにブラウザがメモリを極めて多く消費するようになります。したがって、元となる画像自体がある程度の縦横サイズのあるものならば、わざわざスプライトを作成するメリットはあまりありません。アイコンやボタンなど、お互いに関連した小さな画像を一枚のスプライトにまとめると高い効果が得られます。

 1つの画像を変更するたびに画像を合成し直す必要があるためメンテナンスのコストが増えますが、Compassというツールを使うと画像やCSSの作成を自動化できます。また、Web上でCSSスプライトを作成できる無料のサービスもあります。

パーツのロードを遅らせる

 ページ本体に直接関係のない補助的なコンテンツをAjaxで後から部分的にロードするようにすると、最初のコンテンツが描画されるまでの時間を短縮できます。

 ページのメインコンテンツはページが最初に描画された時点で表示されているのがベストですが、サイドバーなどはユーザーがコンテンツを読んでいる間に読み込みを開始してもさほど差し支えない場合があります。ユーザーの体感速度を上げるには、最初にロードすべき部分と、遅れてロードしてもよい部分とにコンテンツを分けて、遅れてロードしてもよい部分はAjaxで後から部分的に読み込むようにします。ただし、このような構成を取るとプログラムが複雑になり、またAjaxでロードされるコンテンツは検索エンジンから認識されにくいといったデメリットもあるので総合的に判断してください。

画像のサイズを削減する

 PNGやJPEGの画像は、ファイルに含まれる不要なコンテンツを削除することで見た目を劣化させずにファイルサイズを削減できます。

Macを含むUNIX環境で使用できるコマンドラインツール

 MacやLinuxを含むUNIXライクなOSではコマンドラインで最適化処理を行うことができます。それ以外のプラットフォームで実行する方法については後述します。

PNGの最適化

 PNGファイルを最適化するにはpngcrushというツールを使います。

インストール

 ここからpngcrushの最新のソースコードをダウンロードします。ターミナルを開き、ファイルをダウンロードしたディレクトリに移動します。次のコマンドを実行してコンパイルします。

$ tar zxvf pngcrush-1.7.27.tar.gz
$ cd pngcrush-1.7.27
$ make

 makeコマンドが完了するとpngcrushという実行ファイルができるので、/usr/local/bin/などPATHが通っているディレクトリにコピーします。

pngcrushの使い方

 before.pngというファイルを最適化してafter.pngを出力するには次のようにコマンドを実行します。

$ pngcrush -rem alla -reduce -brute before.png after.png

 たくさんのファイルをまとめて処理したい場合、カレントディレクトリのすべての*.pngファイルを最適化して上書きするには次のコマンドを実行します。

$ for i in *.png; do tmp="${i%.png}-crush.png"; pngcrush -rem alla -reduce -brute "$i" "$tmp" && /bin/mv "$tmp" "$i"; done

JPEGの最適化

 JPEGファイルを最適化するにはjpegtranというツールを使います。

インストール

 サイトからソースコードをダウンロードします。ダウンロードするファイル名は jpegsrc.v8d.tar.gz か、なければ同様の最新バージョンのものを選んでください。

 ターミナルを開き、ファイルをダウンロードしたディレクトリに移動します。次のコマンドを実行してコンパイルとインストールを行います。

$ tar zxvf jpegsrc.v8d.tar.gz
$ cd jpeg-8d
$ ./configure
$ make
$ make install  (適切な権限で実行する)
jpegtranの使い方

 before.jpgというファイルを最適化してafter.jpgを出力するには次のようにコマンドを実行します。

$ jpegtran -copy none -optimize -outfile after.jpg before.jpg

 たくさんのファイルをまとめて処理したい場合、カレントディレクトリのすべての*.jpgファイルを最適化して上書きするには次のコマンドを実行します。

$ for i in *.jpg; do jpegtran -copy none -optimize -outfile "$i" "$i"; done

その他のツール

 PNGやJPEG画像の最適化ツールとして、Mac向けにImageOptimというGUIのフリーソフトウェアがあります。また、どのOSでも使えるオンラインの無料ツールとしてはSmush.itがあります。

次のページ
外部JavaScriptの文字コード

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
CoffeeScriptによるモダンなWebアプリケーション開発連載記事一覧

もっと読む

この記事の著者

飯塚 直(イイヅカ ナオ)

1984年東京都生まれ。 高校時代に趣味でPerlやJavaを使ってプログラミングを始める。 慶応大学湘南藤沢キャンパス卒業後、共同通信社にてニュースサイトの開発などを担当。 その後、面白法人カヤックにてソーシャルゲームの開発などを手がける。 2012年現在、カヤックを退社し個人として活動し...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6536 2012/05/11 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング