2018.01.15 就活
Webパフォーマンスの基礎知識と絶対に欠かせない施策

◆ はじめに


皆様、あけましておめでとうございます。

エンジニア就活生を応援するメディア「Career Tech」です。

2018年も皆様のお役に立てる記事を配信していきたいと思っておりますのでどうぞ今年も宜しくお願い致します。

それでは本年、一発目の記事に参りましょう!

最初のテーマ、それは「Webパフォーマンス」と呼ばれる分野についてです。

実はこのWebパフォーマンス、近年動向が注目される分野の一つであり、昨年は相次いで「Webパフォーマンス」だけで2冊出版されるほどの勢いがありました。

今回は、特にフロントエンドエンジニアを目指す人には是非ともチェックしていただきたいと思います。理由は後述しますが、実はフロントエンドがWebパフォーマンスにおいて重要な部分を占めるからです。

それではそもそも、Webパフォーマンスとはなにか?そしてなぜ重要なのか?といった基礎知識を、知っている方もおられるかもしれませんがおさらいしたいと思います。



◆ Webパフォーマンスの基礎知識

Image by Unsplash


そもそも「Webパフォーマンス」とは?

そもそも「Webパフォーマンス」とはいったいどういったものを指すのでしょうか?

Webパフォーマンスは具体的にWebの2つの速度を速めることを意味します。

一つ目はページロードの速度について。これはページロードを速めることで、ローディングする時間をなるべく少なくすることです。二つ目はランタイムの速度です。例えばWebアプリの場合、UIを操作してレスポンスまでの時間を意味します。これらの2つの速度を速めることが「Webパフォーマンス」の向上につながるのです。



なぜ「Webパフォーマンス」が重要なのか?

本当にWebページを高速化することは重要なのでしょうか?

日本でもトップクラスのUXデザイナーである深津氏は、速度についてこのようにツイートしています。

このツイートでは冗談のように「0.1秒遅くなると-1%の損失」と書いてありますが、実際にMicrosoftとGoogleの共同研究によると、1ユーザーあたりの売上が0.5秒の遅延で-1.2%、1.0秒の遅延で-2.8%、2.0秒の遅延で-4.3%と、売上に直結することが分かっています。ECサイトでは0.1秒でも早くすることが売上を上げることの要因の一つであることは、もはや常識のように語られています。

それだけに、パフォーマンスはWebに依存したビジネスでは重要視されるわけです。

特に現代においては、PCと比べると非力なタブレットやスマートフォンなどのユーザーが使用するデバイスが多様化し、また、MVNOや電波の不安定さなどの要因でモバイルによる低速回線からのアクセスが増えています。

さらにはWebコンテンツ自体もリッチ化し、より多様なWebの表現が生まれています。

そうした背景も踏まえると、パフォーマンスの重要性は今後ますます高まることでしょう。



なぜパフォーマンス改善がフロントエンドなのか?

皆さんの中には、「Webパフォーマンス」を改善するのはサーバーサイドの役割なのではと考える人も中にはいらっしゃるのではないでしょうか?

確かにサーバーサイドでもパフォーマンスに貢献することは可能です。

しかし、フロントエンドからのパフォーマンス改善に匹敵するほどの効果は得られません。

またフロントエンドを疎かにすると、サーバーサイド側の施策を台無しにしてしまいます。

また、お馴染みのO’reilly Booksなどでパフォーマンスの書籍を多数出版しているSteve Sounder氏の話によると、エンドユーザーに対しての遅延の80%〜90%はフロントエンド側で発生しており、サーバーサイドではなくフロントエンドからの改善を重要視すべきと主張しています。特にリソースをフロントエンドから取得する際に起こるデータローディングでの遅延はフロントエンドでの対処により大幅に改善することが出来ます。

まとめますと、フロントエンドにおいてデータのローディングスピードに対していくつかの施策を取ることで、大幅に遅延を改善することが出来る可能性があるわけです。



◆絶対に行いたいパフォーマンス計測


Image by Cristian Baron on Unsplash


さて、上記の基礎知識をおさらいしたところで、それらに照らし合わせてパフォーマンスの改善方法をお伝えしたいと思います。



パフォーマンスを改善する際のマインドについて

まず初めに書いておきたいことがあります。それはソフトウェア開発でもよく言われる原則の一つでもある、「Mesure, Don’t Guess (計測しろ、推測するな)」という言葉です。

そもそも現状、パフォーマンスが良いかどうか分からない中でパフォーマンス改善策に取り組み、やったつもりになってしまったりパフォーマンスが悪いという状況で、ただやみくもに良さそうな解決策に取り組むことは、最終的に無駄な巻戻り工数を発生させることや、メンテナンス性を大きく損ねることにつながりかねません。

