ホームページ > 記事 > ウェブフロントエンド > JavaScript のパフォーマンスの最適化
JavaScript は多用途で強力な言語ですが、正しく最適化されていない場合はパフォーマンスのボトルネックの原因になる可能性もあります。この記事では、JavaScript コードを最適化するためのいくつかの重要なテクニックを、各ポイントを説明する例とともに説明します。
ドキュメント オブジェクト モデル (DOM) の操作は、JavaScript で最も時間のかかる操作の 1 つです。 DOM アクセスを最小限にするには、次のことを行う必要があります。
例:
// Inefficient DOM manipulation for (let i = 0; i < 1000; i++) { let div = document.createElement('div'); div.textContent = i; document.body.appendChild(div); } // Optimized with Document Fragment let fragment = document.createDocumentFragment(); for (let i = 0; i < 1000; i++) { let div = document.createElement('div'); div.textContent = i; fragment.appendChild(div); } document.body.appendChild(fragment);
イベント ハンドラーは、特にスクロールやサイズ変更などのイベントの場合、頻繁に起動される可能性があります。最適化するには、デバウンスまたはスロットル手法を使用して、これらのハンドラーの実行速度を制限します。
例:
// Debounce function function debounce(func, wait) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), wait); }; } // Throttle function function throttle(func, limit) { let inThrottle; return function(...args) { if (!inThrottle) { func.apply(this, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; } // Usage window.addEventListener('resize', debounce(() => { console.log('Resized'); }, 200)); window.addEventListener('scroll', throttle(() => { console.log('Scrolled'); }, 100));
同期操作でメインスレッドをブロックすると、ユーザーエクスペリエンスが低下する可能性があります。 async/await、Promises、setTimeout などの非同期手法を利用して、メインスレッドの応答性を維持します。
例:
// Synchronous operation (blocking) function fetchData() { let response = fetch('https://api.example.com/data'); // Blocking console.log(response); } // Asynchronous operation (non-blocking) async function fetchDataAsync() { let response = await fetch('https://api.example.com/data'); // Non-blocking console.log(response); } fetchDataAsync();
ループ内で行われる作業を最小限に抑えることで、ループを最適化できます。たとえば、配列の長さをキャッシュしたり、より効率的なループ構造を使用したりします。
例:
// Inefficient loop let arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); } // Optimized loop for (let i = 0, len = arr.length; i < len; i++) { console.log(arr[i]); } // Using forEach arr.forEach(item => console.log(item));
リフローと再ペイントは、ブラウザーのレンダリング プロセスにおける高コストの操作です。これらを次の方法で最小限に抑えます:
例:
// Layout thrashing (inefficient) const element = document.getElementById('myElement'); element.style.width = '100px'; console.log(element.offsetWidth); element.style.height = '100px'; console.log(element.offsetHeight); // Optimized const element = document.getElementById('myElement'); element.style.cssText = 'width: 100px; height: 100px;'; const width = element.offsetWidth; const height = element.offsetHeight; console.log(width, height);
適切なデータ構造を選択すると、パフォーマンスが大幅に向上します。たとえば、一意の値にはセットを使用し、頻繁に検索するキーと値のペアにはマップを使用します。
例:
// Inefficient array search for unique values let arr = [1, 2, 3, 4, 5, 1, 2]; let uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index); // Optimized using Set let uniqueSet = new Set(arr); let uniqueArrOptimized = [...uniqueSet];
JavaScript の最適化は、Web アプリケーションのパフォーマンスと応答性を向上させるために重要です。 DOM アクセスを最小限に抑え、イベント ハンドラーのデバウンスとスロットルを行い、非同期プログラミングを使用し、ループを最適化し、リフローと再描画を最小限に抑え、効率的なデータ構造を選択することにより、より高速で効率的な JavaScript コードを作成できます。これらのテクニックをプロジェクトに実装すると、パフォーマンスが大幅に向上します。
以上がJavaScript のパフォーマンスの最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。