Chrome拡張のつくり方
Tadashi Aikawa
2024/12/22 Minerva Lightning Talks

Tadashi Aikawa

Productivity Creator since 2010
OS
Windows (開発はUbuntu on WSL)
ターミナル
Windows Terminal / WezTerm (secondary)
言語
TypeScript >> Python = Go > Lua > Rust
エディタ
Neovim / Obsidian
デバイス
EIZO / HHKB Studio / SlimBlade
好き
創作活動・温泉・甘味・動物(ぬいぐるみ含む)
苦手
お酒・車・勉強
楽しい仕事
個人やチームの生産性を上げて成果に繋げる

Agenda

  1. 真にミニマムな拡張作成
  2. 見た目を変える拡張作成
  3. コンテンツをいじる拡張作成
  4. SPAのような拡張作成

Chapter

01

  1. 真にミニマムな拡張作成
  2. 見た目を変える拡張作成
  3. コンテンツをいじる拡張作成
  4. SPAのような拡張作成

Chrome拡張に必要な最低限のファイル

manifest.json

{
  "manifest_version": 3,
  "name": "Sample Chrome Extension",
  "description": "Sample of the Chrome Extension",
  "version": "0.1.0"
}

インストールしてみよう

  1. sample-chrome-extension ディレクトリを作成する
  2. 先ほどの manifest.jsonsample-chrome-extension の中に作成

center

Google Chrome のアドレスバーに chrome://extensions と入力してEnter

center

パッケージ化されていない拡張機能を読み込む から先ほど作成したディレクトリを選択

center

center

追加されていれば成功です🎉

center

Chapter

02

  1. 真にミニマムな拡張作成
  2. 見た目を変える拡張作成
  3. コンテンツをいじる拡張作成
  4. SPAのような拡張作成

文字をすべて赤色にする拡張をつくってみましょう

必要なもの

ファイル名 備考
main.css 見た目の設定を変更します
manifest.json 先ほどより少し項目を追加します

center

CSSファイルの作成

sample-chrome-extension の中に main.css を作成します。

* {
  color: red !important;
}

※ 他の指定より優先するため !important をつけています

すべてのWebページでCSSを適応

manifest.json を編集します。

{
  "manifest_version": 3,
  "name": "Sample Chrome Extension",
  "description": "Sample of the Chrome Extension",
  "version": "0.1.0",
  "content_scripts": [ // コレを追加
    {
      "matches": ["<all_urls>"], // すべてのURL(Webページ)で読み込む
      "css": ["main.css"]        // さきほど作成したCSSファイルを
    }
  ]
}

『拡張のリロード』と『ページのリロード』を忘れずに

chrome://extensions から ボタンを押して 拡張をリロード します。

その後 ブラウザの任意の ページをリロードする と...

特定のページだけに適応させたい

manifest.json で適当するサイトのURLを設定します。

{
  "manifest_version": 3,
  "name": "Sample Chrome Extension",
  "description": "Sample of the Chrome Extension",
  "version": "0.1.0",
  "content_scripts": [
    {
      "matches": ["https://minerva.mamansoft.net/*"], // <all_urls> から具体的なURLのパターンに変更
      "css": ["main.css"]
    }
  ]
}

Chapter

03

  1. 真にミニマムな拡張作成
  2. 見た目を変える拡張作成
  3. コンテンツをいじる拡張作成
  4. SPAのような拡張作成

ページリンクをコピーするボタンをつくろう

この拡張で行う2つのこと

  • ページの右上にボタンを設置する
  • ボタンを押したときページリンクテキストを作成してコピーする

必要なもの

ファイル名 備考
main.js 挙動を設定します
main.css 中身は刷新します
manifest.json 先ほどより少し項目を追加します

JavaScriptファイルの作成

ボタン要素の作成と押したときの挙動を main.js に書きます。

const button = document.createElement("button");             // ボタン要素を作成

button.textContent = "ページリンクコピー";                      // ボタンに表示する文字列をセット
button.className = "copy-button";                            // ボタンのクラスをセット(CSSで使います)
button.addEventListener("click", async () => {               // ボタンが押されたときの処理をセット
  const title = document.querySelector("title").innerText;   // ページのタイトルを取得
  const url = window.location.href;                          // ページのURLを取得

  await navigator.clipboard.writeText(`[${title}](${url})`); // Markdownのリンク形式でクリップボードに登録

  alert(`リンクをコピーしました!\n${title}\n${url}`);           // コピー成功メッセージ
});

document.querySelector("body").appendChild(button);          // ボタンをページに追加

CSSファイルの編集

ボタンを画面右上に常に表示する設定を main.css に書きます。

.copy-button {
  position: absolute;  /* ページ内の絶対座標で位置を指定 */
  top: 8px;            /* 上から8pxの位置 */
  right: 16px;         /* 右端から16pxの位置 */

  cursor: pointer;     /* カーソルがあたったらポインタアイコンを表示 */

  z-index: 10000;      /* どの要素よりも手前に表示 */
}