まずは自分のどの部分が悪いのかといったことを把握し、そこから目的が明確な改善策を選択することで改善に取り組むべきです。可能であればどの施策がどれぐらいの影響を与えたかのログを取り、また、定常的にパフォーマンスをテストできる環境を整えることがベストです。



基本的なパフォーマンスの計測方法

専門的にWebサイトのパフォーマンスをチューニングする際、GoogleChromeに搭載されている開発者ツールを使用するのが良いでしょう。

「Network」パネルや「Performance」パネルでは、パフォーマンスの現状を示す多くの情報を得ることが出来ます。


しかし、今回はより簡易的に利用することが出来るパフォーマンス計測ツールの「Page Speed Insights (以下、PSI)」を紹介したいと思います。PSIは、Googleが提供するWebページの速度を測定しパフォーマンススコアを算定、改善すべき項目を表示してくれるという無料ながら非常に優秀なツールです。基本的なパフォーマンスの改善は、このPSIを指針に行うことが推奨されます。スコアを100にすることは非常に難しいのですが、それでも100に近づける姿勢を忘れてはいけません。


使い方は非常に簡単で、Page Speed Insightsのページにアクセスし、パフォーマンスを計測したいページのURLを入力するだけ。


すると診断結果が表示され、具体的に取るべき施策が表示されます。


他にも、昨年からGoogle Chromeの開発者ツールに搭載された「Audits」パネルも簡単に扱えて、かつ本格的な測定が可能です。AuditsパネルはGoogleのOSSのひとつであるLighthouse」という評価の高いWebパフォーマンス測定ツールの技術を流用しています。

Image by Lighthouseでwebサイトのパフォーマンスを計測する - Qiita


通常の状態では開発ツールの「>>」ボタンに隠れているためそこから表示して下さい。

「Perform an audit...」ボタンを押すと、パフォーマンスの測定が開始されます。

Image by Lighthouseでwebサイトのパフォーマンスを計測する - Qiita


このように色々なページについてのパフォーマンスの指標が表示され、結果が表示されるだけでなく、改善策も提案してくれます。指標は細分化されているため、ここでは説明を省略しますが、詳しく知りたい方はこちらのQiitaにまとまっておりますので、こちらを参照ください。


参考リンク:

Lighthouseでwebサイトのパフォーマンスを計測する - Qiita


PSIもAuditsも、ウェブ上に公開されているものを計測対象とするためPSIの場合は「psi-local」というローカル環境専用のソフトをインストールし、コマンドラインから実行する必要があります。Auditsの場合は、ローカルホストを立ち上げ、サイトを確認することで、普段通りにブラウザから使用することが出来ます。


◆現場で頻出!本質的な改善方法とは?


パフォーマンスを上げるためには、前述の通り、計測した結果を見てどういった遅延が起きているかを見ることで改善策を立てることが必要で一概にどの施策が良いのかと言った話をすることは出来ません。

ただし、現場でよく使われる改善施策は存在します。それは以下の施策です。

1、画像を最適化する。

2、HTML/CSS/JSを圧縮する。


これら2つの施策の共通点としては、最適化することで同じ品質のサイトでもダウンロードしてくるリソースのサイズが小さくなるという点です。まさにWebパフォーマンスを改善する上での最初の一歩とも言えるでしょう。

これらの施策について、そもそもなぜ行うべきなのか、本質的な部分にフォーカスしながら、具体的な改善方法も含めて見ていきたいと思います。


◆1、画像を最適化する


最適化された画像とは?

そもそも理想的な画像とは一体どういったものでしょうか?

それは「意図する表現を、可能な限り最小化されたデータ量で表現したもの」です。

例えば、ひと目見ただけでは違いの分からない写真があったとして、一方は3MBで、もう一方は300KBとします。

当たり前に思うかもしれませんが、そうしたケースでは300KBの画像を採用すべきです。

なぜならばデータをダウンロードする際のデータ量が小さくなり、表示速度が上がるだけでなく、ページを表示する際のブラウザの処理も軽くなるため、結果的に二重の意味でページが高速化されるからです。


これらの最適化が行われていない場合にパフォーマンスが落ちてしまう現象を皆さん見たことがあると思います。

スマホなどから低速通信を行った際に、画像が上から徐々に表示されるという経験をした人も多いと思いますが、あれはスマホの低速回線に対して最適化されていない画像が使用されているため、ダウンロードが遅くなり、まさにパフォーマンスが落ちている状態です。


では、現場ではどのようにして画像を最適化しているのでしょうか?

実際の施策について見ていきましょう。



画像を最適化する方法【その一・画像形式編】

皆さんはどのような画像ファイルの形式をご存知でしょうか?

Webでメジャーな画像形式はJPEG、PNG、GIF、SVGなどの形式でしょう。

全て画像を表示するための形式ですが、それぞれ得意な領域が違っており、イメージの種類によって現場では使い分けられています。

