九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、現在(2018/12/19現在)Laravelの最新バージョンは5.7
となっていますが、前バージョンの5.6
からJavaScriptまわりでひとつ大きなアップグレードがありました。
それは、利用されているBootstrap
(CSSフレームワーク)のバージョンが3
から4
に変更されたことです。
Bootstrap
のバージョン4では、前バージョンで含まれていたglyphicon
というフォントアイコンが削除されたり、デザインの改善などもあり個人的に好意的に受け止めていました。
そのため、それ以降は基本的にはBootstrap
はバージョン4
を使っていたのですが、この度どうしても3.3.7
をビルドして使う必要ができたため、Laravel
最新バージョンで使う方法をまとめてみました。
ぜひ参考にしてみてくださいね。
※ 実行環境: Laravel 5.7
npmパッケージをインストール
先ほども書きましたが、Laravel
は5.6
からBootstrap
4
を初期状態で使うように設定されています。
そのため、まずは過去バージョンのBootstrap
をインストールします。
ファイルは、package.json
です。
このファイル内にあるbootstrap
の項目を^4.0.0
から^3.3.7
へ変更してください。
"devDependencies": {
"axios": "^0.18",
"bootstrap": "^3.3.7",
"cross-env": "^5.1",
"jquery": "^3.2",
"laravel-mix": "^2.0",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"lodash": "^4.17.5",
"popper.js": "^1.12",
"vue": "^2.5.17"
},
変更が完了したら次のコマンドでインストールします。
npm install
これでLaravel
に過去バージョンのbootstrap
がインストールされました。
CSSのビルドをSCSSからLessへ変更する
実はここが少しやっかいなのですが、Bootstrap
は過去バージョン3.3.7
ではCSSビルドはLess
を使っていました。しかし、時代の流れからかバージョン4
になるとSCSS
が使われるようになっているため、何も設定せずこのままビルドしようとすると以下のようなエラーが発生してしまいます。
File to import not found or unreadable: ~bootstrap/scss/bootstrap.
そのため、Laravel
側でSCSS
は使わず、Less
を使うように変更します。
まず、webpack.mix.js
を開いて以下のように変更しましょう。
mix.js('resources/js/app.js', 'public/js')
.less('resources/less/app.less', 'public/css'); // ここを追加
// .sass('resources/sass/app.scss', 'public/css');
そして、resources
フォルダにless
という名前のフォルダを作成し、中にapp.less
というファイルを作成します。
さらに、app.less
には先ほどインストールしたBootstrap
のless
ファイルがある場所を指定します。
// Bootstrap 3.3.7
@import "~bootstrap/less/bootstrap.less";
これで、設定は完了です。
後は、次のようなビルドコマンドを使えばcss/app.css
が作成され、中身はBootstrap 3.3.7
のものになっています。
npm run dev
おわりに
いつもはnpm
パッケージをそのままLaravel mix
でコピーしているのですが、やはりビルドするよりはそちらの方がシンプルで保守がしやすい気がしています。
というのも、ビルドが必要な場合だと今回のようにバージョンが変わったことでCSSのビルド形式が変わってしまうこともあり、さらに現在Laravel
はSCSS
を使っていますが、これも時代とともに変更になってしまう可能性も否定できません。
その度に今回のようなコードの変更が起こることを考えれば、パッケージをnpm
などでインストールし、それをpublicな場所へ移して<script>
タグで呼び出す方が安定していると思います。(そう考えるとbower
はホントにシンプルで良かったのですが・・・)
みなさんの意見はどうでしょうか。
といったところで今回はここまでです。
お疲れ様でした!