JavaScript でのパフォーマンスの最適化

JavaScript は、フロントエンド開発で広く使用されている高レベルのプログラミング言語であり、その柔軟性と対話性により、最新の Web アプリケーションに不可欠な要素となっています。ただし、Web ページとアプリケーションの複雑さが増し続けるにつれて、JavaScript のパフォーマンスの問題がますます顕著になっています。したがって、Web アプリケーションの開発時には、アプリケーションの応答速度とユーザー エクスペリエンスを向上させるために、JavaScript のパフォーマンスを最適化する方法を検討する必要があります。

この記事では、DOM アクセスの削減、イベント委任の使用、ファイルのマージと圧縮、キャッシュの使用など、JavaScript のパフォーマンス最適化手法をいくつか紹介します。同時に、いくつかの一般的なパフォーマンスの問題についても説明し、読者が実際のプロジェクトで JavaScript のパフォーマンスを最適化する方法をよりよく理解できるように、いくつかの実用的な最適化手法を提供します。

1. JavaScript の一般的なパフォーマンスの問題

JavaScript パフォーマンスの最適化の前に、いくつかの一般的な JavaScript パフォーマンスの問題を理解する必要があります。よくある質問を次に示します。

1. 頻繁な DOM アクセス: DOM 要素への頻繁なアクセスは、パフォーマンスの問題を引き起こす可能性があります。DOM 要素へのアクセスは非常にコストのかかる操作であるため、ブラウザーから要素への参照を取得し、要素の位置とサイズを計算する必要があります。

2. HTTP リクエストが多すぎる: HTTP リクエストが多すぎると、ページの読み込みに時間がかかりすぎて、ユーザー エクスペリエンスに影響します。HTTP リクエストが送信されるたびに、TCP 接続を確立してデータを送信する必要があり、これらの操作には時間とリソースが必要です。

3. 多数の JavaScript ファイル: Web アプリケーションで多数の JavaScript ファイルを使用すると、読み込み時間が非常に長くなり、ユーザー エクスペリエンスに影響を与えます。各 JavaScript ファイルは HTTP リクエストを作成する必要があり、解析して実行する必要があり、これらの操作には時間とリソースが必要です。

4. メモリ リーク: メモリ リークは、コードで作成されたオブジェクトがガベージ コレクタによって正しく再利用できないことを意味します。JavaScript コードにメモリ リークがあると、Web アプリケーションを長時間実行すると、メモリ使用量が増加し続け、パフォーマンスの問題が発生する可能性があります。

2. JavaScript パフォーマンス最適化スキル

JavaScript のパフォーマンスの問題を解決するには、いくつかの最適化手段を講じる必要があります。以下に、JavaScript パフォーマンス最適化の一般的なヒントをいくつか示します。

1. DOM アクセスを減らす

前述のように、DOM 要素に頻繁にアクセスすると、パフォーマンスの問題が発生する可能性があります。この種の問題を回避するには、DOM 要素へのアクセスを最小限に抑える必要があります。たとえば、DOM 要素への参照をキャッシュして、繰り返しアクセスしないようにすることができます。さらに、documentFragment を使用して、DOM での操作の数を減らすことができます。

2. イベント委任を使用する

イベント委任は、イベント ハンドラーの数を減らして Web アプリケーションのパフォーマンスを向上させる JavaScript 手法です。イベント委任は、イベント ハンドラーを各子要素にアタッチするのではなく、親要素にイベント ハンドラーをアタッチすることです。子要素でイベントが発生すると、親要素にバブルアップし、そこで処理されます。このようにして、1 つのイベント ハンドラーを使用して、複数の子要素のイベントを処理できます。

たとえば、複数の li 要素を含む ul 要素があるとします。各 li 要素がクリックされたときに何らかのコードを実行したい場合は、イベント委譲を使用してそれを実現できます。

const ul = document.querySelector('ul');
ul.addEventListener('click', (event) => {
  if (event.target.tagName === 'LI') {
    // 在这里处理li元素的单击事件
  }
});

上記のコードでは、クリック イベント ハンドラーを ul 要素にアタッチしています。クリック イベントが li 要素で発生すると、それらは ul 要素にバブル アップし、ul 要素によって処理されます。イベント ハンドラーでは、イベントのターゲット要素が li 要素であるかどうかを確認し、必要に応じて対応するコードを実行できます。

