webpack & Babel を使って Chrome 拡張機能を開発するためのテンプレート(Hot Reload 付き)
はじめに
webpack & Babel を使って Chrome 拡張機能を良い感じに開発できるテンプレート(Hot Reload 付き)を作った。
TL;DR
- webpack & Babel を使って Chrome 拡張機能を良い感じに開発できるテンプレートを作った
- Hot Reload に対応 (rubenspgcavalcante/webpack-extension-reloader を使用)
- 色々と苦労したので、メモ 兼 備忘録も簡単にまとめた
目次
環境・条件
1 | $ sw_vers |
詳細
リポジトリ
17number/chrome-extension-template-webpack-babel
テンプレート機能概要
webpack & Babel でモダン JavaScript を利用可能
require
やimport
が利用可能?.
(Optional Chaining) などが利用可能
※どちらもそのまま書くとエラーになる
Hot Reload 対応
npm run watch
で Watch モード、かつ Hot Reload
※npm run watch
後に chrome://extensions
から再読み込みする必要あり
zip ファイルの作成
npm run release [<version>]
でリリースファイル(zip ファイル)の作成
1 | $ npm run release |
(まだ)やれてないこと
そのうちやる(と思う)
その他 細かい解説(兼 メモ)
※ただ使うだけであればここは読み飛ばして OK
webpack も Babel もふわっと知ってる程度の知識でスタートしたので、色々と勉強になった。
忘れないように「何をどうやっているのか」などについて簡単にメモしておく。あくまでも参考ページへのリンクや、簡単な説明のみに留めるので、細かい部分は公式ドキュメントを要確認。
なお、前述の通りほぼ素人からのスタートなので、誤りとか「それド基本では?」みたいな内容も多々あると思う。
webpack
webpack は分割されているファイルを良い感じにまとめてくれる(Bundle してくれる)ツール。
webpackとBabelの基本を理解する(1) ―webpack編― - Qiita が平易でわかりやすい。
CLI
参考: Command Line Interface | webpack
webpack
コマンドでビルド(Bundle)
1 | $ webpack |
--config
オプションで使用するコンフィグを指定可能。OSS で良く見かける npm run dev
とか npm run prod
などは、このコンフィグを切り替えて実行しているだけ(のことが多い)。
1 | $ webpack --config <path-to-file> |
--watch
オプションを付けて実行することで、ファイル変更を検知したら即ビルドするようになる。
1 | $ webpack --watch |
エントリーファイル 指定/分割
entry
オプションで、起点となるファイルを指定できる。
1 | module.exports = { |
複数指定する場合は Object
形式 で指定する。
1 | module.exports = { |
なお、単一指定(entry: './file.js
)だと dist/main.js
に、Object
形式だと dist/<object key>.js
にファイルが出力される。
※デフォルト(output
オプション未指定)の場合
処理対象ファイル、処理内容の定義
参考:
起点は前章の entry
で指定したので、「どんなファイル」に「どんな処理を適用するか」を module.rules
で定義。
以下のようなイメージ。
scss
ファイルならcss
にコンパイルjs
ファイルなら Babel でトランスパイル- etc
test
で対象ファイルを指定し、use
で適用処理を記述。
use
は後ろから適用していくので、複数記述する場合には注意が必要。
1 | module.exports = { |
ビルドファイルのクリア
参考: Output Management | webpack
johnagan/clean-webpack-plugin を使うと、ビルド(Bundle)実行前に既存ファイルを削除してくれる。
(残骸が残ることによる意図しない動作を防ぐことができる)
1 | const { CleanWebpackPlugin } = require("clean-webpack-plugin"); |
設定ファイルの分割
参考:
公式ガイド にも記載があるが、survivejs/webpack-merge を使うことで、共通設定/開発環境設定/本番環境設定 などを分けることができる。
1 | module.exports = { |
1 | const { merge } = require('webpack-merge'); |
公式ガイド側の記述方法は古い部分があるので、survivejs/webpack-merge を見た方が良い。(2020/07/12 現在)
具体的には以下だとエラーになる。
1 | const merge = require('webpack-merge'); |
静的ファイルなどのコピー
参考: CopyWebpackPlugin | webpack
webpack-contrib/copy-webpack-plugin を使うことでファイルのコピーが可能。
patterns
でコピー対象や、コピー先、除外対象などを指定できる。
除外対象は globOptions
内の ignore
で指定。
1 | const CopyPlugin = require("copy-webpack-plugin"); |
Sass/SCSS ファイルを使う
以下をインストールして、webpack の設定を行うと Sass/SCSS ファイルを使うことができる
1 | $ npm i -D sass sass-loader css-loader style-loader |
webpack.xxxx.js
1 | module.exports = { |
xxxx.js
1 | import './path/to/scss.scss'; |
Hot Reload
参考:
- ReactでChrome Extensionを開発するために必要なwebpackのビルド設定 - code-log
- hiro08gh/chrome-extension-template: ReactでChrome Extensionを開発するためのテンプレート
rubenspgcavalcante/webpack-extension-reloader を使うことで、Chrome 拡張機能を Hot Reload できるようになる。
1 | const path = require('path'); |
contentScript
などには entry
で指定したキーを設定する。
※自分は webpack.common.js
で entry
を定義している。
その他の詳細は How to use を参照。
Hot Reload を watch でのみ有効化
参考:
module.exports = {...}
を module.exports = (env, argv) => {...}
にすることで、実行時オプションを参照できるようになる。
※公式だと Exporting a Function | Configuration Types や Mode | webpack にさらっと書かれてる。
で、--watch
(or -w
)で実行すると argv
に { watch: true, w: true }
が追加される。
上記をもとに webpack.dev.js
を以下のように修正。
1 | const path = require('path'); |
Terser による Minify
参考: TerserWebpackPlugin | webpack
webpack-contrib/terser-webpack-plugin
設定ファイルを分割して、本番向けの webpack.prod.js
に定義。
1 | const TerserPlugin = require('terser-webpack-plugin'); |
ascii_only: false
にしておかないと、日本語などが \u1234
のようにエスケープされてしまい、リリース時の審査に通らないので注意。
その他細かい設定は本家 terser/terser も見た方が良い。
Babel
Babel は最新の書き方(構文)を使っているコードを、各ブラウザ(など)が理解できるコードに変換(トランスパイル)してくれるツール。
これも webpackとBabelの基本を理解する(2) ―Babel編― - Qiita がわかりやすい。
webpack から Babel を利用
途中(処理対象ファイル、処理内容の定義) で出てきたが、babel/babel-loader を使うことで、webpack の流れで Babel によるトランスパイルを適用できる。
use
内の options
で詳細設定しても良いし、babel.config.json
や babel.config.js
, .babelrc
などの別ファイル に設定を切り出しても良い。
今回は babel.config.js
として切り出している。
1 | module.exports = { |
1 | module.exports = function (api) { |
Chrome 拡張機能として動作させるための設定
参考:
- Babel7.4で非推奨になったbabel/polyfillの代替手段と設定方法
- Babel 7.4.0で非推奨になった@babel/polyfillを使わず、core-js@3で環境構築する | nansystem
↑を参考に useBuiltIns: "usage"
を使ってみたが、自分の環境ではエラーになった。
useBuiltIns: "entry"
にしつつ、JS 側で import 'core-js'
とすると動作したが、useBuiltIns
無しでも動作したため現時点ではどちらもコメントアウトしている。
NPM Scripts
圧縮
引数でのバージョン指定に対応したかったので、release.js
を作成し、npm run release
で実行するようにしている。
まとめ
- webpack & Babel を使って Chrome 拡張機能を良い感じに開発できるテンプレートを作った
- Hot Reload に対応 (rubenspgcavalcante/webpack-extension-reloader を使用)
- 色々と苦労したので、メモ 兼 備忘録も簡単にまとめた
その他・メモ
このへんのやつもちゃんとやりたい
- webpackのTree Shakingを理解して不要なコードがバンドルされるのを防ぐ - Qiita
- Code Splitting | webpack
- 共通的に使うライブラリを良い感じにしてくれたりな設定(という認識)
参考文献
※主に記事内で紹介したもの以外
webpack, Babel の基本理解に役立った。何も知らない状態で読んでもなんとなく理解できる。
- webpackとBabelの基本を理解する(1) ―webpack編― - Qiita
- webpackとBabelの基本を理解する(2) ―Babel編― - Qiita
- webpackとBabelの基本を理解する(3) ―webpackとBabel編― - Qiita
- webpackとBabelの基本を理解する(5) ―Sass編― - Qiita
Babel 周り。webpack で手一杯なのでちゃんと見れてない(というか webpack もまだまだ。。。
- Babelの設定を見直すための逆引きガイド
- Babel7.x時代のpolyfillの設定方法とuseBuiltInsの仕組み
- Babel7.4で非推奨になったbabel/polyfillの代替手段と設定方法
- Babel 7.4.0で非推奨になった@babel/polyfillを使わず、core-js@3で環境構築する | nansystem
自分のテンプレ作る際にめっちゃ参考になった。まだ理解しきれてない箇所もあるので、他にも取り入れられそうなやつがあれば随時取り込む予定
- Chrome/Firefox拡張をwebpack+Babelでいい感じにつくる雛形 - Qiita
- ReactでChrome Extensionを開発するために必要なwebpackのビルド設定 - code-log
公式ドキュメントなど
その他
- Cannot assign to read only property ‘exports’ of object ‘#
- node.js - Webpack: Cannot assign to read only property ‘exports’ of object ‘#
関連記事
- Vue.js を使ってメインページ側で動作する Chrome 拡張機能を開発する方法
- webpack で Moment.js の不要な Locale を除去
- Google Chrome 拡張機能で利用可能な JavaScript の圧縮・難読化ツール
- Simonwep/pickr でカラーピッカー(Color picker)
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア