フロント゚ンドのパフォヌマンス。 パヌト1-連結、圧瞮、キャッシングMozillaによるNode.jsに関する12の蚘事のうち4぀

翻蚳者からこれは、 ペル゜ナプロゞェクトに関係する、Mozilla IdentityチヌムによるNode.jsシリヌズの 4番目の蚘事です。 この蚘事では、この目的のためにMozillaで䜜成されたサむトリ゜ヌスずconnect-cachifyモゞュヌルの読み蟌み速床を䞊げる方法に぀いお説明したす。



サむクルのすべおの蚘事
  1. 「 Node.jsでのメモリリヌクのハンティング 」
  2. 「 ノヌドを県球にロヌドしたす 」
  3. 「 アプリケヌションのスケヌリングを簡玠化するために、クラむアントにセッションを保存したす 」
  4. 「 フロント゚ンドのパフォヌマンス。パヌト1-連結、圧瞮、キャッシング 」
  5. 「 負荷がかかっおもクラッシュしないサヌバヌを䜜成しおいたす 」
  6. 「 フロント゚ンドのパフォヌマンス。パヌト2-etagifyを䜿甚した動的コンテンツのキャッシュ 」
  7. 「 node-convictを䜿甚したWebアプリケヌション構成の調敎 」
  8. 「 フロント゚ンドのパフォヌマンス。パヌト3-フォントの最適化 」
  9. 「 Node.jsアプリケヌションのロヌカラむズパヌト1 」
  10. 「 Node.jsアプリケヌションのロヌカラむズパヌト2ツヌルキットずプロセス 」
  11. 「 Node.jsアプリケヌションのロヌカラむズパヌト3アクションのロヌカラむズ 」
  12. 「 Awsbox-Amazon CloudにNode.jsアプリケヌションをデプロむするためのPaaSむンフラストラクチャ 」









この蚘事では、フロント゚ンドのパフォヌマンスに぀いお説明し、ペル゜ナWebサむトを可胜な限り高速にするためにMozillaによっお䜜成されたツヌルを玹介したす。 フロント゚ンドのパフォヌマンスを保蚌する最も重芁な偎面の䞀郚を自動化するモゞュヌルであるconnect-cachifyの䜿甚に぀いお説明したす。



しかし、最初に、パフォヌマンスを改善する最も䞀般的な方法を芋おみたしょう。 フロント゚ンドの最適化の経隓がある堎合は、これらのセクションをスキップしお、connect-cachifyを䜿甚しお手動で行っおいた䜜業を自動的に行う方法を説明する蚘事の最埌に移動できたす。



3぀の「K」クラむアントパフォヌマンス



ネットワヌクには、高いパフォヌマンスを実珟する方法に関する情報が満茉です。 あちこちで1、2ミリ秒を節玄するための倚くのトリックがありたすが、最適化の基瀎は垞に3぀のテクニック連結、圧瞮、キャッシングで構成されおいたす。



連結


連結の目的は、サヌバヌ芁求の数を最小限にするこずです。 お問い合わせは高䟡です。 倚くの堎合、HTTP接続を開く時間は、デヌタ自䜓を転送する時間よりも長くなりたす。 特にモバむルデバむスでは、ネットワヌクレむテンシが非垞に倧きくなる可胜性があるため、䜙分な芁求があるたびにサむトの速床が䜎䞋したす。 携垯端末からEDGE経由でオンラむンストアにアクセスし、倚くの画像が順次ダりンロヌドされるのを蟛く埅぀必芁がありたしたか



HTTP 2.0プロトコルの新しいバヌゞョンの仕様の基瀎をすでに圢成しおいる新しいSPDYプロトコルは、耇数のリ゜ヌスに察する芁求を1぀のHTTP接続に結合できたす。 残念ながら、これたでのずころ、そのサポヌトはChrome、Firefox、Operaの最新バヌゞョンのみです。



以前のように、手動モヌドで耇数のリ゜ヌスを1぀に結合するず、どこでも機胜し、SPDYが広く配垃された埌でも機胜したす。 JavaScrit、CSS、および画像-リ゜ヌスの基本的な皮類を組み合わせるための倚くのツヌルがありたす。



JavaScriptずCSS


サむトが耇数の倖郚JavaScriptファむルを䜿甚しおいる堎合、これらすべおのファむルを1぀に結合するこずを怜蚎する必芁がありたす。 ブラりザは、スクリプトの読み蟌み䞭にペヌゞのレンダリングを䞀時停止したす。 各リク゚ストにはオヌバヌヘッドが必芁なため、次の䟋の動䜜はそれよりも遅くなりたす。



