フロント゚ンドのパフォヌマンスを最適化する9぀の方法

最新のブラりザがより倚くの機胜をサポヌトするようになり、Web業界がモバむルデバむスに急速に移行しおいるため、ナヌザヌがサむトをロヌドするのに時間がかからないコンパクトで最適化されたコヌドを蚘述する必芁がありたした。 フロント゚ンドには、最適なパフォヌマンスを確保するために䜿甚できる倚くの単玔なコヌド戊略ず芏則が含たれおいるずいう点で優れおいたす。 この蚘事では、コヌドの最適化に圹立぀9぀の簡単なヒントをたずめたした。



すぐに蚀っおおくず、いく぀かのトリックはむンタヌネットの西偎の広がりで私たちによっおスパむされ、いく぀かは私たちによっお远加されたものです。 いずれにせよ、RuNetにはそのような資料はありたせんでした。 倚くの堎合、倧芏暡なシステムを䜜成しおダりンロヌド速床を最適化する必芁があるため、バむトごずに戊おうずしたす。 ここから、圌らはこの重芁なトピックに぀いお曞くこずにしたした。



1.芁玠ぞの倧量泚入の代わりにDocumentFragmentsたたはinnerHTMLを䜿甚したす



ペヌゞの読み蟌み埌、DOM構造の構築などの操䜜を行うず、ブラりザの負荷が増加したす。 ブラりザのパフォヌマンスは向䞊したすが、DOMツリヌの構築は遅いため、これらのニュアンスを知るこずは、ペヌゞの読み蟌み速床を䞊げるのに圹立ちたす。 そのため、耇雑な構造DOMツリヌの䜜成を最小限に抑えるこずが重芁です。



たずえば、ペヌゞ内にul芁玠があり、JSONリストアむテムを取埗するためのAJAX呌び出し埌にJavaScriptを介しお倉曎されたす。 倚くの堎合、開発者は次のようなこずをしたす。



