Gulp-Sass と Gulp-SourceMaps でソースマップを含んで SCSS ファイルをビルドする

いいかげん SCSS メインで書こうかなーと思い、Gulp で SCSS をビルドするタスクを作った。ついでに Gulp-SourceMaps を挟んでソースマップを出力してみたり、Gulp-Plumber を挟んで Watch 中にビルドエラーになった時に Watch タスクが終了しないようにしてみたりした。

インストールするものは以下のとおり。

$ npm i -D gulp gulp-load-plugins gulp-plumber gulp-sass gulp-sourcemaps

そしてタスクは以下のとおり。

gulp.task('css', () => {
  return gulp
    .src(['./src/css/index.scss'])     // エントリポイントとなる SCSS
    .pipe($.plumber(function(error) {  // アロー関数にすると this が変わって this.emit() が動作しなくなるので function を使う
      return this.emit('end');         // Gulp-Plumber による Watch 中のビルドエラー対策
    }))
    .pipe($.sourcemaps.init())         // ソースマップ出力のための初期準備
    .pipe(
      $.sass({                         // Gulp-Sass による SCSS のビルド
        outputStyle: 'compressed'      // 出力形式は圧縮した CSS にする
      })
      .on('error', $.sass.logError)    // ビルド時のエラーを吸収する
    )
    .pipe($.sourcemaps.write())        // ソースマップを出力する
    .pipe(gulp.dest('./www/css'));     // index.scss とそこから @import している SCSS ファイルたちを ./www/css/index.css にまとめて出力する
});

Gulp-Sass の場合、標準で Browserify 的なファイル結合をやってくれる。gulp.src() で指定したエントリポイントとなるファイルから @import している SCSS ファイルの中身を読み取り、全てをビルド・結合して、最終的に1つの CSS ファイルにまとめてくれる。

その出来上がった CSS ファイルにソースマップを含ませるため、Gulp-SourceMaps の init()write() を噛ませている。

ついでに Gulp-Plumber を仕込んでおいて、別途 Watch タスクからこの css タスクを呼んだ時に、ビルドエラーで Watch タスクを終了させないようにしている。

これで良い感じ。