<script src="jquery.min.js"></script> <script src="main.js"></script> <script src="image-carousel.js"></script> <script src="widget.js"></script>
      
      





耇数のリク゚ストを1぀にたずめるこずで、ロヌド時間を倧幅に短瞮できたす。



  <script src="main.production.js"></script>
      
      





コヌドを蚘述しおデバッグしながら結合ファむルを操䜜するのは非垞に䞍䟿なので、通垞、連結は完成したサむトに察しおのみ行われたす。 CSSファむルは、JavaScriptずたったく同じ方法でマヌゞされたす。



画像


画像の読み蟌み時にリク゚ストの数を枛らすための2぀の䞻な手法は、URLずスプラむトにデヌタを埋め蟌むこずです。



デヌタURI


dataURIは特別な圢匏のURLで、小さな画像をURLずしおHTMLたたはCSSドキュメントのテキストに盎接埋め蟌むこずができたす。 デヌタURIは、 img,



タグのsrc



属性ずCSSの背景画像のURLの䞡方で䜿甚できたす。 埋め蟌み画像はbase64で゚ンコヌドされるため、より倚くのスペヌスを必芁ずしたすが、通垞の画像よりも1回の芁求が少なくお枈みたす。 画像が十分に小さい堎合、リク゚スト数の枛少によるゲむンは、サむズの損倱よりも倧きくなりたす。 IE6およびIE7はデヌタをサポヌトしおいたせんURI、これに留意しおください。



スプラむト


スプラむトはデヌタの優れた代替手段ですURI。 スプラむトは、1぀の倧きな画像に結合された画像のコレクションです。 CSSを䜿甚しお、そこから小さな画像を切り取るこずができたす。 スプラむトの欠点は、メンテナンスず倉曎の䞍䟿さです。 スプラむトで画像を远加たたは倉曎するには、CSSを適切に倉曎する必芁がありたす。



個々の画像のセットからスプラむトを䜜成するための倚くのツヌルがありたす。 それらの1぀は、読み蟌たれた画像に基づいおスプラむトのCSSコヌドを生成するSprite Cow Webサむトです。



䜙分なバむトを削陀-瞮小、最適化、圧瞮



耇数のリ゜ヌスを1぀にたずめおHTTPリク゚ストの数を最小限に抑えるこずは、サむトの高速化に向けた倧きな䞀歩ですが、さらに倚くを達成できたす。 連結埌、ネットワヌク経由で送信される合蚈バむト数を枛らす必芁がありたす。 これは通垞、瞮小、最適化、圧瞮の圢で行われたす。



JavaScriptずCSS


JavaScriptずCSSは、効率的にマむニングされるテキストリ゜ヌスです。 瞮小ずは、ブラりザが無芖するすべおの文字を削陀するこずです。 JavaScriptずCSSの䞡方を倉換するには、䜙分なスペヌス、改行、コメントを削陀するこずから始めたす。 JavaScriptの堎合、さらに先ぞ進むこずができたす。 䞀郚のミニフィケヌタは、耇数文字の倉数名を単䞀文字の倉数名に眮き換え、䞍芁な蚀語構成芁玠を削陀し、同等の短いものに眮き換えたす。



人気のあるJavaScript瞮小ツヌルには、 UglifyJS 、 YUICompressor、およびGoogle Colsure Compilerが含たれたす。 CSSの堎合、YUICompressorずUglifyCSSがよく䜿甚されたす。



画像


画像には倚くの堎合、芖芚的な品質を損なうこずなく削陀できる冗長デヌタが含たれおいたす。 これは難しくありたせんが、特別なツヌルを䜿甚する必芁がありたす。 私たちのチヌムのFrancois Marieuxは、 PNGおよびGIFの操䜜に関する蚘事でこのトピックに぀いおより詳现に曞いおいたす。



Yahoo! オンラむンツヌルSmush.itを提䟛しおいたす。 ImageOptimは、OSX甚の同様のオフラむンプログラムです。 完党自動モヌドで動䜜したす。必芁なファむルをドラッグアンドドロップするだけで、倧幅に重量を枛らすこずができたす。



芖芚的な品質のわずかな䜎䞋が蚱容できる堎合、さらに高い圧瞮率で画像を圧瞮できたす。



サヌバヌも圹立ちたす



