はじめに
LaravelにPugを導入する機会があり、いろいろと調査を重ね、
コンパイル時のパスマッピングを自動化することが出来たので載せてみました。
Laravel Mixの導入についてはnpmの公式サイトを参考にした。
前提
npm
と node
がインストールされている前提です。
【参考までに私の環境↓】
npm | node | |
---|---|---|
Ver. | 6.14.11 | v10.23.1 |
本題
調べてみるとSassやJsのコンパイル自動化は出てくるが、Pugについては見つからなかった。
それどころか諦めてしまっているものも見つかった。。
(もう少し早く辿り着けていれば助言出来たかも。。)
【webpack】【Laravel】laravel-mix-pugで特定のディレクトリを再帰的にビルドする方法はないでしょうか?
SassやJsの自動化をglobを使用して自動化するという記事を参考にさせていただきました。
【参考】
Laravel Mix+globによるコンパイルパスマッピング自動化
globの導入
# webpack.mix.jsがある場所でインストール
$ npm install glob
次にwebpack.mix.js
を下記のように実装。
const mix = require('laravel-mix');
mix.pug = require('laravel-mix-pug');
const glob = require('glob');
/**
* pugのコンパイル用パス自動マッピング
*/
glob.sync(`resources/pug/**/*.pug`).map(function(file) {
const index = file.indexOf('/pug');
const dir = file.slice(index + 1);
const dirPath = dir.split("/").reverse().slice(1).reverse().join("/");
// コンパイル先のフォルダ/ファイル名
const pugPath = dirPath.replace('pug', 'resources/views');
// コンパイル元のフォルダ/ファイル名
const exPath = pugPath.replace('views', 'pug');
// マッピングパスを動的に生成
mix.pug(file, pugPath, {
ext: '.blade.php', // コンパイル時、〇〇.blade.phpの拡張子で生成
excludePath: exPath
});
});
これで完成です。
注意点:
・コンパイル元のフォルダと同じものがコンパイル先にないとエラーになる
例:
/resources/pug/test/hoge.pug
をコンパイルしたい場合、
/resources/views/test
を作成してから行うこと。
・excludePath
の指定を忘れると、ルートディレクトリ直下にファイル生成をしようとしてしまう。
・参考にさせていただいた記事の
ファイルごとにピックアップしてコンパイルしたいとき
については実装していないため、コンパイル実行時ファイル数によっては時間がかかる。
まとめ
調べても中々出てこなかったので苦労しましたが、自動化は便利だなと。。
やっぱりLaravelでは中々Pug使わないのかな。。