manifest.jsonの編集

main.jsmain.css 同様に読み込み対象へ追加します。

{
  "manifest_version": 3,
  "name": "Sample Chrome Extension",
  "description": "Sample of the Chrome Extension",
  "version": "0.1.0",
  "content_scripts": [
    {
      "matches": ["https://minerva.mamansoft.net/*"],
      "css": ["main.css"],
      "js": ["main.js"] // コレを追加
    }
  ]
}

リロードしてサイトにアクセスしてみると...

開発のヒント Chrome devtoolsを使おう

full

Chapter

04

  1. 真にミニマムな拡張作成
  2. 見た目を変える拡張作成
  3. コンテンツをいじる拡張作成
  4. SPAのような拡張作成

ここから一気に難易度が上がります

Web開発をしていてこう思ったことありませんか?

私はあります。

  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • デプロイ先は見つかった...けどCORSに悩まされる
    • かといってサーバー立てたくはない(サーバーレス含む)
  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • デプロイ先は見つかった...けどCORSに悩まされる
    • かといってサーバー立てたくはない(サーバーレス含む)
  • ElectronやTauriでクロスプラットフォーム対応バイナリつくる?
    • 面倒くさそうだしバイナリサイズ大きくなりそう...
  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • デプロイ先は見つかった...けどCORSに悩まされる
    • かといってサーバー立てたくはない(サーバーレス含む)
  • ElectronやTauriでクロスプラットフォーム対応バイナリつくる?
    • 面倒くさそうだしバイナリサイズ大きくなりそう...
  • みんなにNode.jsやDeno入れてもらって起動コマンドを実行してもらって...
    • 開発者以外の人がそんなことするわけないじゃないか
  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • デプロイ先は見つかった...けどCORSに悩まされる
    • かといってサーバー立てたくはない(サーバーレス含む)
  • ElectronやTauriでクロスプラットフォーム対応バイナリつくる?
    • 面倒くさそうだしバイナリサイズ大きくなりそう...
  • みんなにNode.jsやDeno入れてもらって起動コマンドを実行してもらって...
    • 開発者以外の人がそんなことするわけないじゃないか
  • Chrome拡張ならなんとかなるのでは...!?
    • 今さら JavaScript/HTML/CSS の世界に戻れないよ
  • ちょっとした便利ツールをつくってみたけどデプロイ先がない
  • デプロイ先は見つかった...けどCORSに悩まされる
    • かといってサーバー立てたくはない(サーバーレス含む)
  • ElectronやTauriでクロスプラットフォーム対応バイナリつくる?
    • 面倒くさそうだしバイナリサイズ大きくなりそう...
  • みんなにNode.jsやDeno入れてもらって起動コマンドを実行してもらって...
    • 開発者以外の人がそんなことするわけないじゃないか
  • Chrome拡張ならなんとかなるのでは...!?
    • 今さら JavaScript/HTML/CSS の世界に戻れないよ
  • TypeScriptとReact/Vueとかでサクっと作れればなぁ...

次世代Web拡張フレームワーク WXT

WXTのすごいところ

  • 多くのブラウザをサポート
    • Chrome, Firefox, Edge, Safari, その他 Chromiumベースのブラウザに対応
  • デフォルトでTypeScriptをサポート
  • 主要フレームワークをサポート
    • Reacta, Vue, Svelte, Solid, ... etc
  • ファイルベースのエントリポイントサポート
  • ホットリロードサポート
  • Viteプラグインサポート
  • ルーティングサポート
  • Auto-imports サポート

Vue開発者のわたしから見て、一言で言うと...

あ…ありのまま 今 起こった事を話すぜ!

おれはWXTで開発をしていたと思ったらいつのまにか nuxt.config.ts を探していた…

な… 何を言ってるのか わからねーと思うがおれも何をされたのかわからなかった… 頭がどうにかなりそうだった…

Feniceのプロジェクトルート
Feniceのwxt.config.ts

entrypointsが重要

  • entrypoints 配下のディレクトリがパスになる
    • chrome-extension://<拡張ID>/top.html で トップへ
    • chrome-extension://<拡張ID>/settings.html で 設定へ
  • 一部名称は予約語としてChrome拡張が認識する
    • popup はポップアップの実装
    • background はService Worker
    • content はContent Scripts
  • 各endpointでそれぞれVueが初期化される
    • index.html -> main.ts -> App.vue の順で初期化
  • 単一endpoint内のルーティングも可能(らしい)
    • ハッシュモードが必要
Feniceの top/App.vue では KeepAlive とcomponent :is を使って疑似的な複数ページを表現している

まとめ

  • Web初心者の方向け
    • manifest.json だけでChrome拡張はできる
    • 見た目を変えるならCSSファイルを書く
    • 操作をするならJavaScriptファイルを書く
  • Web中級者以上の方向け
    • WXTを使うといつものWeb開発と同じノリでChrome拡張開発ができる

仕事だったら『所属』『代表プロダクト』『入社年』などを入れる