Create React App に Electron を導入してみた

2021-08-31

完全に TypeScript をサポートした記事が少なかったので、備忘録がてら。

さっき正常動作が確認できたばかりなので、本当に最小限の設定なのであしからず。

Create React App をインストールする

いつもどおりのコマンドです。

npx create-react-app hoge --use-npm --template typescript

Electron の開発周りの npm パッケージを追加する

自分が追加したのは以下のとおりです。

  • concurrently
  • electron
  • electron-is-dev
  • electron-reload
  • npm-run-all
  • wait-on

dependencies なり devDependencies なり、お好きな方にどうぞ。

Electron 起動用のファイルを作る

今回はルートディレクトリ以下に electron.ts を作成しました。

import { app, BrowserWindow } from "electron";
import path from "path";
import isDev from "electron-is-dev";

function createWindow() {
  const browserWindow = new BrowserWindow({
    width: 800,
    height: 600,
  });

  browserWindow.loadURL(
    isDev
      ? "http://localhost:3000/index.html"
      : // 動作未確認です
        `file://${__dirname}/public/index.html`,
  );

  if (isDev) {
    require("electron-reload")(__dirname, {
      electron: path.join(__dirname, "node_modules", ".bin", "electron"),
      forceHardReset: true,
      hardResetMethod: "exit",
    });

    const { webContents } = browserWindow;

    webContents.openDevTools();
  }
}

app.whenReady().then(createWindow);

app.on("activate", () => {
  const browserWindows = BrowserWindow.getAllWindows();

  if (browserWindows.length) {
    return;
  }

  createWindow();
});

app.on("window-all-closed", () => {
  if (process.platform === "darwin") {
    return;
  }

  app.quit();
});

Electron 用の tsconfig ファイルを作る

今回は tsconfig.electron.json という名前でルートディレクトリ直下に配置しました。

{
  "compilerOptions": {
    "baseUrl": "src",
    "esModuleInterop": true,
    "jsx": "react-jsx",
    "module": "CommonJS",
    "outDir": "./dist"
  }
}

内容はよしなにお願いします。

スクリプトを追加する

ひとまず以下のスクリプトを追加してみました、Windows だとちょっと動作するか怪しいですが…。

{
  "scripts": {
    ...,
    "dev": "rimraf ./dist && npm run tsc:electron && run-p tsc:electron:watch start:electron",
    "start:electron": "concurrently -k 'BROWSER=none npm start' 'wait-on tcp:3000 && electron .'",
    "tsc:electron": "tsc -p ./tsconfig.electron.json",
    "tsc:electron:watch": "tsc -p ./tsconfig.electron.json -w"
  },
}

main ファイルを設定する

続けて package.json に main フィールドを追加します。

{
  "main": "./dist/electron.js"
}

起動する

npm run dev で起動します。


そんな感じです。

多分まだ漏れがあるとは思いますが、ひとまず。