React/TypeScriptでEdge拡張を作ってみる(Create React App)

ChromiumベースのMicrosoft EdgeChrome拡張が使えるとか聞いた気がするので
Create React Appで作ったものを拡張機能にできるのか試してみました。

ひな型作成

まずはCreate React Appでひな型を作成します。
Create React Appの詳細な説明は省略しますがFacebook公式のReactのboilerplateです。

npx create-react-app sample --typescript

これでsampleというディレクトリにReactのひな型が作成されました。
f:id:Shinji_Japan:20191115223248p:plain

sampleディレクトリに移動して以下のコマンドを実行します

yarn start

ブラウザが起動しreactのひな型が起動します。
f:id:Shinji_Japan:20191115214646p:plain

作成したひな型をEdge拡張に

ではこれをEdge拡張にしてみましょう。
publicディレクトリ内のmanifest.jsonを以下のように書き換えます。

public/manifest.json

{
  "manifest_version": 2,
  "version": "1.0",
  "name": "CRA Sample",
  "description": "CRAで作ってみた",
  "browser_action": {
    "default_icon": "logo512.png",
    "default_popup": "index.html"
  }
}

書き換えたらビルドします。

yarn build

buildディレクトリが作成され、中にビルド結果が出力されます。
f:id:Shinji_Japan:20191115220340p:plain

ビルド結果をEdgeの拡張機能として追加

Edgeの右上のアイコンをクリックして「拡張機能」を選択し f:id:Shinji_Japan:20191115215434p:plain 左上のハンバーガーアイコンをクリックし f:id:Shinji_Japan:20191115215456p:plain 「開発者モード」をONにします。 f:id:Shinji_Japan:20191115215556p:plain

「展開して読み込み」を選択し f:id:Shinji_Japan:20191115215521p:plain

先ほど作成されたbuildディレクトリを指定します f:id:Shinji_Japan:20191115220423p:plain

拡張機能が追加され、アドレスバーの横にアイコンが表示されました。 f:id:Shinji_Japan:20191115220638p:plain アイコンを押してみると f:id:Shinji_Japan:20191115220710p:plain

エラーになりました。 f:id:Shinji_Japan:20191115220945p:plain inline scriptはダメと怒られているようです。
ひとまず「すべてクリア」でエラーを消しておきましょう。

エラー修正

buildディレクトリ内のindex.htmlを見てみましょう。
この部分がダメっぽいです。 f:id:Shinji_Japan:20191115223822p:plain

sampleディレクトリ直下に.envファイルを以下の内容で追加します。

INLINE_RUNTIME_CHUNK=false

これはインラインスクリプト部分をいい感じに外出しにしてねというやつです。
でビルド

yarn build

インラインスクリプト部分がいい感じに外出しされました。
f:id:Shinji_Japan:20191115224735p:plain

再びEdgeを開きアドレスバー横の拡張機能アイコンを押すと f:id:Shinji_Japan:20191115220926p:plain

動きました。ちっちゃ!

さすがにアレなのでサイズを指定しましょう。
あまりお行儀良くないですがスタイルに直に幅と高さを記述します。
src/App.tsx

import React from "react";
import logo from "./logo.svg";
import "./App.css";

const App: React.FC = () => {
  return (
    <div className="App" style={{ width: "500px", height: "500px" }}>
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
};

export default App;

で、またビルド

yarn build

f:id:Shinji_Japan:20191115221012p:plain 動きました。

簡単でしたね。

作成した拡張機能を試しにChromeで動かしてみるとそのまま問題なく動くことが確認できます。 f:id:Shinji_Japan:20191115225106p:plain