LoginSignup
6
0

More than 1 year has passed since last update.

DebounceでVuejsのパフォーマンスを最適化

Last updated at Posted at 2022-12-19

VueJsが利用されているWebアプリケーションをパフォーマンス向上したところでDebounceという概念を見当たりました。
良い改善点だと思いますので、こちらの記事でDebounceのやり方を紹介させて頂きたいと思います。

拝見

インタラクションWeb アプリケーションを開発するなら、特にVueJsのWebアプリケーションを実装する際に、パフォーマンス最適化について考えた方が良いと思います。Windowイベントリスナー登録の辺り、検索フォームの入力にタイピング、スクロール、エレメントのサイズ変更などのイベントをリッスンすると、重い処理を実行したら、アプリケーションが重くなって、レスポンスが反応できない可能性があります。

例:検索機能を開発する前提でユーザーに良いUI・UXを提供したい為、ユーザーが検索のテキストボックスに入力したら、自動的に検索結果を出すようにします。ただ、問題になるのはユーザーがキーボードを打つ度に、APIでデータを取得するという重い処理が実装されてきて、キーボードで入力する回数により、APIを呼び出す処理がどんどん溜まり、アプリケーションでは膨大なネットワークリクエストが生成されてしまいます。なので、パフォーマンスが減ることになっています。

Debounceについて

上記の例で発生した問題はDebounceを導入したら、簡単に解決できます。
Debounceを導入したら、キーボード入力イベントで行う処理が一時的に待たせるようにします。キーボードの打つが一定時間止まった時に検索の処理を行います。決まったテキストで検索するなら、キーボードの打つを連続して文字を入力終わりまで、検索結果を所得リクエストは1回だけです。このようにdebounceを利用することでシステムの処理の負荷を下げることができます。

こちらはデバウンス関数のコードスニペットです。

export function debounce(fn, wait){
    let timer;
   return function(...args){
     if(timer) {
        clearTimeout(timer); // イベントにトリガーする際に、すでに存在しているtimerを削除する。
     }
     const context = this; 
     timer = setTimeout(()=>{ // イベントにトリガーする度に、新しい timerを作成する。
        fn.apply(context, args); // 一時的に待たせてから、処理を実行する。
     }, wait);
   }
}

DebouceをVueのwatcherで導入してみる。

Vueのwatcherでユーザーがテキストボックスに入力したときに値のログに記録して、Fetch API を呼び出すという単純なコンポーネントを検討しましょう。

  • debounce利用しない。
<template>
 <div id="app">
  <input v-model="value" type="text" />
</div>
</template>
<script>
export default {
  data() {
    return {
      value: "",
    };
  },
  watch: {
    value(newValue, oldValue) {
      console.log("value changed: ", newValue, oldValue);
      // APIを叩いて、データーを所得する
    }
  }
};
</script>

上記の例では、ユーザーがフォームに値を入力するたびに、コンソールに値のログが記録され、何かのAPIが呼び出されます。APIをそのように呼び出すなら、アプリケーショのパフォーマンスが改善できません。

  • debounce利用する。

<template>
 <div id="app">
  <input v-model="value" type="text" />
</div>
</template>
<script>
import {debounce} from "./Utils.js";
export default {
  data() {
    return {
      value: "",
    };
  },
  created(){
     this.debouncedFetch = debounce((newValue, oldValue)=>{
            console.log("value changed: ", newValue, oldValue);
           // APIを叩いて、データーを所得する
     }, 1000);
  },
  watch: {
    value(...args) {
      this.debouncedFetch(...args);
    }
  }
};
</script>

上記のコードでは、最後のキーボード打つことから 1000 ミリ秒が経ると、ユーザーはコンソールにログインするとAPIの呼び出すなどの処理が実行されます。

debouncedFetch のインスタンスを作成することで、Watcherにdebouncedが実装されます。debouncedFetchの中身にはコールバックと待ち時間を定義されています。このインスタンスはcreated()フックで作成され、Watcher内で適切な引数をコールバックの変数に渡します。

参考

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0