🛠️

ElectronでReact Developer Toolsを使う

2023/06/01に公開1

現在公開されているReact Developer Tools(ブラウザ拡張)は、現在のElectronバージョン(24.4.0)に対応していません。

これは、現在のChrome系ブラウザ拡張がManifest V3(そういう拡張用APIがあります)を前提としているのに対し、ElectronはManifest V2にしか対応していないため(参照: https://github.com/facebook/react/issues/25843)

Electronにブラウザ拡張としてReact DevToolsをインストールするためには、Manifest V2に対応させた非公式バージョンを使うしかなさそう。

というわけで、ブラウザ拡張をインストールするのは結構面倒なんですが、React DevToolsは単体のアプリとしてもリリースされているため、そちらを使ってもよい。

$ npm install -D react-devtools

でインストールして、

$ npx react-devtools

で起動。

こういう画面が出て待機状態になるので、Electronアプリのindex.html<script>タグを仕込む。
注意点としては、このスクリプトはReactロード前に読まれる必要があるため、なるべく上の方に入れましょう。

index.html
<script src="http://localhost:8097"></script>


DevToolsのロードが成功すると、こんな感じでコンポーネントの表示やプロファイリング・レンダリングの可視化などができます。

このタグはdev modeのみで有効化したいんですが、スマートなやり方が思いつかなかったので、URLに?debug パラメータがついている時に有効化するようにしました。

renderer/main.tsx
// main processからdev modeかどうかを取得
const isDev = await utilService.isDev();
if (isDev && document.location.search === "") {
  document.location.href = "./?debug";
}
index.html
    <script>
      if(document.location.search === '?debug') {
        document.write('<script src="http://localhost:8097"></' + 'script>')
      }
    </script>

2023年になってもdocument.writeは依然として有益というわけだ!
(アプリのコードよりも絶対先に読みたい + 条件によって有効化したい、という要件を満たす方法がこれしか思いつかなかった)

何はともあれ良かったですね。

Discussion

sprout2000sprout2000

@todesking さん
参考となる記事をありがとうございます。
同じく React Devtools の V3 移行で困っている者 です。

https://github.com/electron/electron/issues/36545

私の場合、 index.html を汚したくなかったのと毎回スタンドアローン版を立ち上げておくのが面倒だったので、当面の間 Kilian Valkhof 氏が作成した古いバージョンの Devtools パッケージ をプロジェクトフォルダと同じ階層(つまりプロジェクトの)に置いて対処しています。

例)main.ts
  if (isDevelop) {
    const extPath = path.resolve(process.cwd(), "../devtools");
    session.defaultSession.loadExtension(extPath, { allowFileAccess: true });
  }

一時は React Devtools 側の対応により解決したかに見えたのですが、Electron 側での対応も必要だと判明したのち、残念ながら芳しい進展は見えませんね...