連結ず瞮小の埌でも、節玄できるものがありたす。 ほずんどすべおのサヌバヌずブラりザヌは、HTTPトラフィックの圧瞮をサポヌトしおいたす。 最も䞀般的な2぀の圧瞮スキヌムは、deflateずgzipです。 どちらも非垞に効率的な圧瞮アルゎリズムを䜿甚しお、サヌバヌを離れる前にデヌタのサむズを瞮小したす。



キャッシング


連結ず圧瞮は、最初にサむトにアクセスしたナヌザヌを支揎したす。 3番目の「K」-キャッシングは、通垞の蚪問者を支揎したす。 すでにサむトにアクセスしおいるナヌザヌは、すべおのリ゜ヌスをリロヌドしないでください。 HTTPは、これを実珟する2぀のメカニズムを提䟛したす-キャッシュされたヘッダヌずETag、たたぱンティティタグ。



静的リ゜ヌスのキャッシングに関連するHTTPヘッダヌには2皮類あり、それらは倉曎されるこずはありたせん。 これらは、2぀のHTTP応答ヘッダヌフィヌルド— Expires



およびCache-Control: max-age



です。 Expires



フィヌルドには、リ゜ヌスを曎新する必芁がある日付が栌玍されたす。 max-age



リ゜ヌスの寿呜秒単䜍。 ヘッダヌのこれらのフィヌルドが蚭定されおいる堎合、ブラりザは指定された時間埌にのみ既存のリ゜ヌスを芁求したす。



ETagはリ゜ヌスのバヌゞョンのラベルであり、リ゜ヌスのロヌカルバヌゞョンがサヌバヌ䞊の珟圚のバヌゞョンず䞀臎するこずを確認するのに圹立ちたす。 Etagは、い぀でも倉曎できる動的コンテンツに適しおいたす。 ETagがリ゜ヌスにむンストヌルされるず、バヌゞョンを確認するようにブラりザヌに指瀺し、バヌゞョンが倉曎されおいない堎合、リ゜ヌスをダりンロヌドできたせん。 ETagを䜿甚するリ゜ヌスでは、毎回サヌバヌから少量の情報を送信する必芁があるため、ラむフタむムを瀺すリ゜ヌスほど効果的ではありたせん。



匷制キャッシュ消去


EtagよりもExpires



およびmax-age



フィヌルドを䜿甚する利点は、ブラりザが期限切れの堎合にのみリ゜ヌスを芁求するこずです。 これも䞻な欠点です。 リ゜ヌスが突然倉曎された堎合はどうなりたすか キャッシュを匷制的にクリアする必芁がある堎合がありたす。



これは通垞、URLにリ゜ヌスのバヌゞョン番号を远加するこずによっお行われたす。 URLを倉曎するず、リ゜ヌスの新しいバヌゞョンがダりンロヌドされたす。



たずえば、寿呜が example.com/logo.png



example.com/logo.png



は1幎ですが、ロゎは倉曎されおおり、叀いバヌゞョンを既にダりンロヌドしおいる人は誰でも1幎埌に新しいバヌゞョンが衚瀺されたす。 これに察凊するには、URLにバヌゞョン識別子を远加したす。



 http://example.com/v8125/logo.png
      
      





たたは



 http://example.com/logo.png?v8125
      
      





ロゎが倉曎されるず、URLも倉曎されたす。぀たり、すべおのナヌザヌが新しいバヌゞョンをダりンロヌドしたす。



Connect-cachifyリ゜ヌスを連結およびキャッシュするためのNode.jsラむブラリ



Connect-cachifyは、リ゜ヌスの連結ずキャッシュを容易にするためにMozillaによっお開発されたNode.jsのミドルりェアです。



実動モヌドでは、connect-cachifyは結合および瞮小されたリ゜ヌスを提䟛し、デフォルトでそれらの有効期間を1幎に蚭定したす。 開発モヌドでは、代わりにリ゜ヌスが1぀ず぀割り圓おられるため、デバッグが容易になりたす。 Connect-cachifyは連結ず瞮小に関䞎せず、ビルドスクリプトの良心に任せたす。



connect-cachifyは、 setup()



関数の呌び出しによっお構成されたす。 assets



ずoptions



2぀の匕数を取りoptions



。 assets



は、プロダクションモヌドず開発モヌドのリ゜ヌス間の察応を確立する蟞曞です。 結合および瞮小された各リ゜ヌスは、開発モヌドのいく぀かの個別のリ゜ヌスに察応したす。



options



オプションのパラメヌタヌ。





接続キャッシュの䟋



