gulp(Sass) v4の環境構築(compile, watch) に関するメモ

3 min読了の目安(約2700字TECH技術記事

概要

フロント開発をやる際に、わざわざCSSを記載することが面倒なので、いつもSassで記載するようにしています。というか、ほぼそれが常識みたいな感じになってますが。
そうすると、sass -> cssへのcompileが必要なので、そのための環境構築をするために gulp を使用します。
ただ、ネットで調べてもまだv3に基づく記載方法が多く残っており、個人的にはv4(task()とか使用せずに関数宣言する、など)でさっさと構築したいと思ってます。
なので、今回は表題の通り、gulp v4における環境構築を行いたいと思います。

ちなみに、今回gulpの環境構築に最低限行うnodeの設定やらは省略し、fileの中身の記載に限定しています。

実現させたい機能条件

  • 複数のsassファイルから1つのcssファイルへとcompileし、任意の場所に配置させたい。
  • watch機能を用いて、対象のsassファイルが更新され次第、随時compileしてほしい。
  • autoprefixer機能を用いて、クロスブラウザ対応を行いたい。

gulpfile.jsの中身(全体)

とりあえず、まずは今回記載したgulpfile.jsの中身です。ファイルの箇所などは、記事用に変更してあります。

// 1. moduleの定義
const
  { watch, parallel, src, dest } = require('gulp'),
  sass = require('gulp-sass'),
  autoprefixer = require('gulp-autoprefixer');

// 2. sassからcssへcompileするための関数
const compileSass = () =>
  src('assets/sass/style.scss')
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(dest('assets/css'));

// 3. sassファイルの変更を監視するための関数
const WatchSass = () =>
  watch([
    'assets/sass/base/*.scss',
    'assets/sass/component/**/*.scss'
  ], compileSass);

// 4. export
exports.default = parallel(compileSass, WatchSass);

1. moduleの定義

const
  { watch, parallel, src, dest } = require('gulp'),
  sass = require('gulp-sass'),
  autoprefixer = require('gulp-autoprefixer');
  • もちろん、今回は const で定義しています。
  • v3までは const gulp = require('gulp);' と定義すれば良かったが、v4では使用したい機能ごとに呼び出す仕様となっているっぽいです(後で確かめます)。
  • sassとautoprefixerに関しては、特にv3とは相違ないため、同じです。

2. sassからcssへcompileするための関数

const compileSass = () =>
  src('assets/sass/style.scss')
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(autoprefixer())
    .pipe(dest('assets/css'));
  • v3までは、ここは gulp.task() などで対応していたと思いますが、v4からは「非推奨(一応使用できる)」となっているため、関数に変更しました。gulp - creating tasks
  • sassの outputStylecompressed に変更して、CSSのminify化を行っています。容量の削減ですね。
  • destは、v3では gulp.dest() と記載していたが、v4ではそもそもmoduleでrequireしていないのもあり、 dest() だけで大丈夫です。

3. sassファイルの変更を監視するための関数

const WatchSass = () =>
  watch([
    'assets/sass/base/*.scss',
    'assets/sass/component/**/*.scss'
  ], compileSass);
  • watchもv3に比べて簡潔に書きやすくなりました。
  • 監視対象のファイルは複数にしたかったので、arrowで記載しています。
  • watchの第2引数は、compileSassを当てることにしています。わざわざ gulp.task() を使用しなくてもいいのは結構ありがたいです。

4. export

exports.default = parallel(compileSass, WatchSass);
  • gulp.series() も使用しようかなとは思いましたが、 parallel() で十分でした。
  • ここも簡潔に、且つスッキリ見えるようになり、トータルで便利になりました。

感想

結構最初の頃は、gulpが意外に使いにくい(特にwatchの設定)と感じていました。
ただ、ここまで記述量が少なくなると、何が書いてあるかわかりやすいし、何をしたいのかもわかるので、今では大好きです。