イベント委任を使用すると、イベント ハンドラーの数を減らすことができるため、Web アプリケーションのパフォーマンスが向上します。さらに、コードをより簡潔にし、保守を容易にすることができます。

3. ファイルのマージと圧縮

前述のように、Web アプリケーションで多数の JavaScript ファイルを使用すると、読み込み時間が非常に長くなり、ユーザー エクスペリエンスに影響を与えます。この問題を解決するには、複数の JavaScript ファイルを 1 つのファイルに結合し、圧縮アルゴリズムを使用してファイル サイズを縮小します。これにより、HTTP 要求の数が減り、ファイル転送時間と解析時間が短縮されます。

一般的に使用される JavaScript ファイル マージ ツールには、Grunt、Gulp、Webpack などがあります。これらのツールは、複数の JavaScript ファイルを 1 つに結合し、圧縮アルゴリズムを使用してファイル サイズを縮小するのに役立ちます。

4. キャッシュを使用する

キャッシングは、Web アプリケーションのパフォーマンスを向上させるための重要な手法です。ブラウザが最初に Web アプリケーションにアクセスすると、HTML、CSS、JavaScript、およびその他のファイルがサーバーからダウンロードされます。サーバーでキャッシュを有効にすると、ブラウザーはこれらのファイルをローカル キャッシュに保存し、サーバーからファイルを再ダウンロードする代わりに、次回アクセス時にローカル キャッシュを使用できます。これにより、HTTP 要求の数が減り、Web アプリケーションのパフォーマンスが向上します。

一般的に使用されるキャッシング テクノロジーには、ブラウザー キャッシング、CDN キャッシング、サーバー キャッシングなどがあります。たとえば、サーバー側で HTTP キャッシュ ヘッダーを構成して、ブラウザーにファイルをローカルにキャッシュするように指示できます。一般的に使用される HTTP キャッシュ ヘッダーには、Expires、Cache-Control、ETag などがあります。

5. メモリリークを避ける

前述のように、JavaScript にはメモリ リークの問題があり、パフォーマンスの低下や Web アプリケーションのクラッシュにつながる可能性があります。メモリ リークとは、プログラムで作成されたオブジェクトが正しく解放されないことを意味し、ブラウザのメモリ制限に達するまでメモリ使用量が増加し続けます。

メモリ リークを回避するには、不要なグローバル変数とクロージャを作成しないようにし、不要になったオブジェクトをすぐに削除する必要があります。たとえば、JavaScript でオブジェクトを作成する場合、使用後はすぐに削除する必要があります。

let myObj = {
  // 对象的属性和方法
};

// 在这里使用myObj

// 使用完myObj后,删除它
myObj = null;

上記のコードでは、myObj オブジェクトを使用してオブジェクトが占めていたメモリを解放した後、そのオブジェクトを null に設定しています。

6. DOM アクセスを減らす

JavaScript では、DOM へのアクセスは時間のかかる操作です。DOM にアクセスするたびに、ブラウザーはページ レイアウトを再計算してページを再レンダリングするため、Web アプリケーションのパフォーマンスが低下する可能性があります。パフォーマンスを改善するには、DOM アクセスの数を最小限に抑え、DOM アクセスの結果を再利用できるようにキャッシュする必要があります。

たとえば、ページ上の要素を見つけてそのスタイルを設定する必要があるとします。次のコードを使用して DOM にアクセスすると、ページ レイアウトが再計算され、訪問のたびにページが再レンダリングされます。

document.querySelector('.my-element').style.color = 'red';

これを回避するには、まず要素の参照を変数に格納し、必要に応じてそれを使用して要素にアクセスします。例えば:

const myElement = document.querySelector('.my-element');
myElement.style.color = 'red';

上記のコードでは、最初に要素の参照を myElement 変数に格納し、必要に応じてそれを使用して要素にアクセスします。これにより、DOM への複数回のアクセスが回避され、Web アプリケーションのパフォーマンスが向上します。

7. requestAnimationFrame を使用する

requestAnimationFrame は、アニメーションのパフォーマンスを最適化するための API です。次のブラウザーの再描画の前にコールバック関数を実行し、コールバック関数が適切なタイミングで実行され、ページのフリーズやアニメーションの滑らかさの問題を回避できるようにします。

