前回扱ったSass環境構築の続きになります。
タスクランナー
タスクランナーはコンパイルやテストなどの一連の手続きを自動化するツールです。「タスクランナー」と呼ばれなくともこのような特性を持つツールは数多あるのですが、フロントエンドで使用されるツールの多くはこの名称が使われています。
gulpとは
タスクランナーの一つです。gulpは主にビルドをタスクとして取り扱うため、ビルドシステムヘルパーとも呼ばれます。
gulpを使ってSassをコンパイルする
前回の記事でもgulpを使ったSassのコンパイルについて触れましたが、
今回はgulpのビルド手続きを記述するためのglupfile.js
にフォーカスを当ててみます。
var gulp = require('gulp'); var sass = require('gulp-sass'); gulp.task('sass', function() { return gulp.src('./*.scss') .pipe(sass({outputStyle: 'expanded'})) .pipe(gulp.dest('./css')); }); gulp.task('sass:watch', function() { gulp.watch('./*.scss', ['sass']); });
上記コードは
をサポートするものです。
モジュール読み込み部分
var gulp = require('gulp'); var sass = require('gulp-sass');
1,2行目ではモジュール読み込みを行っています。
package.json
で指定したパッケージをモジュールとして読み込むことができます。
タスク定義部分
gulp.task('sass', function() { return gulp.src('./*.scss') .pipe(sass({outputStyle: 'expanded'})) .pipe(gulp.dest('./css')); });
gulp.task
で実行するタスクを定義できます。
定義したタスク名をgulp
コマンドの引数に指定・実行することで、定義したタスク内容が実行されます。上記の例ではsass
をタスク名としているので、gulp sass
で実行可能です。
gulp.src('./*.scss')
入力とするファイルを指定します。
ここではgulpfile.js
と同階層にある任意のscssファイルを指定しています。
.pipe(sass({outputStyle: 'expanded'}))
gulp.src
の返戻オブジェクトに対して、pipe
メソッドで更に処理を追加しています。
sassモジュールを使い、入力scssファイルのコンパイル処理を行っています。引数には出力形式を指定しています。引数outputStyle
は次の4通りで指定できます。
nested
:scssのネスト構造を出力CSSにも残します。expanded
:ルールセットがブロックごと・宣言ごとに改行されます。compact
:ルールセットごとに改行されます。compressed
:改行されません。すべてワンライナーで記述されます。
特別な理由がない限り、比較的可読性の高いexpanded
で良いと思います。
Sassファイル監視処理
gulp.task('sass:watch', function() { gulp.watch('./*.scss', ['sass']); });
二つ目のgulp.task
ではSassファイルの監視タスクsass:watch
を定義しています。
gulp.watch
メソッドで、第一引数に指定したファイルに変化があった場合に第二引数に指定したタスクを実行します。今回はgulpfile.js
と同ディレクトリのscssファイルに変化があった場合にもsass
タスクが実行されるようになっています。
sass:watch
による監視は自動では実行されません。
sass
タスク同様に、gulp
コマンドで実行する必要があります。
$ gulp sass:watch
実験
まずはSassの手動コンパイルをしてみます。
test.scss
#test{ width: 300px; height: 500px; p { em { color: #ff00ff; } } }
をgulpfile.js
と同じディレクトリに用意し、
$ gulp sass
を実行。
するとcss/test.css
が生成されます。
#test { width: 300px; height: 500px; } #test p em { color: #ff00ff; }
次に、test.scss
を監視するためのタスクsass:watch
を実行します。
このタスクは一度実行するとプロセスがキルされるまで終了しません。
$ gulp sass:watch [21:40:42] Using gulpfile ~/hoge/gulpfile.js [21:40:42] Starting 'sass:watch'... [21:40:42] Finished 'sass:watch' after 11 ms
試しにtest.sass
のセレクタ#test p em
のcolor
属性を変更しました。
#test{ width: 300px; height: 500px; p { em { color: #0000ff; } } }
するとsass:watch
のタスクを実行するプロセスからの標準出力が表示されます。
... [21:41:01] Starting 'sass'... [21:41:01] Finished 'sass' after 50 ms [21:41:11] Starting 'sass'... [21:41:11] Finished 'sass' after 10 ms
CSSファイルにSassファイルの更新結果が反映されました。
#test { width: 300px; height: 500px; } #test p em { color: #0000ff; }
まとめ
これでSassコンパイルの簡単な自動化ができました。
あとはgulp
をCronで自動実行するなりCIで回すなりできますね。