Illust & Music 月の高いところ

今日のプリン言

謎のプリン語る。
一人書く人増えました。

Gulp、Sassのコンパイル高速化と一行化

2017年10月10日

みやびプリン 140 87

500 320

Gulp、Sassのコンパイル高速化と一行化 - サムネイル

※この記事は2年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。

どうも、ずいぶんご無沙汰でした。
やっと繁忙期抜けれた・・・。

さて、最近はGulpやること多いのですが、
Sassのコンパイルが遅いので、速くできないか?との要望があったので、
そこに関して。
今まで、compassを通していたのでやたらと時間かかっていたってことが判明した。
(下手したら、2分くらいかかる)
そこで、LibSassというのを使えば速くなることがわかたったので、下記エントリーを参考に導入してみました。

gulpのsass,scssのコンパイルの高速化(LibSassをつかって)

いやはや速くなった速くなった。
500ms(0.5秒)くらいで終わるようになった。

しかし、compassを通さないので、ある困ったことになった。
compassが使えないのはまぁいいとして、
config.rbを通せない
のだ。
これ、何が困るかというと、
書き出しの仕方が、操作しずらくなる。
一応、gulp-sassにもオプションで基本の書き出し形式は選択できるのだが、
僕の書き出し環境はちょいと改造して、一行化してるので、
(to_css.rbを改造してる)困ったことになったわけだ。
いや、compressed形式で一行化しろって話だが、気持ち悪いんだもん、compressed。

LibSassで、config.rbを通すようにする方法を探すもなかなか見つからなかった・・・。
じゃぁ、どうするって、自作プラグインで一行化すればいい

下記のようなjsファイルを、gulpfile.jsと同じ階層に置く

var through = require('through2');
var PluginError = require('gulp-util').PluginError;
var PLUGIN_NAME = 'gulp-css-comp-add';

module.exports = function() {
  var transform = function(file, encoding, callback) {
    if (file.isNull()) {
      return callback(null, file);
    }
    if (file.isStream()) {
      this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported!'));
    }

    // プラグインの処理本体
    if (file.isBuffer()) {
      var submitContents = '';

      // ファイルの内容をcontentsに読み込み
      var contents = String(file.contents);
      // タブを削除
      contents = contents.replace( /\t/g, "");
      contents = contents.replace(/\/\*([\s\S]*?)\*\//g, "");

      // 改行別に処理
      var breakArr = contents.split("\n"),
        lineFlgPHP = false,
        lineFlgJS = false;

      // 一行化
      breakArr.forEach(function(val, index){
        var innerLastText = val;
        // 行頭スペースを削除
        innerLastText = innerLastText.replace( /^\s+/g, '');

        submitContents += innerLastText;
      });
      // breakArr.forEach END

      // 複数セレクタのスペーストル
      if (submitContents.indexOf(", ")) {
        submitContents = submitContents.replace(/\, /g, ',');
      }
      // セレクタのスペーストル
      if (submitContents.indexOf(" {")) {
        submitContents = submitContents.replace(/ \{/g, '{');
      }
      // プロパティのスペーストル
      if (submitContents.indexOf(": ")) {
        submitContents = submitContents.replace(/\: /g, ':');
      }

      // 編集した内容を出力
      file.contents = new Buffer(submitContents);

      // 処理の完了を通知
      return callback(null, file);
    }

    this.push(file);
    callback();
  };

  return through.obj(transform);
};

さて、どう使うかはgulpfile.jsにて下記のようにする。
(必要なパッケージはインストールしているとして話進めます)

// 各npm読み込み
var gulp = require('gulp'),
  sass = require('gulp-sass'),
  cssComp = require('./gulp-css-comp-add');

// Sassコンパイル
gulp.task('sass-comp', function () {
  // 出力のパスとかに関しては、環境によって変える
  gulp.src('scss/**/*.scss')
    .pipe(
      // 書き出し形式は、expandedにする
      sass({outputStyle: 'expanded'}))
    // ここで、自作プラグインを通す
    .pipe(cssComp())
    .pipe(gulp.dest('css'));

  console.log('SASSをコンパイルしました。');

  return merge(tasks);
});

gulp.task('watch', function() {
  gulp.watch('sass/**/*.scss', ['scss']);
});

watchに関してはおまけですね。

これで、速いし一行化もできました!
やっぱパッケージ一個で片付けようってのはムシがいい話なんだろうかね。
また一つ勉強になりました。

国内最大級の品揃え!【DMM電子書籍】 - メイン

トラックバック(0)

トラックバックURL:

コメントする