webpackでの使用(Bootstrap and Webpack) v5.3.6更新、v5.2.1追加
webpackを使用してBootstrapのCSSとJavaScriptをプロジェクトに組み込みバンドルする方法の公式ガイド。
※"v5.0.0"での変更はv5.0.0-alpha版、v5.0.0-beta版での変更も含みます。
※"v5.3.0"での変更はv5.3.0-alpha版での変更も含みます。
※webpackについては、Webpackってどんなもの?(Qiita)を参照。
Webpackとは?(What is Webpack?)v5.3.4追加
Webpackは、静的アセットを生成するためにモジュールとその依存関係を処理するJavaScriptモジュールバンドラー。複数のファイルや依存関係を持つ複雑なWebアプリケーションの管理を簡素化する。
セットアップ(Setup)v5.3.0更新
Bootstrapを使用してwebpackプロジェクトをゼロから構築しているため、実際に始める前に、いくつかの前提条件と前段階がある。このガイドでは、既にNode.jsがインストールされており、ある程度ターミナル(コマンドプロンプト)に精通している必要がある。
-
プロジェクトフォルダを作成し、npmをセットアップ。
my-projectフォルダを作成し、npmを-y引数で初期化して、すべてのインタラクティブな質問を回避する。実行コマンド
$ mkdir my-project && cd my-project $ npm init -y -
webpackをインストール。次に、webpackのコア用の
webpack、ターミナルからwebpackコマンドを実行できるようにするwebpack-cli、ローカル開発サーバーを実行できるようにするwebpack-dev-serverといったwebpack開発の依存関係をインストールする必要がある。さらにhtml-webpack-pluginをインストールしてindex.htmlをデフォルトのdistディレクトリではなく、srcディレクトリに保存できるようにする。--save-devを使用して、これらの依存関係が開発用であり、本番用ではないことを通知する。実行コマンド(緑背景が5.3.0での変更箇所)
$ npm i --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin -
Bootstrapをインストール。これで、Bootstrapがインストールできる。ドロップダウン、ポップオーバー、ツールチップはPopperに依存しているため、Popper(
@popperjs/core)もインストールする。これらのコンポーネントを使用する予定がない場合は、ここでPopperを省略しても可。実行コマンド
$ npm i --save bootstrap @popperjs/core -
追加の依存関係をインストール。webpackとBootstrapに加えて、BootstrapのCSSとJSをwebpackに適切にインポートしてバンドルするには、さらにSass、一部のローダー、Autoprefixerといったいくつかの依存関係が必要。
実行コマンド
$ npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader
必要な依存関係がすべてインストールされたので、プロジェクトファイルの作成とBootstrapのインポートに取り掛かることができる。
プロジェクト構造(Project structure)v5.3.0更新
my-project フォルダを作成し、npmを初期化した。次に、src フォルダも作成して、プロジェクト構造を完成させる。my-project から以下を実行するか、以下に示すフォルダとファイル構造を手動で作成する。
実行コマンド(緑背景が5.3.0での変更箇所)$ mkdir {src,src/js,src/scss}
$ touch src/index.html src/js/main.js src/scss/styles.scss webpack.config.js
完了すると、プロジェクト全体は以下のようになる。
my-project/
├── src/
│ ├── js/
│ │ └── main.js
│ ├── scss/
│ │ └── styles.scss
│ └── index.html
├── package-lock.json
├── package.json
└── webpack.config.js
この時点では、すべてが適切な場所にあるが、webpack.config.js をまだ入力していないため、webpackは機能しない。
webpackを構成する(Configure Webpack)v5.3.0更新
依存関係がインストールされ、プロジェクトフォルダでコーディングを開始できるようになったら、webpackを構成して、プロジェクトをローカルで実行できる。
-
エディタで
webpack.config.jsを開く。ファイルの中は空白なので、サーバーを起動するために定型的な設定を追加する必要がある。構成のこの部分は、webpackがプロジェクトのJavaScriptを探す場所、コンパイルしたコードを出力する場所(dist)、開発サーバーの動作(ホットリロードでdistフォルダから取得)を指示する。webpack.config.jsの設定例 緑背景が5.3.0での変更箇所'use strict' const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ] } -
次に、
src/index.htmlを作成。これは、後の手順で追加するバンドルされたCSSとJSを利用するためにwebpackがブラウザにロードするHTMLページである。その前にレンダリングするものを指定して、前の手順のoutputJSを組み込む必要がある。src/index.htmlの設定例<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Webpack付きBootstrap</title> </head> <body> <div class="container py-4 px-3 mx-auto"> <h1>Hello, Bootstrap and Webpack!</h1> <button class="btn btn-primary">Primary button</button> </div> </body> </html>上記では、BootstrapのCSSがwebpackによって読み込まれるタイミングが確認できるように、
div class="container"と<button>を使用したBootstrapのスタイルを少しだけ入れている。 -
ここで、webpackを実行するためのnpmスクリプトが必要。
package.jsonを開き、以下に示すstartスクリプトを追加(すでにtestスクリプトが用意されているはず)。このスクリプトを使用して、ローカルwebpack開発サーバーを起動する。また以下のようなbuildスクリプトを追加したプロジェクトの構築もできる。package.jsonの設定例 緑背景が5.3.0での変更箇所{ "scripts": { "start": "webpack serve", "build": "webpack build --mode=production", "test": "echo \"Error: no test specified\" && exit 1" }, } -
そして最後に、webpackを起動。ターミナルの
my-projectフォルダから、新しく追加されたnpmスクリプトを実行:実行コマンド
$ npm start
このガイドの次が最後となる項目では、webpackローダーをセットアップし、BootstrapのCSSとJavaScriptをすべてインポートする。
Bootstrapのインポート(Import Bootstrap)v5.3.6更新
Bootstrapをwebpackにインポートするには、最初の項目でインストールしたローダーが必要。npmを使用して既にインストールしているが、これらを使用するようにはwebpackを構成する必要がある。
-
webpack.config.jsでローダーを設定。これで構成ファイルが完成し、以下のスニペットと一致するはず。ここでの唯一の新しい部分はmoduleセクションである。webpack.config.jsの設定例 緑背景が5.3.0以降の変更箇所'use strict' const path = require('path') const autoprefixer = require('autoprefixer') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { mode: 'development', entry: './src/js/main.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, devServer: { static: path.resolve(__dirname, 'dist'), port: 8080, hot: true }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ], module: { rules: [ { test: /\.(scss)$/, use: [ { // `<style>` タグを注入してDOMにCSSを追加 loader: 'style-loader' }, { // `@import` と `url()` を `import/require()` のように解釈して解決 loader: 'css-loader' }, { // PostCSSでCSSを処理するためのwebpack用ローダー loader: 'postcss-loader', options: { postcssOptions: { plugins: [ autoprefixer ] } } }, { // SASS/SCSSファイルを読み込みCSSにコンパイル loader: 'sass-loader', options: { sassOptions: { // オプション: Sassの非推奨の警告を削除。以下の注意を参照。 silenceDeprecations: [ 'mixed-decls', 'color-functions', 'global-builtin', 'import' ] } } } ] } ] } }これらすべてのローダーが必要な理由を要約すると、
style-loaderはCSSをHTMLページの<head>の<style>要素に挿入し、css-loaderは@importとurl()の使用を支援し、postcss-loaderはAutoprefixerに必要であり、sass-loaderはSassの使用を可能にする。注意:Dart Sassの最新バージョンでソースSassファイルをコンパイルすると、Sassの非推奨に関する警告が表示される。これはBootstrapのコンパイルや使用を妨げるものではない。Bootstrapでは長期的な修正に取り組んでいるが、それまでの間はこれらの非推奨の警告は無視してもよい。v5.3.6追加
-
それから、BootstrapのCSSをインポートする。以下を
src/scss/styles.scssに追加して、BootstrapのすべてのソースSassをインポート。src/scss/styles.scssの設定例 緑背景が5.3.0での変更箇所// BootstrapのCSSをすべてインポート @import "bootstrap/scss/bootstrap";必要に応じて、スタイルシートを個別にインポートすることもできる。詳細については、Sassカスタマイズのインポートの項目に記載。
-
次にCSSをロードし、BootstrapのJavaScriptをインポートする。以下を
src/js/main.jsに追加して、CSSをロードし、BootstrapのすべてのJSをインポート。PopperはBootstrapを介して自動的にインポートされる。src/js/main.jsの設定例全てをインポート
// カスタムCSSをインポート import '../scss/styles.scss' // BootstrapのJSをすべてインポート import * as bootstrap from 'bootstrap'バンドルサイズを抑えるために、必要に応じてJavaScriptプラグインを個別にインポートすることもできる。
個別にインポート
import Alert from 'bootstrap/js/dist/alert' // または、必要なプラグインを指定: import { Tooltip, Toast, Popover } from 'bootstrap'Bootstrapのプラグインの使用方法の詳細については、JavaScriptの解説に記載。
-
これで完了!🎉BootstrapのソースSassとJSが完全に読み込まれると、ローカル開発サーバーは次のようになる:
これで、使用するBootstrapコンポーネントの追加が始められる。追加のカスタムSassを組み込み、BootstrapのCSSとJSの必要な部分のみをインポートして構築を最適化する方法については、完全なWebpackサンプルプロジェクトを必ずチェックしてください。
最適化(Production optimizations)v5.2.1追加
セットアップによっては、プロジェクトを本番環境で実行するのに役立つ追加のセキュリティと速度の最適化を実装したい場合がある。これらの最適化はWebpack サンプルプロジェクトでは適用されず、実装するのはユーザー次第なのでご注意ください。
CSSの抽出(Extracting CSS)
上記で設定した style-loader は、CSSをバンドルに出力するため、手動で dist/index.html にあるCSSファイルを読み込む必要がなく便利。しかし、この方法は厳格なコンテンツ・セキュリティ・ポリシーでは機能しない可能性があり、バンドルサイズが大きいためアプリケーションのボトルネックになる可能性がある。
CSSを分離して dist/index.html から直接読み込めるようにするには、mini-css-extract-loader Webpackプラグインを使用する。
まず、プラグインをインストール:
実行コマンド$ npm install --save-dev mini-css-extract-plugin
次に、Webpackの設定でプラグインをインスタンス化して使用:
差分の表示--- a/webpack.config.js
+++ b/webpack.config.js
@@ -3,6 +3,7 @@
const path = require('path')
const autoprefixer = require('autoprefixer')
const HtmlWebpackPlugin = require('html-webpack-plugin')
+const miniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
mode: 'development',
@@ -17,7 +18,8 @@ module.exports = {
hot: true
},
plugins: [
- new HtmlWebpackPlugin({ template: './src/index.html' })
+ new HtmlWebpackPlugin({ template: './src/index.html' }),
+ new miniCssExtractPlugin()
],
module: {
rules: [
@@ -25,8 +27,8 @@ module.exports = {
test: /\.(scss)$/,
use: [
{
- // DOMに `<style>` タグを挿入してCSSを追加
- loader: 'style-loader'
+ // CSSを含む各JSファイルに対してCSSを抽出
+ loader: miniCssExtractPlugin.loader
},
{
npm run build を再度実行すると、src/js/main.js で読み込んだすべてのCSSを含む新しいファイル dist/main.css が新たに作成される。そこでブラウザで dist/index.html を表示すると、dist/main.css の中にあるため、スタイルが消えてしまう。生成されたCSSを dist/index.html に組み込むには、以下のようにする。
差分の表示--- a/dist/index.html
+++ b/dist/index.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="./main.css">
<title>Bootstrap w/ Webpack</title>
</head>
<body>
SVGファイルの抽出(Extracting SVG files)
BootstrapのCSSは、インラインの data: URIを経由したSVGファイルへの複数の参照が組み込まれている。画像の data: URIをブロックするコンテンツ・セキュリティ・ポリシーをプロジェクトに定義した場合、これらのSVGファイルは読み込まれない。この問題は、Webpackのアセットモジュール機能を使って、インラインのSVGファイルを抽出することで回避できる。
以下のように、インラインSVGファイルを抽出するようにWebpackを設定:
差分の表示--- a/webpack.config.js
+++ b/webpack.config.js
@@ -23,6 +23,14 @@ module.exports = {
},
module: {
rules: [
+ {
+ mimetype: 'image/svg+xml',
+ scheme: 'data',
+ type: 'asset/resource',
+ generator: {
+ filename: 'icons/[hash].svg'
+ }
+ },
{
test: /\.(scss)$/,
use: [
再度 npm run build を実行すると、SVGファイルが dist/icons に展開され、CSSから適切に参照されていることが確認できる。
【変更履歴】
- 【v5.0.0-alpha1】
src/js/main.jsの設定:import 'bootstrap'⇒import {プラグイン名} from 'bootstrap'(必要なプラグインが指定可能に)
- 【v5.0.0-alpha2】
webpack.config.jsの設定:potcss-loaderでpostcssOptionsキーを使用するようになったので変更
- 【v5.0.0-beta1】
- Popper v2の対応により、追加コマンドが
npm install popper.jsからnpm install @popperjs/coreに変更
- Popper v2の対応により、追加コマンドが
- 【v5.1.1】
src/js/main.jsの設定:全てをインポートする方法を追加(JavaScriptインポートの使用法を明確にした)
- 【v5.2.0】
- ガイドを全面的に書き直して更新
webpack.config.jsの設定:JavaScriptの記述をES6(ES2015)に変更
- 【v5.3.0】
- npmのセットアップで
html-webpack-pluginのインストールを追加 - プロジェクト構造で
distフォルダの作成がなくなり、dist/index.htmlはsrc/index.htmlに変更 src/index.htmlの設定:src="./main.js"の設定を削除webpack.config.jsの設定:developmentモードの設定追加html-webpack-pluginの設定追加autoprefixerの設定変更
package.jsonの設定:start,buildスクリプトを追加src/scss/styles.scssの設定:@import "~bootstrap/scss/bootstrap";⇒@import "bootstrap/scss/bootstrap";
- npmのセットアップで
- 【v5.3.1】
- BootstrapのインポートのPostCSSでCSSを処理するためのwebpack用ローダー:
plugins: () => [⇒plugins: [
- BootstrapのインポートのPostCSSでCSSを処理するためのwebpack用ローダー:
- 【v5.3.6】
webpack.config.jsの設定:Sassの非推奨に関する警告を削除する方法を追加
ここで何か間違いがあったり、情報が古くなっていたら、GitHubのIssuesを開いてご指摘ください。トラブルシューティングのサポートが必要なら、GitHubで検索するか、ディスカッションを始めてください。