例えばJPEGは写真の表示に優れた形式であり、写真のイメージファイルはJPEG形式に変換することでサイズを小さく出来る傾向があります。

それぞれ特徴を知ることで最適な形式に変換し、サイズを最小化してみましょう。


まずはJPEG形式です。この形式は、優れた圧縮アルゴリズムによりドットのカラーを人には判別出来ないレベルの近い色に置き換えるためほとんど劣化していないように見える画像であっても、ファイルサイズを劇的に減らすことが出来る点が特徴的でWebで写真を小さなファイルサイズで表示させる場合に適しています。

しかしながら、アイコンや文字の入った説明用画像に使うとボケてしまう欠点があります。


次にPNG形式です。PNG形式は写真からアイコンまで幅広く使用される形式で、特徴としては透過を半透明も含めて自由に使用できる点です。

全ての種類のイメージに対して汎用的に適しており、画質としては綺麗ですが、その分サイズが大きくなる傾向があります。

そのため前にも述べたとおり、写真の圧縮に関してはJPEG形式が適しているためJPEGの苦手な部分である、アイコンや文字イメージによく使われます。


そして、GIF形式です。Twitterなどで動く画像を見たことはありませんか?

あのアニメーション画像は総じてGIF形式で制作されています。

特徴の一つとしては、そのアニメーションが使えるという点。

もう一つは1980年代から開発されているため、そのころの低速な回線でも使用できるように設計されていることに由来する画像サイズの小ささです。

ただし、サイズが小さくするため256色しか扱えず、あまり多彩な表現は出来ません。

また透過を使用できますが、PNG等は半透明なども扱えるのに対しGIFは不透明か完全な透明の2つの状態しか扱うことが出来ません。

そのため、単色のロゴやシンプルなボタンの画像などに使用されることが多いようです。


最後にSVG形式です。今まで紹介した3つの画像形式と明確に違う点としてベクター形式という画像形式であることが挙げられます。

下の画像を見てみてください。左側がさきほどまで説明していたJPEG、PNG、GIF等を拡大した際の表示です。これら3つはビットマップ形式と呼ばれ、多くのドットが集合し画像となっています。しかし、今回紹介するSVG形式は右側の画像のように「点と線」によって描かれます。この手法をベクター形式と言います。

Image by キャラクターをアニメーションさせる1


単純な話、半径10cmの円を描く時に、点をいっぱい打って描くのがビットマップに対し、円を書いて塗りつぶす描き方をするのがベクターです。

単純な図形や文字などを画像にするケースではSVG形式の方がサイズ的に優れているだけでなく、点と線での描画のため、画質という概念がなくどれだけ拡大してもイメージが荒れることはありません。

また透過やアニメーション、CSSの指定によるカラーの変更などにも対応しています。

なぜこれだけ豊富な機能を有しているにも関わらず、あまりメジャーでないかと言うとブラウザが近年、対応を発表したばかりという背景があり、まだまだ他の画像形式と比べるとWeb業界的には新しい形式だからです。

SVGの弱点としては、複雑なイラストや写真に関しては複雑性が増すほど、点と線が多くなるためサイズが肥大化する可能性があるため、サイズには注意が必要です。

また、現状ではメジャーなブラウザのバージョンでは対応していますがAndroid2.3以下・IE8以下などのレガシーブラウザでは表示されない場合もあるのでこちらも注意が必要です。

Image by SVG | Can I use…


つまり、現状のベストプラクティスとして写真を使う場合はJPEG形式を、会社のメインロゴなど重要なロゴの場合はSVG形式を、イラストや文字を使用した画像はPNG形式を、単色や透過などでサイズをできるだけ小さくしたいパーツはGIFを、それぞれおすすめします。

画像の最適化にはこれらの形式の使い分けが必要です。


画像を最適化する方法【その二・圧縮編】

画像形式を最適化したところで、次にWebに合うように圧縮していきます。

まずはファイルサイズを小さくするために、画像をリサイズする必要性があります。

例えば横幅が3000pxの画像と1000pxの画像では、後者のほうがファイルサイズが小さくなるのは当たり前の話ですよね。

一般的にWeb向けイメージの場合、800〜1000pxの横幅になるのが理想と言われています。

またリサイズに関しては、Macの場合、標準ソフトのプレビューから行うことが出来ます。

プレビュー>ツール>サイズを調整 を選択すると、リサイズウィンドウが開きますので、リサイズしてみてください。

リサイズ後のファイルサイズも表示されるので便利ですね!

画像サイズを最適化したところで、ソフトによる圧縮もご紹介したいと思います。

ソフトによる圧縮方法としては、JPEGminiというソフトが有名です。

有料サービスにはなりますが、ブラウザ上で無料で試すことが出来ます。

