CSS

gulpでサイト内のscssを同階層のcssにそれぞれ書き出す

gulp-ruby-sass」使ってますか。

有名なパッケージですが、

サイトのディレクトリ構造次第で、コンパイルに手間がかかったりします。

例えば、僕の場合だと、サイト内の/scssディレクトリから、同階層の/cssディレクトリに書き出したいとき。

ある特定のscssディレクトリをウォッチしてdestしてました。これだと、間違ったコンパイルによる事故は起きませんが、違うページをコーディングするときgulpfile.jsを書き換えなくてはいけないので著しく効率が悪いです…

じゃあサイト全体の/scssディレクトリを、同じ階層内の/cssディレクトリに書き出せたらラクですよね。

サイト全体をウォッチして、scssディレクトリを、同じ階層のcssにそれぞれ書き出す方法をご紹介します。

ず

サイト全体のscssディレクトリを同階層のcssにコンパイルする

gulp-rename, gulp-ruby-sass をインストール

gulp-rename」を使用します。

gulpfile.jsでgulp-ruby-sassの設定

29行目 return sass(~~)

scssのディレクトリ指定には「/**/」ミニマッチを使います。
これは、ルートディレクトリ(root)と、scssディレクトリの間にディレクトリがいくつあっても、無くても対象としますよ、という宣言になります。つまり、サイト全体の各scssディレクトリをそれぞれコンパイルするということになります。

ただ、

39行目 .pipe(rename(function(path){ ~ })

ここが今回のテーマで重要な点です。

gulp-renameは書き出すファイルの名前を変えるのに用いられますが、ここでは、gulp-ruby-sassが書き出すディレクトリの指定を変えています。

rename関数で、書き出し先のパス情報を得ることができます。
引数「path」で受け取っていますが、試しにcommon/scss/style.scssを更新し、common/css/style.cssに変換したときのパス情報をconsole.logを使って見てみると

こんな感じのオブジェクトを得ることができているのがわかります。

dirnameのところになんとなくそれっぽいのがありますね。dirnameこそが、書き出し先のディレクトリ名になります。

ここで、変換したscssを書き出すのを、同階層のcssディレクトリに指定しています。

return sass〜の記述のところでミニマッチ(/**/)を使った場合、コンパイルの対象が幅広くなり、非常に効率的です。

が、renameせずにそのままだと、階層構造を維持したままdestディレクトリにごっそりコピーされてしまい、意図しないところに書き出されてしまいます。

ず2

renameを使って、無理矢理変えてやろうという魂胆です。

scssとcssが同じディレクトリに存在する場合は今回のrenameは使わなくてもいいですね。

ウォッチタスクを忘れずに

サイト内のscssディレクトリの、.scssファイルの更新をウォッチします。

 

まとめ

使う場所は限られているかもしれませんが…探しても載ってなかったので。(どうやって検索すれば良いかもわかりませんでしたが

同じように困ってる方の助けになれば幸いです。

 

でわ!