Reactアプリのデバッグ方法

# この記事の目的
Reactの公式ページを見たがReact DevToolsを用いたデバッグ方法についての記述が無かったため（[パフォーマンス最適化の項でDevToolsの紹介はあった](https://ja.reactjs.org/docs/optimizing-performance.html#profiling-components-with-the-devtools-profiler)）、Reactアプリのデバッグを行う上で最低限知っておくべき内容を整理しておく。

# 参考資料
[公式ガイド](https://ja.reactjs.org/docs/optimizing-performance.html)

# Reactアプリのデバッグ方法
## 準備
Reactアプリのデバッグはブラウザで行う。FirefoxとChromeのどちらでもデバッグ用の拡張機能（React Developer Tools）が用意されているので、普段Webアプリのデバッグで利用しているブラウザ向けのDevToolsをインストールして利用する。

[ChromeのReact Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ja)
[FirefoxのReact Developer Tools](https://addons.mozilla.org/ja/firefox/addon/react-devtools/)

※IE用は存在しないので、IEでのデバッグは諦めてください。。。

## React DevToolsの使い方概要
この資料ではChromeのDevToolsで説明する。（FirefoxのDevToolsでも基本同じはず）

### アイコンの見方
ChromeのReact DevToolsをインストールすると、ブラウザの右上にReactのアイコンが表示される。
アイコンの色によって意味が異なり、以下の3種類が存在する。

|**アイコンの種類** |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/c271c9a1-2b31-a17f-42c8-e63f01ce1887.png" width="100px"> |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/6f334433-8042-2f5e-b405-6b7a97a3c787.png" width="100px"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/5ed31bcd-d0c5-5ec1-3f9e-ebd6b567afa3.png" width="100px"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/91caad1b-b0a9-4754-b84d-3d34c178d179.png" width="100px"> |
| :-: | :-: | :-: | :-: | :-: |
| **Reactで描画されたページか否か** | Reactで描画されたページではない | Reactで描画されたページ | Reactで描画されたページ（ただし最新VersionのReactでは無い） | Reactで描画されたページ |
| **Reactのビルドモード** | - | Production Build | Production Build | Development Build |
| **React DevToolsによるデバッグ** | - | 不可 | 不可 | 可能 |

自分が作成したReactアプリをnpm startで起動してWebページを開いた場合、一番右の赤色アイコンが表示される。

### 画面のコンポーネント構成を見る方法
「Chromeのメニュー」→「その他ツール」→「デベロッパーツール」を開く。
デベロッパーツールのタブメニューから「Components」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/f2ba0967-5d86-7f9c-689b-fbb128650e17.png)

現在ブラウザで表示しているページのコンポーネント構成を確認できる。
また、対象のコンポーネントをクリックすればpropsやstateの値を確認することも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/82baaa2b-bf8c-87f7-73aa-ae3964db26c0.png)
多重階層になっていてお目当てのコンポーネントを探すのが大変なときは、Componentsタブ内の左上にある矢印ボタンを押して画面から対象コンポーネントを選択することも可能。
（ネストされたコンポーネントを正確にポインティングするのは難しいようなので、補助的に使ってあげてください）

### ブレイクポイントを設定してステップ実行でデバッグする
React Developer ToolsでComponentsタブを開き、ブレイクポイントを設定したいコンポーネントを選択した状態で「<>」アイコンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/c25bcca6-4c71-8965-4a88-27bad4b67027.png)

コンポーネントのソースがReact Developer Toolsに表示されるので、ブレイクポイントを設定したい行番号をクリックする。ブレイクポイントを設定した行番号は緑色になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/5e648de9-1037-4939-1d22-f84c5d4810a4.png)
ブレイクポイントを設定した状態でWebブラウザ内でReactアプリを操作すると、ブレイクポイントで処理が止まる。ブレイクポイントで処理が止まると、対象の行が緑色で網掛けされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/0203e7f9-34c5-23ee-5d88-874ffdeb3049.png)

ブレイクポイントで処理が停止したら、以下のいずれかの実行が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/8dbc077a-34d1-ab97-4543-c110688d1e13.png)

* Resumu script execution
 * ブレイクポイントからそのまま処理が続行される
* Step over next function call
 * ステップオーバーで実行
 * 今いる関数内の処理はすべて実行し、次の関数が呼ばれたタイミングで処理をブレイク（停止）する
* Step into next function call
 * ステップインで実行
 * 今いる関数から別の関数が呼ばれるタイミングまで処理を進め、別の関数に入ったタイミングで処理をブレイク（停止）する
* Step out of current function
 * ステップアウトで実行
 * 今いる関数内の処理はすべて実行し、今いる関数の呼び出し元に戻ったタイミングで処理をブレイク（停止）する
* Step
 * 一行づつ順番に実行する