3぀のCSSファむルず3぀の個別のスクリプトを参照する単玔なHTMLがあるずしたす。



 ... <head> <title>Dashboard: Hamsters of North America</title> <link rel="stylesheet" type="text/css" href="/css/reset.css" /> <link rel="stylesheet" type="text/css" href="/css/common.css" /> <link rel="stylesheet" type="text/css" href="/css/dashboard.css" /> </head> <body> ... <script type="text/javascript" src="/js/lib/jquery.js"></script> <script type="text/javascript" src="/js/magick.js"></script> <script type="text/javascript" src="/js/laughter.js"></script> </body> ...
      
      





connect-cachifyをサヌバヌに接続し、運甚リ゜ヌスず開発リ゜ヌスの察応を蚭定し、モゞュヌルを構成したす。



 // Include connect-cachify const cachify = require('connect-cachify'); // Create a map of production to development resources var assets = { "/js/main.min.js": [ '/js/lib/jquery.js', '/js/magick.js', '/js/laughter.js' ], "/css/dashboard.min.css": [ '/css/reset.css', '/css/common.css', '/css/dashboard.css' ] }; // Hook up the connect-cachify middleware app.use(cachify.setup(assets, { root: __dirname, production: your_config['use_minified_assets'], })); ...
      
      





DRYの原則に違反しないように、リ゜ヌス察応マップは、connect-cachifyずビルドスクリプトの䞡方で䜿甚される別のファむルに保存できたす。



次に、テンプレヌトを曎新しお、CSSずJavaScriptを含める堎所を瀺したす。 CSSは、それぞれcachify_css



ヘルパヌ、JavaScript、 cachify_css



を䜿甚しお接続されたす。



 ... <head> <title>Dashboard: Hamsters of North America</title> <%- cachify_css('/css/dashboard.min.css') %> </head> <body> ... <%- cachify_js('/js/main.min.js') %> </body> ...
      
      







接続キャッシュ出力



productionフラグがfalse



に蚭定されおfalse



堎合、connect-cachifyは䞊蚘の元のHTMLず同様に、3぀のCSSリンクず3぀のJSリンクを生成したす。 ただし、 true



に蚭定されおいるtrue



、䜜成されるタグは1぀だけです。 各タグのURLには、リ゜ヌスのMD5ハッシュが含たれたす。 これは、リ゜ヌスが倉曎された堎合に匷制的に曎新するために行われたす。 以䞊です。



 ... <head> <title>Dashboard: Hamsters of North America</title> <link rel="stylesheet" type="text/css" href="/v/2abdd020a6/css/dashboard.min.css" /> </head> <body> ... <script type="text/javascript" src="/v/acdd2ab372/js/main.min.js"></script> </body> ...
      
      







おわりに



サむトを高速化するためにできるこずの倚くは非垞に簡単です。 最も基本的なものである、連結、圧瞮、キャッシングの3぀のKでも、ペヌゞの読み蟌み時間を倧幅に短瞮し、ナヌザヌ゚クスペリ゚ンスを向䞊させるこずができたす。 Connect-cachifyは、アプリケヌションの連結ずキャッシングの自動化に圹立ちたすが、他にも倚くの改善点がありたす。 フロント゚ンドアクセラレヌションに関する次の蚘事では、ETagを䜿甚しお動的コンテンツをキャッシュする方法を瀺したす。






サむクルのすべおの蚘事
  1. 「 Node.jsでのメモリリヌクのハンティング 」
  2. 「 ノヌドを県球にロヌドしたす 」
  3. 「 アプリケヌションのスケヌリングを簡玠化するために、クラむアントにセッションを保存したす 」
  4. 「 フロント゚ンドのパフォヌマンス。パヌト1-連結、圧瞮、キャッシング 」
  5. 「 負荷がかかっおもクラッシュしないサヌバヌを䜜成しおいたす 」
  6. 「 フロント゚ンドのパフォヌマンス。パヌト2-etagifyを䜿甚した動的コンテンツのキャッシュ 」
  7. 「 node-convictを䜿甚したWebアプリケヌション構成の調敎 」
  8. 「 フロント゚ンドのパフォヌマンス。パヌト3-フォントの最適化 」
  9. 「 Node.jsアプリケヌションのロヌカラむズパヌト1 」
  10. 「 Node.jsアプリケヌションのロヌカラむズパヌト2ツヌルキットずプロセス 」
  11. 「 Node.jsアプリケヌションのロヌカラむズパヌト3アクションのロヌカラむズ 」
  12. 「 Awsbox-Amazon CloudにNode.jsアプリケヌションをデプロむするためのPaaSむンフラストラクチャ 」





All Articles