MobXのdevtoolsまとめ

React+Reduxで開発する場合には [redux-devtools](https://github.com/gaearon/redux-devtools) や [redux-devtools-extension](https://github.com/zalmoxisus/redux-devtools-extension) を使うことでdispatchされたアクションのログやstoreの変更履歴を見ることができて，デバッグに大変便利です。

React+ReduxではなくReact+MobXを使った場合にはどのようなdevtoolsが使えるのか調べました。

## mobx-devtools

https://github.com/mobxjs/mobx-devtools

公式に提供されているChrome extensionです。storeを変更するactionを実行すると，変更内容とそれに伴うreactionの実行の様子が表示されます。以下のスクショはボタンを押すとカウントが増えるサンプルアプリでボタンを押した時の表示です。actionに名前を付けていなかったのでunnamed actionになっています…

![スクリーンショット 2018-02-28 15.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/154409/7a444749-5c98-0996-1069-1801cfe98f4a.png)

[mobx-state-tree](https://github.com/mobxjs/mobx-state-tree) を使った場合にはstoreの状態をより詳細に見ることができ，タイムトラベルも使えるようです。

![preview-mst.png](https://qiita-image-store.s3.amazonaws.com/0/154409/8fd53423-64aa-49ee-c9ca-2196a7d3b80d.png)

（画像引用元 [https://github.com/mobxjs/mobx-devtools#mobx-state-tree](https://github.com/mobxjs/mobx-devtools#mobx-state-tree)）

Componentsタブではstoreをobserveしているコンポーネントの一覧を見ることができます。Performanceタブではstoreを変更するactionが実行されてからDOMが実際に変更されるまでの時間を表示する機能を有効にすることができます。

まとめとしては，actionの履歴をたどることができる機能はかなり便利そうですが，storeの履歴をたどることができる機能はmobx-state-treeを使った場合しか使えないのが悲しいところです。

## mobx-react-devtools

https://github.com/mobxjs/mobx-react-devtools

mobx-devtoolsはChrome extensionでしたが，こちらはReact Componentとして提供されています。以下のようなコードを書くと，デバッグ用の機能を有効にするためのコンポーネントがブラウザの右上に設置されます。

```jsx
import DevTools from 'mobx-react-devtools';

const stores = createStores();
ReactDOM.render(
    <React.Fragment>
      <Provider {...stores}>
        <App />
      </Provider>
      <DevTools />
    </React.Fragment>,
    document.querySelector('#react-root')
  );
```

↓ ブラウザ右上に浮かぶ，デバッグ機能を有効にするためのコンポーネント

![スクリーンショット 2018-02-28 16.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/154409/a6733576-aea0-e023-e044-3b07ae17813b.png)

左の時計マークのボタンは，storeを変更するactionが実行されてからDOMが実際に変更されるまでの時間を表示する機能を有効にするボタンで，mobx-devtoolsのPerformanceタブと同じ働きをします。

↓「+1」ボタンを押してから3msでDOMに変更が適用されています。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/154409/71f03605-be48-efbe-895b-ef5dc0d558fd.png)

中央のツリー構造のボタンを押してからReactコンポーネントをクリックすると，そのコンポーネントが依存しているstoreの値が表示されます。↓の図では `doubleCount` は `count` の値を2倍にするcomputed propertyだったため，依存関係が入れ子になっています。

![スクリーンショット 2018-02-28 16.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/154409/a194e73b-66df-5579-93a6-973281dcc35e.png)

右の吹き出しマークのボタンは，actionの履歴を表示する機能を有効にするボタンです。このボタンを押して，ブラウザでJavaScriptのコンソールを開いてからactionを実行すると，mobx-devtoolsで表示されたようなactionの履歴が表示されます。

![スクリーンショット 2018-02-28 16.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/154409/e238e25d-3f85-00fb-c68e-0a31f6ef016a.png)

まとめとしては，mobx-devtoolsと比較すると，コンポーネントが依存しているstoreの値を表示する機能は便利だと感じました。一方で，actionの履歴を表示する機能はmobx-devtoolsのほうが見やすいような気がしています。

## mobx-remotedev

https://github.com/zalmoxisus/mobx-remotedev

redux-devtools-extension と同じ作者が作ったライブラリです。このライブラリが提供している `remotedev` という関数でstoreを囲むと，storeの変更がredux-devtoolsに表示されるようになります。

![スクリーンショット 2018-02-28 16.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/154409/ed44d8aa-23a2-0952-60b8-47b270d06bbb.png)

問題点としては，開発が停滞していることが挙げられます。一部のアクションはredux-devtoolsに表示されるのに，なぜか他のアクションは表示されないなど，怪しい挙動が見受けられるためライブラリの修正が必要かもしれません。