以下の画像はオリジナル画像から1/6まで圧縮した画像の例になります。

ちょっと見ただけでは、比較した際の差異を全く気づけませんよね!

またMacアプリはImageOptimというフリーソフトもオススメです。

ウィンドウにドラッグ&ドロップするだけで変換が開始されるだけでなく、jpeg、png、gifなどの多くの画像形式に対応しているため、入れておいて損はないアプリのひとつです。

こちらのサイトから無料でダウンロード出来ます。


他には、Node.js製のパッケージに「imagemin」というものがあります。

`npm install -g imagemin`

からグローバルインストールし、npmで通常通り

`npm install -D imagemin-cli`

と入力し「imagemin-cli」というパッケージをインストールすることで、コマンドラインから使用し、画像を圧縮できます。各形式で追加すべきプラグインが変わってくるため、それぞれの画像あ形式でオススメのimageminプラグインを挙げておきます。


・JPEG圧縮用プラグイン「imagemin-mozjpeg

・PNG圧縮用プラグイン「imagemin-pngquant

・GIF圧縮用プラグイン「imagemin-gifsicle

・SVG圧縮用プラグイン「imagemin-svgo


こちら全てのプラグインを一括でインストール出来るコピペ用コマンドはこちら。

`npm install -D imagemin-mozjpeg imagemin-pngquant imagemin-gifsicle imagemin-svgo`


また、これらのプラグインをgulp等のタスクランナーで使用することで

ビルドプロセスに組み込むことも出来ます。一度設定してしまえば、自動的に適用され高速化を実現できますのでぜひ試してみてください。



◆2、HTML/CSS/JSを圧縮する。


コードの圧縮とは?

コードの圧縮について、ご存じない方は驚くかもしれませんが、実はHTML/CSS/JSは圧縮(minify化)することが出来ます。

一般的にHTMLやCSS、JSのファイルはコーディング時に可読性を高めるため改行や空白、インデントをつけますよね?実はこれらの改行コードや空白についてもファイルサイズに影響してしまうのです。Webパフォーマンス分野では、ファイルサイズは小さければ小さいほど高速化するとされます。

そのため、コードをデプロイする前に、一度これらの改行や空白、インデントをコードに影響を与えない範囲内で、削除することでファイルサイズを小さくしより良いパフォーマンスにつなげる必要があります。

もちろん、一枚のLPのような小規模サイトではあまり影響はないかもしれませんが大規模プロジェクトになればなるほど効果が生まれる施策でしょう。



具体的な圧縮方法について


PSIでパフォーマンスを測定する際に、圧縮をしていないコードを検知すると圧縮ファイルを自動生成してくれるため、それらのファイルをダウンロードの後に、再度アップロードすることで対応することが出来ます。

ただ、前述の画像の圧縮と同じように、ビルドプロセスに組み込むことも可能です。

こちらでもオススメのNode.js製パッケージを、テキストソースごとにご紹介します。


・HTML圧縮用プラグイン「html-minifier

・CSS圧縮用プラグイン「clean-css

・JS圧縮用プラグイン「uglify-es


こちらのプラグインを一括でインストール出来るコピペ用コマンドはこちら。

`npm install -D html-minify clean-css uglify-es`



◆まとめ


いかがだったでしょうか?

ハイパフォーマンスWebサイト」や「続・ハイパフォーマンスWebサイト」が

それぞれオライリーから2008年・2010年に発売されて以来、Webパフォーマンスに関する書籍は出版されてきませんでした。

しかし、2017年には相次いでWebフロントエンド ハイパフォーマンス チューニング」、超速! Webページ速度改善ガイド|WEB+DB PRESS plus」が出版され、フロントエンド領域でのWebパフォーマンスについて、業界内から注目が集まっています。


また、表示速度をさらに向上させる「AMP」といった技術やネットワーク処理でのネックを取り除く、「Service Worker」等を複合させたProgressive Web App」といった新しい技術をGoogleが推進しており、ますますフロントエンドの領域が広がっています。

そしてこの流れは今年だけでなくこれからのフロントエンドのトレンドとなることは間違いないでしょう。

この記事をここまで読んでいただいたフロントエンド領域を志す学生の皆さんはまさにこれからの時代を生きるエンジニアです。

就活において技術的なスキル差をつけるためだけにかぎらず、エンジニアとしてのキャリアの歩みを進めていく中で、今回ご紹介したWebパフォーマンスを強く意識することで、より品質の高い、ワンランク上のプロダクトを世界に提供してほしいと心から願っております。

以上、「Webパフォーマンスの基礎知識と絶対に欠かせない施策を総まとめ」でした!


参考図書:超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)


※2018/12/12 追記

AMP対応が正常に完了しているのかを確認するためのAMP確認ツールを利用すると良いと教えていただきました。