これからはじめるGulp #14:gulp-cachedプラグインで変更されたSCSSファイルだけを処理させる

2014.12.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回のこれからはじめるGulp(13):gulp-changedプラグインで変更されたファイルだけを処理させるでgulp-changedプラグインを使った画像処理の効率化を試しました。今回はgulp-cachedというプラグインを活用しSassタスクの処理を効率化してみます。

gulp-cachedについて

gulp-cachedはGlob上のファイルをメモリにキャッシュし、変更されたファイルだけを対象に処理させることができます。

gulp-cachedをSassタスクに組み込む

gulp-cachedをSassタスクに組み込んでみます。

gulp-cachedのインストール

$ sudo npm install gulp-cached --save-dev
Password:
gulp-cached@1.0.1 node_modules/gulp-cached
├── lodash.defaults@2.4.1 (lodash._objecttypes@2.4.1, lodash.keys@2.4.1)
└── through2@0.5.1 (xtend@3.0.0, readable-stream@1.0.33)

Sassタスクにgulp-cachedを指定する

追加するのは読み込みとパイプラインへの指定だけなのでとても簡単に組み込めます。gulp-cachedの引数にはキャッシュ名を指定するだけです。

var gulp       = require('gulp');
var path       = require('path');
var sass       = require('gulp-ruby-sass');
var plumber    = require('gulp-plumber');
var notify     = require('gulp-notify');
var cache      = require('gulp-cached'); //<-

var browserSync = require('browser-sync');
var reload      = browserSync.reload;

//option
var paths = {
  srcDir : 'assets/_scss',
  dstDir : 'assets/css'
}

//task
gulp.task('sass', function(){
  var srcGlob = paths.srcDir + '/**/*.scss';
  var dstGlob = paths.dstDir;
  var errorMessage = "Error: <%= error.message %>";
  var sassOptions = {
    bundleExec : true,
    style      : 'compressed',
    require    : ['bourbon', 'neat'],
    loadPath   : [
      'vendor/bundle/ruby/2.1.0/gems/bitters-0.10.1/app/assets/stylesheets'
    ]
  }

  gulp.src( srcGlob )
    .pipe(cache( 'sass' )) //<-
    .pipe(plumber({
      errorHandler: notify.onError( errorMessage )
    }))
    .pipe(sass( sassOptions ))
    .pipe(gulp.dest( dstGlob ))
    .pipe(reload({stream:true}));
});

gulp-cachedを実行

watchが設定されている状態でタスクを実行します。 最初の実行で複数のSCSSファイルが処理されていますが、後半のwatchが行われている部分では変更されたファイルのみが処理されています。

$ gulp watch
[17:00:28] Using gulpfile ~/Projects/test.io/vccw/www/wordpress/wp-content/themes/test.io/gulpfile.js
[17:00:28] Starting 'sass'...
[17:00:28] Finished 'sass' after 20 ms
[17:00:28] Starting 'watch'...
[17:00:28] Finished 'watch' after 51 ms
[17:00:29] gulp-ruby-sass: directory
[17:00:30] gulp-ruby-sass: write common.css
      write common.css.map
[17:00:30] gulp-ruby-sass: directory sections
[17:00:31] gulp-ruby-sass: write sections/categories-archive.css
      write sections/categories-archive.css.map
[17:00:31] gulp-ruby-sass: write sections/date-archives.css
      write sections/date-archives.css.map
[17:00:32] gulp-ruby-sass: write sections/home.css
      write sections/home.css.map
[17:00:32] gulp-ruby-sass: write sections/post.css
      write sections/post.css.map
[17:00:33] gulp-ruby-sass: write sections/tags-archive.css
      write sections/tags-archive.css.map
[17:00:41] Starting 'sass'...
[17:00:41] Finished 'sass' after 13 ms
[17:00:45] Starting 'sass'...
[17:00:45] Finished 'sass' after 2.64 ms
[17:01:02] Starting 'sass'...
[17:01:02] Finished 'sass' after 2.51 ms
[17:01:02] gulp-ruby-sass: directory
[17:01:04] gulp-ruby-sass: write common.css
      write common.css.map
[17:01:13] Starting 'sass'...
[17:01:13] Finished 'sass' after 4.11 ms
[17:01:14] gulp-ruby-sass: directory
[17:01:15] gulp-ruby-sass: write common.css
      write common.css.map
[17:01:22] Starting 'sass'...
[17:01:22] Finished 'sass' after 2.91 ms
[17:01:23] gulp-ruby-sass: directory
[17:01:25] gulp-ruby-sass: write common.css
      write common.css.map
[17:01:30] Starting 'sass'...
[17:01:30] Finished 'sass' after 10 ms
[17:01:31] gulp-ruby-sass: directory sections
[17:01:32] gulp-ruby-sass: write sections/post.css
      write sections/post.css.map
[17:01:36] Starting 'sass'...
[17:01:36] Finished 'sass' after 4.29 ms
[17:01:37] gulp-ruby-sass: directory sections
[17:01:37] gulp-ruby-sass: write sections/post.css
      write sections/post.css.map

これでファイルを変更する度にすべてのSCSSファイルがコンパイルされることもなくなります。無駄な処理が減り、コンパイルが完了するまでの待機時間を減らすことができます。タスクの効率化はひとまずここまで。明日からは画像処理系のプラグインを紹介していきたいと思います。

この記事はこれからはじめるGulp(14):gulp-cachedプラグインで変更されたSCSSファイルだけを処理させるの転載です。