なんて美しい夕陽だ🌇

プログラミング、日常、忘れないように書いていきます

Reactフレームワーク「Plasmo」でGitHubのコミット差分のページURLを生成するChrome拡張を作った

GitHub Compare URL Generatorのデモ

GitHubでコミット差分のページURLを生成するChrome拡張を作りました。

一度コードレビューして貰ったPRの再レビューで、修正した部分のみをレビュワーに共有したい時に、コミット比較のページを共有することがありました。例えば、このようなリンクです。

https://github.com/octocat/linguist/compare/master...octocat:an-example-comparison-for-docs

リポジトリURLの後に /compare/{変更前}...{変更後} のようなパスを指定することでコミット差分を表示できます。ブランチやコミットハッシュを指定することができます。このフォーマットを覚えることができなかったため、度々 公式ドキュメント を見に行っており、URLをChrome拡張で作ることができたら便利だと思ったのが作ったきっかけです。

目次

利用した技術

  • React
  • Plasmo
  • TailwindCSS

この中でも、初めて挑戦した技術は Plasmo です。Chrome Web Storeへの公開までもフレームワークの中で実現出来ると聞き興味を持っていました。

以下の記事に、Plasmoについてとても丁寧に解説されているので参考になります。

zenn.dev

Plasmoについて

Welcome to Plasmo, the all-in-one platform that makes it easy for browser extension developers to create, test, and publish amazing extensions.

ブラウザ拡張機能を簡単に作成、テスト、公開できるプラットフォームだと紹介されています。React以外にも、Vue.jsやSvelte等もサポートしています。

docs.plasmo.com

Plasmoのセットアップ

Plasmoのセットアップ方法を記載します。パッケージマネージャーとしてはpnpmが強く推奨されていますが、Voltaでバージョンを管理する都合上、yarnで実施しました。(困ったらpnpmに切り替える予定でした。)

まずはPlasmoのプロジェクトを作成します。対話形式で情報の拡張機能の名前などを記入します。

$ yarn create plasmo
yarn create v1.22.19
warning package.json: No license field
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Installed "create-plasmo@0.83.0" with binaries:
      - create-plasmo
🟣 Plasmo v0.83.0
🔴 The Browser Extension Framework
🟡 Extension name: github-compare-url-generator
🟡 Extension description: A basic Plasmo extension.
🟡 Author name: Hideki Okawa <h.okawa0303@gmail.com>

developmentサーバーを立ち上げます。

$ yarn dev

このコマンドは、ファイルの変更を監視し build/chrome-mv3-dev の生成を行います。そうすることで、ブラウザに拡張機能を自動で読み込むことができます。

chrome://extensions/ にアクセスし、デベロッパーモードを有効にします。

「パッケージがされていない拡張機能を読み込む」をクリックし、先ほど作成した build/chrome-mv3-dev を選択することで、Chrome上に作成したChrome拡張機能を表示することができます。初期構築のタイミングで、すでに以下のポップアップが出来上がっています。

書いたコード

ここでは、今回の機能を実現するにあたり利用したメソッドを紹介します。

開いているタブのURLを取得する

タブに開いているリポジトリのURLを取得するために chrome.tabs.query を利用しました。

chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
  const repositoryURL = parseGitHubRepositoryURL(tabs[0].url)
  setRepositoryURL(repositoryURL)
})

ref: https://developer.chrome.com/docs/extensions/reference/tabs/#method-query

クリップボードにコピーする

生成したURLをクリップボードにコピーするために、navigator.clipboard.writeText を利用しました。

navigator.clipboard.writeText(compareURL)

ref: https://developer.mozilla.org/ja/docs/Web/API/Clipboard/writeText

別タブで開く

生成したURLを別タブで開くために、 chrome.tabs.create を利用しました。

chrome.tabs.create({ url: compareURL })

ref: https://developer.chrome.com/docs/extensions/reference/tabs/#method-create

最後に

思ったよりもサクサクとChrome拡張を作ることができて感動しました。 これから、開発した拡張の機能の公開の申請もしようと思っているので、公開できたら記事を書こうと思います。