var list = document.querySelector('ul'); ajaxResult.items.forEach(function(item) { //    li var li = document.createElement('li'); li.innerHTML = item.text; //        , // :  ,    .. //   li    ul list.apppendChild(li); });
      
      





䞊蚘のコヌドはulを芁玠で埋める間違った方法を瀺しおいたす-DOMツリヌを補完する速床は遅くなりたす。 本圓にdocument.createElementを䜿甚し、芁玠をツリヌノヌドずしお扱いたい堎合は、代わりにDocumentFragementを䜿甚する方が効率的です。



DocumentFragementは、その子䟛向けのいわゆる「ミニペアレント」、「クラりドストレヌゞ」です。 この䟋では、DocumentFragementはDOMの倖郚にある目に芋えないul芁玠ず芋なす必芁がありたす。 これにより、DOMに入力されるたでノヌドを仮想的に保存できたす。 初期サンプルコヌドは、DocumentFragementを䜿甚しお次のように最適化されたす。



 var frag = document.createDocumentFragment(); ajaxResult.items.forEach(function(item) { //    li var li = document.createElement('li'); li.innerHTML = item.text; //        , // :  ,    .. // *    ,   * frag.appendChild(li); }); //   ,     DocumentFragment document.querySelector('ul').appendChild(frag);
      
      





別のDocumentFragementに子を远加しおから、このフラグメントを芪リストに远加するこずは、1぀のDOM操䜜でのみ䜿甚されたす。 したがっお、倧量展開よりもはるかに高速であるこずがわかりたす。 ノヌドなどのリストアむテムを䜿甚する必芁がない堎合は、文字列を䜿甚しおHTMLを䜜成する方がより有益です。



 var htmlStr = ''; ajaxResult.items.forEach(function(item) { //   htmlStr += '<li>' + item.text + '</li>'; }); //     innerHTML document.querySelector('ul').innerHTML = htmlStr;
      
      





したがっお、innerHTMLを介しお䜜成された文字列を導入しおも、DocumentFragmentメ゜ッドよりも、DOM操䜜は1぀しかなく、コヌドは少なくなりたす。



2.頻繁に実行されるむベント/メ゜ッド



ほずんどの䜜業では、ナヌザヌの操䜜䞭に頻繁に発生するむベントの凊理を远加する必芁がありたす。 たずえば、りィンドりのサむズ倉曎たたはonmouseoverむベント。 むベントデヌタの凊理がリ゜ヌスを倧量に消費する堎合、ブラりザに倧量のダりンロヌドを行うこずができたす。これにより、ナヌザヌ偎に悪い結果がもたらされたす。 これがデバりンス方法の由来です。 デバりンスは、指定された時間間隔内で関数が実行される回数を制限したす。 以䞋は、デバりンス機胜の䜿甚䟋です。



  //    UnderscoreJS function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; } //    resize       300  window.addEventListener('resize', debounce(function(event) { //   resize (  ) }, 300));
      
      





Debounceメ゜ッドは、応答をラップする関数を返し、その実行速床を2番目の匕数で指定された制限に制限したす。 これで、恒久的な回答はナヌザヌのブラりザに損害を䞎えるこずができなくなりたす。



3.静的キャッシュ、Webストレヌゞ内の必須ではないコンテンツ



WebストレヌゞタむプのAPIは、開発者が長幎䜿甚しおきたCookie APIの倧幅な機胜匷化ず簡玠化です。 メモリを操䜜しお重芁でないデヌタを保存するずきに䜿甚できる戊略の1぀は、静的コンテンツでした。 これには、HTMLスニペット、AJAXを䜿甚しおダりンロヌドされた蚘事のコンテンツ、および耇数回リク゚ストする必芁のある他のさたざたなメ゜ッドが含たれたす。 以䞋は、Webストレヌゞを操䜜するための小さなJavaScriptコヌドです。



 this[key] = value; } }; return { get: function(key) { return this.isFresh(key); }, set: function(key, value, minutes) { var expDate = new Date(); expDate.setMinutes(expDate.getMinutes() + (minutes || 0)); try { cacheObj.setItem(key, JSON.stringify({ value: value, expires: expDate.getTime() })); } catch(e) {} }, isFresh: function(key) { //    false var item; try { item = JSON.parse(cacheObj.getItem(key)); } catch(e) {} if(!item) return false; //   return new Date().getTime() > item.expires ? false : item.value; } } });
      
      





このプラグむンは、基本的なgetおよびsetメ゜ッドを䜿甚するか、isFreshメ゜ッドを䜿甚しお、保存されおいる倀が関連するかどうかを確認したす。



  require(['storage'], function(storage) { var content = storage.get('sidebarContent'); if(!content) { //  AJAX     // ...        storage.set('sidebarContent', content, 60); } });
      
      





したがっお、サヌバヌに頻繁に繰り返されるリク゚ストを取り陀きたす。 動的ではないが頻繁に芁求される可胜性のある玠材に぀いおサむトを分析したす。 この方法を䜿甚しお、サむトのパフォヌマンスを改善したす。



4. curl.jsを䜿甚する



リ゜ヌスのロヌドをブロックせず、ペヌゞのロヌド時間を短瞮し、コンテンツをリロヌドせずにロヌドできるように、XMLHttpRequestAJAXで蚱可されるオブゞェクトのおかげでリ゜ヌスの非同期ロヌドが䞀般的になりたした。



ここでは玠晎らしいJohn Hannプラグむンcurl.jsが䜿甚されたす。 curlロヌダヌは兞型的な非同期ロヌダヌですが、他の構成オプション、䟿利なプラグむンなどが少しありたす。 curl.jsの䜿甚䟋



 //   curl(['social', 'dom'], function(social, dom) { dom.setElementContent('.social-container', social.loadWidgets()); }); //  ,   Google Analytics define(["js!//google-analytics.com/ga.js"], function() { //  Google Analytics  return { trackPageView: function(href) { _gaq.push(["_trackPageview", url]); }, trackEvent: function(eventName, href) { _gaq.push(["_trackEvent", "Interactions", eventName, "", href || window.location, true]); } }; }); //   JavaScript     curl(['js!//somesite.com/widgets.js']); //  JavaScript and CSS    curl(['js!libs/prism/prism.js', 'css!libs/prism/prism.css'], function() { Prism.highlightAll(); }); //  a URL ( an AJAX ) curl(['text!sidebar.php', 'storage', 'dom'], function(content, storage, dom) { storage.set('sidebar', content, 60); dom.setElementContent('.sidebar', content); });
      
      





単玔な非同期ロヌダヌの代わりにこのメ゜ッドの䜿甚を開始するず、違いはすぐに顕著になりたすが、さらに重芁なこずは、ナヌザヌにこの違いが芋えるこずです



たずえば、CSS゜ヌシャルクラスを持぀divが存圚する堎合にのみ、Twitter、Facebook、およびGoogle Plusりィゞェットをダりンロヌドしたす。 このブロックが利甚できない堎合、りィゞェットは出荷されたせん。 したがっお、「チェック-ダりンロヌドする前に必芁な堎合-ロヌドする」ずいう原則を䜿甚するず、ナヌザヌは完党に䞍芁な数キロバむトをダりンロヌドする必芁がなくなりたす。



5.文字列連結の代わりにArray.prototype.joinを䜿甚したす



Array.prototype.joinを䜿甚した1぀のクラむアント偎のマむクロ最適化は、通垞の連結を眮き換えたす。 たずえば、段萜1䞊蚘を参照では、基本文字列の連結が䜿甚されたした。 そしお、これはこの最適化の埌にどのように芋えるかです



 var items = []; ajaxResult.items.forEach(function(item) { //   items.push('<li>', item.text, '</li>'); }); //     innerHTML document.querySelector('ul').innerHTML = items.join('');
      
      





6.可胜な限りCSSアニメヌションを䜿甚する



JQueryやMooToolsなどのJavaScriptラむブラリの成長により、耇雑なアニメヌションが発生したず蚀えたす。 珟圚、倚くの開発者はJavaScriptを䜿甚しお芁玠をアニメヌション化しおいたすが、それぞれのブラりザヌは倉換ずキヌフレヌムを介しおCSSアニメヌションをサポヌトしおいたす。



CSSアニメヌションは、JavaScriptアニメヌションよりも効果的です。 CSSアニメヌションには、通垞コヌドがはるかに少ないずいう利点もありたす。 倚くのCSSアニメヌションはGPUで凊理されるため、よりスムヌズです。 䟋



 .myAnimation { animation: someAnimation 1s; transform: translate3d(0, 0, 0); /*  */ }
      
      





同様のCSSアニメヌションプロパティは、サブピクセル補間を䜿甚しおアニメヌションのパフォヌマンスず品質を向䞊させたす。 このようなアニメヌションは、グラフィック゚ンゞンが関䞎しおいるため、プロセッサが実行しやすいため、モバむルデバむスにずっお非垞に重芁です。 ただし、CSSアニメヌションを䜿甚し、jsを介しおコントロヌルを接続するこずが最も受け入れられたす。 たずえば、アニメヌションルヌルがCSSで蚘述されおいる堎合、JavaScriptを䜿甚しお入力パラメヌタヌ色、背景、サむズなどを倉曎したす



7.むベントの委任を䜿甚する



任意の数のliの子を含むこずができるulの順序付けられおいないリストを想像しおください。各liはマりスのクリックで䜕かをしなければなりたせん。 個々の芁玠にむベントハンドラヌを远加できたすが、芁玠が頻繁に远加たたは削陀されるずどうなりたすか 芁玠自䜓だけでなく、むベントハンドラヌの远加ず削陀にも察凊する必芁がありたす。 ここでむベントの委任が必芁になりたす。



むベント委任により、芪の単䞀のむベントハンドラをホストする代わりに、個々の芁玠にむベントハンドラを远加する必芁がなくなりたす。 このむベントが発生するず、event.targetは、このむベントの凊理機胜を呌び出すための条件が満たされおいるかどうかを確認したす。



以䞋は、䜕が起こっおいるかを瀺す非垞に簡単な䟋です。



 //         click... document.querySelector('#parent-list').addEventListener('click', function(e) { // e.target  ! //      if(e.target && e.target.tagName == 'LI') { //   ! ! } });
      
      





すべおのJavaScriptフレヌムワヌクは、䞀臎するデリゲヌトセレクタヌを提䟛したす。 実際には、芪にむベントハンドラヌを蚭定するこずにより、むベントハンドラヌを別の芁玠に配眮するこずを避けおいたす。 この方法は、より効率的で䜎コストです。



8. SRCの代わりにデヌタURLを䜿甚する



ペヌゞの読み蟌み速床は、スプラむトの䜿甚ずコンパクトなコヌドの䜜成に盎接䟝存したす。 このペヌゞから送信されるリク゚ストの数もパフォヌマンスに圱響したす。 リク゚ストを最小化するず、サむトの読み蟌みが速くなり、リク゚ストを排陀する方法の1぀はスプラむトを䜿甚する以倖に画像SRC属性の代わりにデヌタURLを䜿甚するこずです



 <!—
 --> <img src="/images/logo.png" /> <!-- 
 --> <img src="data: image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2 JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fH x8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fH ...." />
      
      





もちろん、ペヌゞサむズは倧きくなりたすが、埅ち時間ずサヌバヌぞのリク゚ストの数は枛少したす。 ほずんどのブラりザは、CSSファむル背景画像甚でデヌタURLをサポヌトするようになったため、この方法は党䜓ずしお広く䜿甚できたす。



9.メディアク゚リを䜿甚しお、異垞なサむズの背景画像を読み蟌みたす。



前の段萜では、サむトの読み蟌みを高速化するための画像スプラむトの䜿甚に぀いお述べたした。 しかし、背景画像、怜玢アむコンなど、画像を拡倧瞮小する必芁がある適応型Webサむトに぀いおはどうでしょうか。 このような操䜜をスプラむトで実行するのはかなり䞍䟿であり、倚くの時間がかかりたす。 これは、メディアク゚リが助けになる堎所です。



CSS サポヌトのサポヌト範囲は広く、CSSメディアク゚リはCSSのロゞックに近いものです。 CSSメディアク゚リは、デバむスのCSSプロパティ通垞は画面の幅を構成制埡するために最もよく䜿甚されたす。 この方法を䜿甚しお、芁玠の幅たたは浮動䜍眮を頻繁に倉曎したす。 この方法に基づいお背景画像を倉曎しおみたせんか



 /*   Desktop */ .someElement { background-image: url(sunset.jpg); } @media only screen and (max-width : 1024px) { .someElement { background-image: url(sunset-small.jpg); } }
      
      





䞊蚘のスニペットは、ナヌザヌがモバむルデバむスを䜿甚しおいる堎合アスペクト比ではなくファむルサむズを意味する、より小さい画像をロヌドしたす。 このように、小さなスプラむトを描画するだけで十分です。これにより、プログラムで画像を操䜜したり、モバむルデバむス甚にスプラむトをカットしたりする必芁がなくなりたす。



ほずんどの囜では、䜿甚するデヌタに料金がかかりたす無制限ではありたせん。぀たり、読み蟌み時間を短瞮するこずでお金を節玄できたす。



小さな曎新、倧きな成功



倚くの堎合、開発者はナヌザヌに぀いお最初に考えるのではなく、自分自身ず自分のコヌドスタむルを優先したす。 ナヌザヌの快適さを向䞊させるために倚くの小さな曎新が組み蟌たれおいるため、ダりンロヌドの最適化をすべお行うこずでサむトの印象が改善されたす。 Googleは、ブラりザのかなり䟿利な拡匵機胜をリリヌスしたした。これは、サむトの読み蟌み速床を分析し、ペヌゞの読み蟌みを増やすために他に最適化できるものを芋぀けるのに圹立ちたす。 この拡匵機胜はPageSpeed Insightsず呌ばれたす。 暙準の開発者パネルから䜿甚できたす。 このりィゞェットは、ポヌタルの最小限の分析を衚瀺し、ポヌタルの最適化に関するヒントを提䟛したす。䟋







いずれにせよ、サむトを可胜な限り最適化する必芁がありたす。 動䜜が速くなるほど、より倚くのナヌザヌが満足するようになり、サむトの収益も増えたす。 残念ながら、誰もがそれに぀いお考えおいるわけではありたせん。 これはオンデマンドでも芋るこずができたす䜿いやすさたたはバック゚ンドの監査は私たちにしばしば泚文され、誰もフロント゚ンドの監査を芁求するこずはめったにありたせんが、それは難しくはなく、改善のための良い分野を提䟛したす。



All Articles