Chrome拡張機能のテンプレートを作る [TS + React + Vite]
まずはアイコンをクリックしたら動くところまで作成する
1. viteで初期化
npm create vite@latest
いろいろ質問されるので次のように設定
- プロジェクト名:sample(任意)
- フレームワーク:React
- プログラミング言語:TypeScript
crxjsを使うためにviteのバージョンをlatestではなく4.2を指定してインストールする。ソース。4.3だとエラーが出てしまうからだ。
2. パッケージをインストール
cd sample
npm i
3. 拡張機能開発に便利なパッケージを追加でインストール
npm i -D @crxjs/vite-plugin@beta @types/chrome @extend-chrome/storage
@crxjs/vite-plugin@betaViteユーザーのChrome拡張用プラグイン。Vite3もVite4も対応がまだなので公式サイトでもベータを使うようにとのこと。
@types/chrome:Chrome API で定義されてる関数やらをVSCodeで自動補完してくれる
@chrome/storage :ストレージを扱うときに型付けをしたり、acync/await が使えるようになる。コールバック地獄から抜け出せる。
いずれも開発用でしか使わないから -D
を指定する。
vite.config.ts
を編集
4. import { crx, defineManifest } from "@crxjs/vite-plugin";
import { defineConfig } from "vite";
const manifest = defineManifest({
manifest_version: 3,
name: "CRX Example",
version: "1.0.0",
action: {
default_popup: "index.html",
},
});
// https://vitejs.dev/config/
export default defineConfig({
plugins: [crx({ manifest })],
// serverの設定をしないと WebSocket connection to 'ws://localhost/' failed: というエラーが出る
// https://github.com/crxjs/chrome-extension-tools/issues/746#issuecomment-1647484887
server: {
port: 5174,
strictPort: true,
hmr: {
port: 5174,
},
}
});
manifest.jsonを定義してもいいかも。 JSON Schema Store というのを使えばJSONでもオートコンプリートが使えるらしい。VSCodeの拡張機能をインストールすればいいので試してみたい。やっぱ標準通り、manifest.json が定義されているのがいい。
VScodeのsetting.json
に次のコードを書き加える。するとJSONでオートコンプリートが使えるようになる。
{
"json.schemas": [
{
"fileMatch": ["manifest.json"],
"url": "https://json.schemastore.org/chrome-manifest.json"
}
]
}
https://crxjs.dev/vite-plugin/concepts/manifest#json-schema
5. ビルド
npm run dev
distフォルダが作成される。これが拡張機能のソースコード
6. 拡張機能を Chromeに追加する
- アドレスバーでchrome://extensions/と検索してChromeの拡張機能ページに移動
- 「デベロッパーモードをオン」
- パッケージ化されていない拡張機能を読み込む」を押下
- 選択ダイアログでdistフォルダを選択
次に、src
ディレクトリ直下に popup
やoption
というディレクトリを作ってソースコードを整理していく。
下に書いているのは保留。
https://github.com/ElForastero/react-browser-extension-boilerplate/tree/master/src
このプロジェクトみたいにしたい
index.html ではなく、popup.htmlとoptions.htmlを作って管理したい。
あとコンポーネントは componentsで管理するのが筋だろう。わざわざ別フォルダとして popup と options を切り出す意味がわからない。
あとreactは1つのプロジェクトに1つのhtmlとかいうのを指定してるはずだからこういうときどうするのかわからん。一度reactの勉強をしてから再調査する。あと、githubのmanifestではoption.html、popup.htmlを指定してあるがそういうファイルはない。動的に作っているのか?だとしたらわかりにいから微妙。
いやでもこのプロジェクトのように切り出すのがいいかもな
https://github.com/fxnoob/browser-extension-boilerplate/tree/master/src
1. popup ディレクトリを作成
-
src
ディレクトリの下にpopup
ディレクトリを作成する -
main.tsx
、App.tsx
、App.css
をpopup
配下に移動
ルートディレクトリのindex.html
はポップアップのhtmlとして使うので移動はしない。
2. ディレクトリ移動により変わってしまった読み込みパスを修正する
-
index.html
を書き換える
ポップアップに関連するファイルはpopup
ディレクトリ配下に移動したので、index.html
で読み込む ts ファイルもそれに合わせる
<script type="module" src="/src/popup/main.tsx"></script>
-
src/popup/main.tsx
を書き換える
同様に、main.tsx
を移動したことによりこのファイルで読み込んでいるindex.css
のパスを書き換えます
import '../../index.css'
-
src/popup/App.tsx
を書き換える
同様に、このファイルで読み込んでいる、react.svg
のパスを書き換えます
import reactLogo from '../assets/react.svg'
popup
ディレクトリをコピーし、options
と名前を変更する
3. オプションページもポップアップとほぼ同じ構造をしているので使い回します。
index.html
と index.css
を popup
配下に作成
4. ポップアップで使ったhtmlとcssファイルはオプションページ用に新たに作成します。