たとえば、ページ上の要素を移動する必要があるアニメーション効果があるとします。次のコードを使用してアニメーション効果を実現すると、ページがフリーズし、アニメーションが滑らかにならない場合があります。

const element = document.querySelector('.my-element');
let position = 0;

function animate() {
  position += 1;
  element.style.left = position + 'px';
  requestAnimationFrame(animate);
}

animate();

上記のコードでは、ループを使用して要素の位置を継続的に更新しています。

この状況を回避するために、 requestAnimationFrame を使用してアニメーション効果を最適化できます。例えば:

const element = document.querySelector('.my-element');
let position = 0;

function animate() {
  position += 1;
  element.style.left = position + 'px';
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

上記のコードでは、 requestAnimationFrame を使用してアニメーション効果を実行しています。これにより、アニメーションが適切なタイミングで実行され、ページのカクつきやぎくしゃくしたアニメーションが回避されます。

8. イベント委任を使用する

JavaScript では、イベント委任は、イベント ハンドラーのパフォーマンスを最適化するために使用される手法です。イベント委譲では、各子要素のイベントを個別に処理するのではなく、イベント バブリングの原則を使用して祖先要素のイベントを処理します。これにより、イベント ハンドラーの数が減り、Web アプリケーションのパフォーマンスが向上します。

たとえば、リストがあり、その中の各要素にクリック イベント ハンドラーを追加する必要があるとします。次のコードを使用してこの機能を実装すると、パフォーマンスの問題が発生する可能性があります。

const items = document.querySelectorAll('.my-list-item');
items.forEach(item => {
  item.addEventListener('click', () => {
    // 处理点击事件
  });
});

上記のコードでは、各リスト項目のクリック イベント ハンドラーを追加しました。これにより、イベント ハンドラーの数が増加し、パフォーマンスの問題が発生する可能性があります。

この問題を解決するには、イベント委任を使用してクリック イベントを処理します。例えば:

const list = document.querySelector('.my-list');
list.addEventListener('click', event => {
  if (event.target.classList.contains('my-list-item')) {
    // 处理点击事件
  }
});

上記のコードでは、リスト要素のクリック イベント ハンドラーを追加し、ハンドラーでクリック イベントのターゲットがリスト アイテムであるかどうかを確認しました。これにより、イベント ハンドラーの数が減り、Web アプリケーションのパフォーマンスが向上します。

9. ファイルのマージと圧縮

Web アプリケーションでは、通常、JavaScript、CSS、画像などのファイルをサーバーからロードする必要があります。パフォーマンスを向上させるには、ファイルの数とサイズを最小限に抑え、マージと圧縮の手法を使用してファイル サイズを縮小する必要があります。

マージとは、複数のファイルを 1 つに結合するプロセスです。たとえば、app.js と utils.js という 2 つの JavaScript ファイルがあるとします。それらを 1 つのファイルに結合すると、ファイルの数を減らすことができるため、Web アプリケーションのパフォーマンスが向上します。

圧縮は、ファイル サイズを最小限に抑えるプロセスです。たとえば、サイズが 100KB の CSS ファイルがあるとします。CSS 圧縮ツールを使用してこのファイルを圧縮すると、ファイル サイズを 50KB 以下に縮小できるため、ファイルの読み込みが高速化されます。

ファイルのマージと圧縮を実現するために、いくつかのツールとテクニックを使用できます。たとえば、Webpack、Gulp、Grunt などのビルド ツールを使用して、ファイルのマージと圧縮を自動化できます。これらのツールは、必要に応じてファイルを自動的にマージ、圧縮、および最適化することにより、Web アプリケーションのパフォーマンスを向上させることができます。

結論は

JavaScript は非常に強力なプログラミング言語ですが、Web アプリケーションで使用するとパフォーマンスの問題が発生する可能性があります。Web アプリケーションのパフォーマンスを向上させるには、DOM アクセスを最小限に抑え、イベント委任を使用し、ファイルをマージして圧縮し、キャッシュやその他の手法を使用する必要があります。これらの手法は、ネットワーク リクエストを減らし、コード実行を最適化し、ファイルの読み込みを高速化することで、Web アプリケーションのパフォーマンスとユーザー エクスペリエンスを向上させます。

おすすめ

転載: blog.csdn.net/tyxjolin/article/details/130472117