gulp-sassとgulp-sass-bulk-importでディレクトリ単位のimportを行う
普段はgulpを使ってSassのコンパイルをかけていたのですが、その際Sassのコンパイルにgulp-ruby-sassモジュール(ローカルのSassは 3.4.13)を使っていました。
最近SMACSSやFLOCSSなどのCSSの設計手法を勉強していますが、これを実際にSassで実現しようとした際、 複数のファイルをimportする 必要が出ました。
├── foundation/
│ └── _normalize.scss
├── layout/
│ ├── _g-header.scss
│ └── _layout.scss
├── object/
│ ├── component/
│ ├── project/
│ │ ├── _p-g-work.scss
│ │ ├── _p-g-nav.scss
│ │
│ └── utility/
└── style.scss
例えばlayout/下やobject/project下の複数ファイルをstyle.scssでimportするみたいな感じ。
ファイルを1個1個指定してimportすると、ファイルを作る度にimportの記述を書かなきゃいけないしメンドクサイ。
そこで、ディレクトリ単位でimportできないかと以下の様に指定していました。
@import "layout/*";
@import "object/component/*";
するとこんなエラーが…
file to import not found or unreadable
パスは間違っていないハズなのでどういうことかと思いながら色々調べていたのですが、この記事に出会いました。
gulp-sass
でfile to import not found or unreadable
のエラー – Qiita
Sassのバージョンやファイルパスの確認などされていましたが、この人の場合は、拡張子がまずかったようです。
今回の拡張子は.scssのため原因はコレではないようです。
Sass-globbingも1つの手
更に調べていると、sass-globbingというものがあるらしく、これを用いることでディレクトリ単位のコンパイルが可能になるらしいです。
参考:sass-globbingでSassファイルをお手軽管理 – Qiita
しかし、これはおそらくターミナル上でSassコマンドを叩いてコンパイルをかける場合の話で、gulpに任せてる自分には使えないものなのかなぁと。
解決
そこでgulpで使えるものを探していたのですが、以下の記事を見つけました。
gulp-sass-bulk-importを使ってSassの@importをすっきり管理する。 – Toro_Unit
gulp-sassでのコンパイルにgulp-sass-bulk-importを用いる事でディレクトリ単位でコンパイルかけれるようになるという話。
sassのコンパイル用のモジュールは変わってしまうけど、コンパイルできるなら…!と思いタスクを組むことで出来ました。
var gulp = require('gulp');
var sass = require('gulp-sass');
var bulkSass = require('gulp-sass-bulk-import');
gulp.task('sass', function() {
return gulp.src('./scss/**/*.scss')
.pipe(bulkSass())
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('./css'))
});
各モジュールのバージョン
- “gulp-sass”: “^2.2.0”,
- “gulp-sass-bulk-import”: “^1.0.1”
困っていた方はこれを試してみてください。
gulp-ruby-sassの方は書き方が特殊なため上手く組み込めませんでした。どうやったら良いんだろ?