Learn Chrome拡張 in Y minutes

copy-markdown-linkという素朴なChrome拡張のコミットログを追いかけて、Chrome拡張のつくりかたを学ぼう。

つくるもの

拡張のアイコンをクリックするかショートカットキーを押すと、Markdown形式でリンクをコピーする、という拡張をつくる。

node -v

念のため、Node.jsのバージョンを確認しておこう。Node.js 18.0.0を使っているが、もう少し古くても多分大丈夫。

$ node -v
v18.0.0
$ npm -v
8.6.0

npm init vite@latest

npm init vite@latest で雛形をつくる。

npm init vite@latest
cd copy-markdown-link

雛形生成時に幾つか質問されるので、次のように入力した。React等は不要で、TypeScriptで書く。

Project name: copy-markdown-link
Select a framework: vanilla
Select a variant: vanilla-ts

npm install

npm install でpackage-lock.jsonをつくってcommitしておく。

npm install

@crxjs/vite-plugin

Vite向けのChrome拡張用プラグインを入れる。これがあると、manifest.jsonを元に良い感じにViteを設定してくれる。具体的には、どのファイルをどうコンパイルすべきかを、manifest.jsonの内容から推測してくれる。

npm install --save-dev @crxjs/vite-plugin

manifest.json & vite.config.ts

manifest.jsonを書く。

アイコンを押すか Ctrl+M を押すとポップアップを開くようにしてもらう。また、必要な権限を定義しておく。現在開いているタブのURLとタイトルを取得するために activeTab を、でクリップボードに書き込むために clipboardWrite を使う。

更に、Viteの設定ファイルを用意して、さっき入れたプラグインの設定もする。

この時点で、npm run dev または npm run build を実行して ./dist ディレクトリを拡張として読み込ませると、拡張が動くようになる。ソースコードを変更したらビルドして再読み込みのボタンを押す必要がある。

拡張のアイコンを押すとポップアップが表示される。

index.html

ポップアップ時に表示されるHTMLの内容を、デフォルトのものから変更する。"Copied" と表示して、src/main.tsを読み込むだけ。

シンプルになった。

@types/chrome

TypeScriptでChrome拡張のAPIを利用するとき、これが無いと怒られが発生するので、chrome オブジェクト関係の諸々の型定義を追加しておく。

npm install --save-dev @types/chrome

src/main.ts

現在開かれているタブのURLとタイトルをMarkdownのリンク形式でコピーする、というコードを書く。

images/icon*.png

Chrome拡張が欲しがりそうなアイコン画像を用意する。アイコンはimagemagickで機械的に生成することに。

ビルドして再読み込みさせると、拡張のアイコンが変わる。

完成

これで完成。おつかれさまでした。

参考情報

今後の開発の参考になりそうページへのリンクを掲載しておく。