JavaScript は、Web アプリを動的かつインタラクティブにするのに優れていますが、単独ではうまく処理できないことが 1 つあります。それは、頻繁なイベントです。ウィンドウのサイズ変更、スクロール、検索ボックスへの入力などについて考えてみましょう。適切に管理しないと、これらがアプリにイベント トリガーを大量に送り込み、動作が遅くなり、ユーザー エクスペリエンスが遅くなる可能性があります。そこで、デバウンシングとスロットルの出番です。これらのテクニックは、特定の関数が実行される頻度を制御し、アプリの高速性と応答性を維持するのに役立ちます。
この記事では、デバウンシングとスロットリングについて詳しく説明し、いつそれらを使用するかを示し、実際の例を示してそれらの動作を確認します。これらの重要な JavaScript パフォーマンス最適化テクニックについて詳しく見ていきましょう!
デバウンスとは、相手が話し終わるのを待ってから返信を始めるようなものだと考えてください。誰かがあなたの話を中断し続ける会話に参加したことがあるなら、アイデアがわかるでしょう。 デバウンシング の重要な概念は、最後にイベントがトリガーされてから指定された時間が経過するまで関数の実行を遅らせることです。
簡単に言えば、イベント (ユーザーの入力など) が急速に発生し続ける場合、デバウンスにより、ユーザーが一定期間停止した後にのみ関連する機能 (検索クエリなど) が実行されるようになります。
頻繁なユーザー入力によって引き起こされる過度の関数呼び出しを制限したい場合は、デバウンスを使用する必要があります。典型的な例は、検索ボックスがあり、ユーザーが入力するたびに API 呼び出しを行う場合です。デバウンスを行わないと、キーストロークごとに API が呼び出され、サーバーに不要な負荷がかかる可能性があります。デバウンスを使用すると、ユーザーが入力をやめたときにのみ API が呼び出されます。
function debounce(func, delay) { let timeoutId; return function(...args) { clearTimeout(timeoutId); timeoutId = setTimeout(() => func.apply(this, args), delay); }; } // Usage const searchInput = document.getElementById('search'); searchInput.addEventListener('input', debounce(() => { console.log('API call made!'); }, 300)); // Only executes 300ms after the last keystroke
この例では、デバウンス関数により、ユーザーが入力を停止してから 300 ミリ秒後にのみ API 呼び出しが行われるようにしています。
それでは、スロットルについて話しましょう。 debounceing がおしゃべりが消えるまで応答を待機している場合、throttleling は、待機している車の数に関係なく、数秒ごとに 1 台の車しか通過させない交通警官のようなものです。これにより、イベントが繰り返しトリガーされた場合でも、関数は設定された期間ごとに最大 1 回呼び出されることが保証されます。
時間の経過とともに一貫した実行を保証する必要がある場合は、スロットルを使用するとよいでしょう。たとえば、ユーザーがページを下にスクロールすると、スクロール イベントが 1 秒あたり数十回トリガーされることがあります。スロットリングを行わないと、アプリがこれらすべてのイベントを処理しようとするため、速度が低下する可能性があります。スロットルにより、スクロール イベント ハンドラーの実行頻度が制限され、パフォーマンスが向上します。
コードでのスロットリングfunction throttle(func, limit) { let lastCall = 0; return function(...args) { const now = Date.now(); if (now - lastCall >= limit) { lastCall = now; func.apply(this, args); } }; } // Usage window.addEventListener('scroll', throttle(() => { console.log('Scroll event!'); }, 1000)); // Executes at most once every 1000msここでは、スロットル関数により、スクロール イベント ハンドラーが 1000 ミリ秒ごとに 1 回のみ実行されるようにし、アプリが過負荷にならないようにします。
実際の例
React アプリ を構築しているとします。入力イベントをデバウンスして、サーバーに API 呼び出しが殺到するのを防ぐことができます。あるいは、ユーザーがページをどこまでスクロールしたかを追跡している場合は、スロットリングを使用してパフォーマンスを最適化できます。
React でのデバウンスfunction throttle(func, limit) { let lastCall = 0; return function(...args) { const now = Date.now(); if (now - lastCall >= limit) { lastCall = now; func.apply(this, args); } }; } // Usage window.addEventListener('scroll', throttle(() => { console.log('Scroll event!'); }, 1000)); // Executes at most once every 1000msスクロールイベントの調整
function throttle(func, limit) { let lastCall = 0; return function(...args) { const now = Date.now(); if (now - lastCall >= limit) { lastCall = now; func.apply(this, args); } }; } // Usage window.addEventListener('scroll', throttle(() => { console.log('Scroll event!'); }, 1000)); // Executes at most once every 1000msパフォーマンス最適化のベストプラクティス
結論
デバウンスとスロットルの両方が強力なソリューションを提供します。それぞれをいつ使用するかを理解することで、検索入力の処理、ウィンドウのサイズ変更、スクロール イベントの管理など、Web アプリケーションをよりスムーズで応答性の高いものにすることができます。
次に、アプリがあまりにも多くのイベントによって行き詰まっていることに気付いたら、次のように自問してください:デバウンスする必要があるのか、それともスロットルするべきでしょうか?きっと喜んでいただけるはずです!
試してみる準備はできましたか? 次回プロジェクトに取り組むときに、これらのテクニックを試してみてください。すべてがどれほどスムーズになったかに驚くでしょう!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3