Show HN: ビルド設定なしで Web 拡張機能を作成する CLI ツールを開発
(github.com/cezaraugusto)- Extension.jsは Chrome、Edge、Firefox 向けの Web 拡張機能をビルドする CLI で、
npx extension@latest create my-extensionとnpm run devだけで開発を始められる - Manifest V3 の断片化、ブラウザごとの差異、コンテンツスクリプトのホットリロード不足、対象ごとに別々のビルドパイプラインが必要な問題を、設定不要の開発フローへと減らすことを目指している
- background、content、popup、options スクリプトに Hot Module Replacement を提供し、React、Vue、Svelte、Preact コンポーネントと TypeScript を第一級でサポートする
extension build --zipで Chrome Web Store、Edge Add-ons、Firefox AMO 提出用の本番 ZIPを作成でき、--browser=firefoxのようなブラウザ別ビルドも可能- 既存の拡張機能にも
extension@latestを開発依存関係として追加し、build、dev、previewスクリプトを接続する形で導入できる
Extension.js が解決しようとしている問題
- Extension.js は Chrome、Edge、Firefox 拡張機能を作るための CLI ツール
- 基本的な利用フローは、新しいプロジェクトを作成して開発サーバーを起動する形
npx extension@latest create my-extensioncd my-extensionnpm run dev
npm、pnpm、yarn、bunとともに動作する- ドキュメント、テンプレート、サンプルはそれぞれ Documentation、Templates、Examples で提供される
開発体験と主要機能
- ブラウザ拡張開発で直面する Manifest V3 の断片化、ブラウザごとの差異、コンテンツスクリプトのホットリロード不足、対象ごとのビルドパイプラインの問題を減らすことに重点を置いている
- Hot Module Replacement は background、content、popup、options スクリプトに適用される
- React、Vue、Svelte、Preact コンポーネントも含む
- Manifest V3 を標準で使用し、Chrome、Edge、Firefox 向けの自動アダプターを提供する
- 1 つの CLI で Chrome、Edge、Firefox と Chromium または Gecko ベースのバイナリを対象に実行できる
- webpack、rollup、保守が必要なプラグインなしで zero config を志向する
- TypeScript、React、Vue、Svelte、Preact を第一級でサポートする
extension build --zipで Chrome Web Store と Firefox Add-ons 提出向けの本番ビルドを作成できる- 既存の拡張機能にも 1 つの
devDependencyとして追加できる
他の拡張開発ツールとの違い
- Plasmo、WXT、CRXJS を使ったことがあるユーザー向けに、Extension.js の違いを機能別に示している
- GitHub サンプルを直接実行できる
- 例:
extension dev https://github.com/.../sample
- 例:
- 管理されたブラウザバイナリを提供する
- 例:
extension install firefoxで隔離された Firefox ビルドをダウンロードする
- 例:
- コンテンツスクリプト向けのクロスブラウザ HMRが組み込まれており、追加プラグインの接続は不要
- ストア提出用の本番 ZIP を作成できる
- 例:
extension build --zip
- 例:
- フレームワーク非依存
- カスタム Chromium および Gecko バイナリを指定できる
--chromium-binary--gecko-binary
対応フレームワークとブラウザ
- 対応フレームワークと実行例はテンプレートまたはサンプルとして提供される
extension dev、extension start、extension previewではブラウザ関連フラグを使用できる--browser <chrome | edge | firefox>でブラウザを選択する--chromium-binary <path-to-binary>でカスタム Chromium バイナリを指定する--gecko-binary <path-to-binary>でカスタム Gecko または Firefox バイナリを指定する
- 対応ブラウザは Google Chrome、Microsoft Edge、Mozilla Firefox、Chromium ベース、Gecko ベース
- Apple Safari は
Nextと表示されている
ビルド、パッケージング、管理ブラウザ
- 本番ビルドは
npx extension@latest buildで実行する - ストア提出用 ZIP パッケージは
npx extension@latest build --zipで生成する - ブラウザ別ビルドも可能
- 例:
npx extension@latest build --browser=firefox --zip
- 例:
- 便利なビルドフラグが用意されている
--zip: ストアアップロード用 ZIP にパッケージングする--zip-source: ストアのソースコード審査向けにソースファイルを含める--zip-filename <name>: 出力ファイル名を制御する--polyfill: クロスブラウザ webextension polyfill を有効化する
- Extension.js はクリーンな開発セッションのために、隔離されたブラウザバイナリをダウンロードして管理できる
npx extension@latest install firefoxnpx extension@latest install --browser=allnpx extension@latest install --where
既存の拡張機能とサンプル実行
- 既存の拡張機能には開発依存関係としてインストールする
npm install extension@latest --save-dev
package.jsonのスクリプトでextension build、extension dev、extension previewを接続して使えるnpm run dev: 開発npm run build: 本番ビルドnpm run preview: 本番出力の確認
- Chrome Extension Samples のサンプルを直接取得して実行できる
- 例:
npx extension@latest dev https://github.com/GoogleChrome/chrome-extensions-samples/… --browser=edge
- 例:
- コミュニティとサンプルは Discord、GitHub issues、examples で提供される
- ライセンスは MIT
1件のコメント
Hacker Newsのコメント
素晴らしいプロジェクト。自分の拡張機能(https://github.com/herrherrmann/omnivore-list-popup)でも試してみようと思う
これまでは拡張機能のビルドや開発モードの管理を自前のスクリプトで処理していたが、すでに web-ext で楽にできるかを見ていた
ただ、メインブラウザが Firefox なのに、Extension.js はまだ Firefox を完全にはサポートしていないように見える
--polyfillフラグを付ければ Chrome や Edge で実行できるが、現時点では Firefox には拡張機能を手動で追加する必要がある近いうちに Firefox サポート を入れる予定ではあるが、今のところブラウザランチャーがない
まさに今必要なツール。作って共有してくれてありがとう。Firefox サポート がうまく進むことを期待している
Firefox サポートの issue: https://github.com/cezaraugusto/extension.js/issues/5
manifest.jsonの競合する要件を扱う助けになるとよさそうたとえば イベントページとバックグラウンドサービスワーカー の違い、あるいはブラウザごとに要求されたり禁止されたりする権限が一貫していないことがある
ちょっと混乱している。すでに Chrome 専用の拡張機能を JavaScript で書いたことがあるが、始めるのは Chrome 拡張機能のドキュメントサイトから数ファイルをコピーする程度だった
IDE の設定は特にしていないし、何をすべきなのかもよくわからない
このツールが数ファイルをコピーする以上に何をしてくれるのか理解したい。クロスブラウザ対応 なのか、多言語対応なのかが気になる
Chrome 拡張機能のドキュメントから数ファイルをコピーした後は、ブラウザで「開発者モード」を自分で有効にしてファイルを追加しなければならない。コードを変えたら、ブラウザ拡張機能が影響する複数の実行コンテキストを手動でリフレッシュして変更を確認する必要がある。複数ブラウザでテストするなら、この工程をそれぞれで繰り返さなければならない
TypeScript や JavaScript フレームワークのようなパッケージ依存を使いたければ、既存の拡張機能抽象化フレームワークに依存して新しいやり方を学ぶか、webpack、Parcel、esbuild のようなツールで自分で設定を作る必要がある。このあたりまで来ると、ブラウザ拡張機能の開発は複雑で面倒になりがちだ
Extension.js は、開発用ブラウザで拡張機能をバンドルして実行する過程を自動化することで、これをシンプルにしている。HTML/CSS/JavaScript だけでなくブラウザ領域まで含めたすべての実行コンテキストで 自動リロード をサポートし、TypeScript や React のようなコード依存も追加設定なしでインストールするだけで使える。複数ブラウザでも同時に動作する
良いプロジェクト。最初の Chrome 拡張機能は https://crxjs.dev/vite-plugin/getting-started で作ったが、スタイルをきちんと動かすのにかなり手がかかった
初めての ブラウザ拡張機能開発 だったからかもしれない: https://chromewebstore.google.com/detail/bettermenu-for-door...
まだやることが多いので、このプロジェクトもチェックしてみるつもり
本当に素晴らしい。README まで美しくよくできている
Google Play があまりにひどいのでアプリに拡張機能を付けるのを先延ばしにしていたが、これを一度試してみるつもり
いいね。似たフレームワークの Plasmo と比べるとどう違うのか気になる
https://www.plasmo.com/
ブラウザ拡張機能そのものとは必ずしも関係のない設定ファイルや特定のルールにも従わなければならない
一方で Extension.js は標準の拡張 API で拡張機能を作れるようにし、設定ファイルだけを抽象化する。ツール固有の細かいやり方を学ぶ必要がない。だから Chrome や MDN のサンプルがマニフェストファイルを単一の基準として動くなら、Extension.js で使うためにリファクタリングする必要がなく、新しいプロジェクトの開始やプロトタイプ作成がしやすい
拡張機能をいくつか作ったことがある。ひとつはネタで、imgur がハートの色を変えて皆が不満だったときに、その色を変える拡張機能だった
Chrome 拡張機能を作るたびに インポスター症候群 がかなり強く出る。なぜか新規プロジェクトを作るのがすごく難しいので、こういうツールがあると本当にありがたい
気に入った。拡張機能とタブ間の通信 にも少し魔法をかけてくれるといいのに
拡張機能を作るたびに DOM を読んだり、拡張機能からアクティブタブへメッセージを送ったりする過程がいつもつらい
https://docs.plasmo.com/framework/messaging
issue をひとつ追加した。Safari サポートは Apple の safari-web-extension-converter CLI ツールを使えば比較的シンプルそう
良さそう。自分の拡張機能 Vim for Docs で一度試してみるつもり
Firefox がサポートされていないのは残念だが、そもそも Firefox と Chromium 系ブラウザ の両方をサポートする拡張機能ビルドツール自体あまりない