Vue.js を使ってメインページ側で動作する Chrome 拡張機能を開発する方法
はじめに
Vue.js を使って Chrome 拡張機能を開発する方法について簡単に整理した。
前回の記事 では、Kocal/vue-web-extension を使った Chrome 拡張機能の開発方法について調べた。が、「Kocal/vue-web-extension では Popup Page や Options Page で Vue.js を使うもの」、つまり「メインページ(メインコンテンツ?)側では使えないもの」という結論に至った。(※自分の中では、の話)
冷静に考えて「メインページ側に使えないわけがない」と思って、どのようにすれば実現できるかについて調査した。
実際に拡張機能を作ってリリースした話 : Vue.js を使ってChrome 拡張機能を作った話(はてなブックマークのコメントを Qiita 記事内に表示) - Qiita
TL;DR
vue.config.jsを用意してvue-cli-serviceでビルドすれば動作することを確認manifest.jsonではchunk-vendors.jsを先に読み込む- minify とか css preprocessor とかはまだ調べきれてない
目次
環境・条件
1 | $ sw_vers |
詳細
どのように調査していったかを時系列に整理しているので、過程は不要という方はリポジトリを見てね。
リポジトリ: 17number/chrome-extension-with-vue-for-main-content
※Vue.js や JS(Node.js)についてプロフェッショナルなわけではないので、用語がおかしいかもだがご容赦を。
第1段階
第1段階として「そもそもメインページ側でも使えるよね?」を確認することとした。NPM は使わずに vue.js は CDN からダウンロードして、src/js/vue.js に配置。
1 | $ curl https://cdn.jsdelivr.net/npm/vue/dist/vue.js -o src/js/vue.js |
Vue.js で利用する HTML 要素(<div id="vue-app"></div>)を insertAdjacentHTML で追加し、データバインディングを試してみる。
src/manifest.json を作成、Permission とかは適当なので注意。動作対象ページは Google のページとした。
1 | { |
src/js/main.js を作成。「input 要素と name を紐付けて、div の中で表示させるだけ」の HTML を form 要素のところに追加する。
1 | (function () { |
これで chrome://extensions にアクセスし、デベロッパーモードで拡張機能(src)を読み込ませる。
問題なく動作することを確認できた。

第2段階
最低限やりたいこと(メインページ側で Vue.js を使う)が実現できるのがわかった。しかし、
- JS でクォート内に HTML をダラダラと書きたくないし、
- コンポーネント分割とかもしたいし、
- 普通に NPM packages を使いたい
ので、第2段階として調査した。
まずは npm init -y で初期化。
1 | $ npm init -y |
vue, @vue/cli-service, vue-template-compiler をインストール。
1 | $ npm i vue |
↑で vue をインストールしたので、src/js/vue.js は削除。
1 | $ rm src/js/vue.js |
src/js/main.js の処理を別ファイルに移植・分割していく。
まずは src/js/components/Hello.vue。表示や入力、入力内容の反映などはここに記述。
1 | <template> |
次に src/js/App.vue。src/js/main.js から 呼び出され、src/js/components/Hello.vue を呼び出す。
1 | <template> |
最後に、エントリポイントとなる src/js/main.js。インポート処理を追加して、vue に関する処理を変更。
1 | import Vue from "vue"; |
ソースコードは完成したので、その他の設定を行っていく。
ビルドは vue-cli-service で行うが、デフォルト設定だとファイル名にハッシュ値が付いたり、ソースマップが生成されたりする。どちらも不要なので vue.config.js を生成してコンフィグを追加。
1 | module.exports = { |
ビルドファイルは dist/js/app.js と dist/js/chunk-vendors.js に出力されるので、src/manifest.json で読み込むファイルを修正。
1 | "js": [ |
package.json を編集してビルド用のスクリプトを追加する。
npm run build:vue-cli-serviceでのビルドを実行npm run release: ビルド、manifest.jsonのコピー、dist/index.htmlの削除を実行
※スクリプト名は各自でしっくりくるものに変更して欲しい。自分でもモヤモヤしている。
1 | "scripts": { |
スクリプトを作成したら、npm run release でビルドしてみる。成功すれば dist 配下にファイルが生成されている。
1 | $ npm run release |
chrome://extensions にアクセスし、第1段階で作った古い拡張機能を削除して、dist の方を読み込ませて動作確認。画像は省略するが、同じように動作すれば OK。
第3段階
あとは Minify 関連について調べる必要がある。Chrome Store で公開しないオレオレ拡張機能なら良いと思うけど、vue-cli-service のデフォルト設定での Minify だとポリシー違反になるかもしれない。
参考: Google Chrome 拡張機能で利用可能な JavaScript の圧縮・難読化ツール
他にも
- SCSS 使いたいとか
- Pug 使いたいとか
- TypeScript 使いたいとか
- vue-cli から上手くやりたいとか
色々とあると思うので、気が向いたら調べて書くと思う。
まとめ
vue.config.jsを用意してvue-cli-serviceでビルドすれば動作することを確認manifest.jsonではchunk-vendors.jsを先に読み込む- minify とか css preprocessor とかはまだ調べきれてない
その他・メモ
rimrafとかcpxとかnpm-run-all使った方が良いと思う- Vue.js の全ての機能が問題なく動作するかについては調べてないので、動かない機能があるかもしれない
- 実際に拡張機能を作ってリリースした話
参考文献
関連記事
- webpack & Babel を使って Chrome 拡張機能を開発するためのテンプレート(Hot Reload 付き)
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- Vue で子コンポーネントのメソッドをコールする
- apertureless/vue-chartjs でチャートの高さ(や幅、サイズ)を変更
- Chart.js で X軸, Y軸の値をカスタマイズ
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア