はじめに

「Gulpってなに?」

「便利だと聞くけれどどうやって導入したらいいのかわからない」

そう悩まれているかた多いと思います

何故なら多くの記事が、Gulpのバージョンが古い記述で書かれていたり、Node.jsのインストール方法が違ったりして、初心者にとって、何が正解でどの記事をあてにしたらいいのかわからないからだと思います

ただ、それで挫折して導入をあきらめるのは本当にもったいないと思います

なので、初学者の方や少し勉強された方、これから導入を考えている方に向けてこの記事を書きたいと思います

Gulpは最新の4系で、gulpfile.jsの書き方も最新のものとなっています
また、Sass公式推奨のDart Sassで記述しているので安心して読み進めていただけます

有料note公開中!
詳細は下記画像をクリック👇

駆け出しからGulpを使って即戦力になろう!

Gulpとは?

簡単にGulpについて説明します

Gulpを使うと以下の作業を全部自動化してくれます(本当はもっとあります)

  1. Sassのコンパイル
  2. CSSの圧縮
  3. ファイルを編集したら即座にブラウザを更新して反映する自動リロード(ブラウザシンク)
  4. ベンダープレフィックスの自動付与
  5. 画像の自動圧縮
  6. Babelを使用したJSのコンパイル
  7. webpackと一緒に使ってJSをバンドルして圧縮する

上記の1~4だったらVsCodeのLive Sass Compilerで事足りるでしょう

ただ、5~7に関してはどうでしょうか?

5はTinyPNGで圧縮する方が多いのではないでしょうか

また、6、7に関してはLive Sass Compilerでは無理で、別のプラグインを入れなければいけません

こういった理由からLive Sass Comilerだけでは限界があり、Gulpを導入するメリットがあるといえます


また、Live Sass Compilerはエディタに依存するプラグインなので共同開発には向いていません(みんながVsCodeを使っているわけではないということです)

一方Gulpは、これから紹介するpackage.jsonとgulpfile.jsを共有さえすれば同じ環境設定で開発を行うことができるというメリットがあります

このような理由から、共同開発することが多い企業とお仕事を考えてるかたは必ずマスターしておかなければいけないものになります

環境構築

さて、Gulpを導入するメリットがわかったところでいよいよ環境構築をはじめていきます

少し長くなりますがその分詳しく解説しているので最後までお付き合いください

環境構築に必要なものってなに?

Gulp環境構築に必要なものは以下です

  • Node.js
  • npm
  • gulp

gulpをインストールするためには、npmが必要で、
npmを使うためにはNode.jsが必要なので、Node.js → npm → gulp という順番でインストールしていくことになります

Node.jsをインストールの前に…

まずはNode.jsをインストールしたいところなのですが、ちょっと待ってください


Node.jsをインストールするために、公式サイトからインストールしてもいいのですが、今後のことも考えてバージョン管理ツールを利用したインストールを行います

こうすることで、案件ごとにNode.jsやnpmのバージョンを切り替えることが可能になるのでより柔軟に対応することができます

バージョン管理ツールはOSごとに異なります


Windowsの場合、Nodistnvmがありますがこの記事ではnvmを使います

(実はずっとNodistを使っていたのですがどうやらやめたほうがいいらしいのでnvmを採用することにしました)

バージョン管理ツールをインストールする

まず、GitHubにアクセスします
https://github.com/coreybutler/nvm-windows/releases

次に、以下赤枠のnvm-setup.zipをクリックしてダウンロードします
ダウンロードができたらzipファイルを解凍します

(クリックすると別タブで開きます👇)

解凍が終わったら、nvm-setup.exeをクリックします

すると以下のインストーラーが立ち上がるので全て「Next」で進んでください

次に、コマンドプロンプトを立ち上げてnvmがインストールできたか確認しましょう

立上げかたは、windowsのマークを押し、「コマンドプロンプト」と入力します

立ち上がったら以下赤枠部分に「nvm -v」と入力しEnterを押します

以下赤線部分のようにバージョンが出力されればOKです

Node.jsをインストールする

次にNode.jsをインストールします。

先ほど開いたコマンドプロンプトで「nvm list available」と入力すると
現在インストール可能なNode.jsのバージョンリストが表示されます

nvm list available

上記の通り、色々バージョンがありますが、LTSの最新版をインストールします


インストールするためには以下のコマンドを打ちEnterキーを打ちます

nvm install 14.16.0

インストールが始まるのでしばらく待ちます

インストールが終わったら、
インストールしたNode.jsを使用するために以下コマンドを打ちEnterを押します

※「このアプリがデバイスに変更を求めることを許可しますか」
といったポップアップが出た場合は許可してください

nvm use 14.16.0

これで「Now using node 14.16.0」でればOKです

念のため、ちゃんとNode.jsを使えるか
以下コマンドを打ち込んで確認します

node -v

これでバージョンが出力されていればOKです

npmをインストールする

gulpを使うためにはNode.jsとnpmが必要です
冒頭でも以下のようにお伝えしましたね

gulpをインストールするためには、npmが必要で、
npmを使うためにはNode.jsが必要なので、Node.js → npm → gulp という順番でインストールしていくことになります。


実はnpmは、Node.jsをインストールした段階で自動でインストールされています

コマンドプロンプトで以下のコマンドを入力してみてください

npm -v


すると、以下のようにv6.14.11とバージョンが表示されるかと思います

これでGulpを使用する環境がととのったことになります

いよいよGulpをつかってみる

さて、Gulpを使うための素材が集まったのでいよいよGulpをインストールしていきます

テストフォルダの作成&cdで移動

まずデスクトップなど適当な場所に、適当な名前のフォルダを作り、ご使用のエディタで開いてください

今回僕は「gulp-test」というフォルダをデスクトップに作成し、VsCodeで開いています
(👇クリックしたら別タブで開きます)

次に、コマンドプロンプトを起動し、cdコマンドでgulp-testを作った場所まで移動します

cdというのはChange Directoryの略で、フォルダーの階層を移動するコマンドです

コマンドプロンプトでcd+半角スペースと入力したあと、

エクスプローラーを開き、先ほど作成したフォルダをコマンドプロンプトにドラッグ&ドロップします

そうすると以下の赤枠のようになるのでこの状態でEnterを押します


すると、以下の赤枠のようになっているかと思います
これで「gulp-testにcdした」ということになります

余談:cdをもっと簡単にやる方法

ちなみに、cdをもっと簡単にやる方法があります

1. エクスプローラーを立ち上げ、cdしたいフォルダをクリックします

2. 以下赤枠をクリックします

3. 「cmd」と打ち込みEnterを押します


すると、cdしたいディレクトリに移動した状態でコマンドプロンプトが開きます
いちいちドラッグアンド&ドロップする手間が省けるのでこのやり方をオススメします

package.jsonの作成

gulp-testにcdできたら、次はpackage.jsonを作成します
package.jsonはプロジェクトの設定情報を記述した重要なファイルになります

今後のフォルダ構成のことを考慮して、gulp-testフォルダの直下に_gulpフォルダを作成してください

作成できたら、_gulpフォルダにcdしてください
cdの仕方は、先ほどgulp-testに移動したコマンドプロンプト上で、以下のコマンドを打てばOKです

(※もしコマンドプロンプトを閉じてしまった場合は、再度立ち上げて_gulpフォルダをコマンドプロンプトにドラッグ&ドロップすればOKです)

cd _gulp

コマンドプロンプトが以下のようになっていたら_gulpにcdできています

_gulpにcdできたら、その状態のコマンドプロンプトで以下のコマンドを実行してあげます

npm init -y

すると_gulpフォルダにpackage.jsonというファイルができているはずです

gulpでSassコンパイルに必要なものインストール!

ついに、gulpをインストールします!

SassをGulpでコンパイルするためには次の2つのモジュールが必要です

  • gulp(Gulp本体)
  • gulp-dart-sass(Sassをコンパイルするためのプラグイン)

このほかにもgulp-sassというものがあり、それをインストールしている記事がありますが、それだとNode Sassという昔の記述方法になってしまいます
Sass公式で推奨されているのはDart Sassなので最新の書き方にするためgulp-dart-sassを採用しています

また、そのほかにもいくつか便利で必要なものがあるのでインストールします

  • gulp-plumber(エラーが発生しても強制終了させないためのプラグイン)
  • gulp-notify(エラー発生時やコンパイル成功時にアラートを出力するためのプラグイン)
  • browser-sync(ブラウザリロードするためのプラグイン)


さて、これらをインストールするために
さきほどのコマンドプロンプトに戻ります(一度閉じてしまった人は再度作成したフォルダにcdした状態で開いてください)

コマンドプロンプトで以下コマンドを入力しEnterを押します

npm i gulp gulp-dart-sass gulp-plumber gulp-notify browser-sync

するとなにやらインストールが始まりまるのでしばらく待ちます


インストールが終わったらエディタに戻り、package.jsonを確認してみましょう

先ほどまではなかったgulpやgulp-dart-sass、gulp-plumber 、gulp-notify 、browser-syncがありますね!
また、node_modulespackage-lock.jsonも新たに生成されています


node_modulesにはpackage.jsonに記述された内容をもとにインストールされたモジュールの実態が格納されています

たとえば、インストールしたgulpやgulp-dart-sassなども見つけることができます

package.jsonさえあれば、npm iコマンドを叩くだけで、node_modulesおよびpackage-lock.jsonが生成されます。

そのため、node_modulespackage-lock.jsonはGitで管理しないということを覚えておいてください(特にnode_modulesはめちゃくちゃファイルが重いので…)

つまり、第三者に自分と同じ環境に設定して開発をおこなってほしい場合は、package.jsonと、このあと紹介するgulpfile.jsさえ共有すればいいということです

タスクを作成する!

タスクとは、冒頭でも記述しましたが例えば以下のようなものです

  • Sassのコンパイル
  • CSSの圧縮
  • ファイルを編集したら即座にブラウザを更新して反映する自動リロード(ブラウザシンク)
  • ベンダープレフィックスの自動付与
  • 画像の自動圧縮
  • Babelを使用したJSのコンパイル
  • webpackと一緒に使ってJSをバンドルして圧縮する

gulpを使うメリットはこれらタスクを自動化できることでしたね

そのためには、gulpfile.jsファイルを作成し、このファイルに、自動化したいタスクを記述する必要があります

まず、gulpfile.jsを、先ほど作成した_gulpフォルダの直下に作成してください


つづいて、先ほどインストールしたgulp、gulp-dart-sass、gulp-plumber 、gulp-notify 、browser-syncを読み込み、タスクを作成していきます

ひとまず以下をgulpfile.jsにコピペしてください

const gulp = require('gulp');//gulp本体

//scss
const sass = require('gulp-dart-sass');//Dart Sass はSass公式が推奨 @use構文などが使える
const plumber = require("gulp-plumber"); // エラーが発生しても強制終了させない
const notify = require("gulp-notify"); // エラー発生時のアラート出力
const browserSync = require("browser-sync"); //ブラウザリロード


// 入出力するフォルダを指定
const srcBase = '../_static/src';
const assetsBase = '../_assets';
const distBase = '../_static/dist';


const srcPath = {
  'scss': assetsBase + '/scss/**/*.scss',
  'html': srcBase + '/**/*.html'
};

const distPath = {
  'css': distBase + '/css/',
  'html': distBase + '/'
};

/**
 * sass
 *
 */
const cssSass = () => {
  return gulp.src(srcPath.scss, {
    sourcemaps: true
  })
    .pipe(
      //エラーが出ても処理を止めない
      plumber({
        errorHandler: notify.onError('Error:<%= error.message %>')
      }))
    .pipe(sass({ outputStyle: 'expanded' })) //指定できるキー expanded compressed
    .pipe(gulp.dest(distPath.css, { sourcemaps: './' })) //コンパイル先
    .pipe(browserSync.stream())
    .pipe(notify({
      message: 'Sassをコンパイルしました!',
      onLast: true
    }))
}


/**
 * html
 */
const html = () => {
  return gulp.src(srcPath.html)
    .pipe(gulp.dest(distPath.html))
}

/**
 * ローカルサーバー立ち上げ
 */
const browserSyncFunc = () => {
  browserSync.init(browserSyncOption);
}

const browserSyncOption = {
  server: distBase
}

/**
 * リロード
 */
const browserSyncReload = (done) => {
  browserSync.reload();
  done();
}

/**
 *
 * ファイル監視 ファイルの変更を検知したら、browserSyncReloadでreloadメソッドを呼び出す
 * series 順番に実行
 * watch('監視するファイル',処理)
 */
const watchFiles = () => {
  gulp.watch(srcPath.scss, gulp.series(cssSass))
  gulp.watch(srcPath.html, gulp.series(html, browserSyncReload))
}

/**
 * seriesは「順番」に実行
 * parallelは並列で実行
 */
exports.default = gulp.series(
  gulp.parallel(html, cssSass),
  gulp.parallel(watchFiles, browserSyncFunc)
);

そして、gulp-test直下に、以下の構成になるようにフォルダおよびファイルを作成してください
赤文字のものが作成するフォルダ・およびファイルです

作成した各ファイルには以下をコピペしてください

👇index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>はじめてのGulp</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <h1><span>Hello Gulp!</span></h1>
</body>
</html>

👇modeles > _c-title.scss

h1 {
  color: blue;
  span {
    display: flex;
    align-items: center;
    position: relative;
    &::before,&::after {
      content: '';
      display: block;
      width: 30px;
      height: 2px;
      background-color: green;
    }
    &::before {
      transform: rotate(45deg);
    }
    &::after {
      transform: rotate(-45deg);
    }
  }
}

👇modules>_index.scss

@use './c-title';

👇style.scss

@charset "UTF-8";

@use './modules/index';

いきなり何をやっているのか混乱するかと思うので少しだけ図で説明します

各ファイルの関係性は以下のようになっています


Node Sassという昔の書き方だと、分割したファイルをインポートする際に@import構文を使用しますが、Sass公式推奨のDart Sassだと@use構文で記述します


もし、modulesフォルダに、例えば_c-button.scssファイルを追加したい場合は、modules>_index.scssに以下のように追記していけばOKです
なぜなら、style.scssでこのファイルを読み込んでいるからです

@use './c-title';
@use './c-button';

※こういった、小さな単位のファイルを1つに集約しているファイル(場所)をエントリポイントなどといったりするので覚えておきましょう
今回だとstyle.scssがエントリポイントです

いよいよgulpを起動!

いよいよgulpを起動させます!

gulp-testフォルダの_gulpフォルダに移動した状態のコマンドプロンプトに戻り、以下コマンドを打ってEnterを押してください

npx gulp

すると以下のようにコマンドがズラズラと走り、localhost(ローカルホスト)が立ち上がります


localhostが立ち上がりましたね!!

なお、もしうまくいかずlocalhostが立ち上がらないという方は、ここまでで作成したファイルをまとめたzipファイルを以下よりダウンロードしてください

ダウンロードが完了したらzipを解凍し、余談:cdをもっと簡単にやる方法の手順に従ってコマンドプロンプトを起動し、_gulpフォルダに移動してからnpm iをした後、npx gulpを打ち込んでください

distフォルダについて

エディタに戻ると、「dist」というものが新たに作成されています

このフォルダの中に、gulpによってコンパイルされたcssファイルや、srcフォルダに作成したindex.htmlが出力されています

このように勝手に生成される理由は、gulpfile.jsの以下の部分に、distフォルダに出力するように記述しているからです

気になる方はこの部分を変更してみてください^^
ただ、gulpfile.jsを変更したらコマンドプロンプトの処理をCtrl+Cで一度止め、再度npx gulpと打たないといけないのでそこだけ注意してください

(👇クリックすると別タブで開きます)

なぜこのようにしているかというと、
最終的にdistフォルダに出力することで、お客様に納品したりサーバーにアップするのはdistフォルダだけになるため、非常に管理がしやすくなるためです

SassやHTMLを編集してみよう

さて、ファイルの変更を検知したらブラウザが更新されるか確認してみましょう!


_c-title.scssを開き、h1colorblueからredに変えてCtrl+Sで保存してみます

すると、コマンドプロンプトに「Sassをコンパイルしました!」とメッセージが出力されます

ブラウザを確認すると、redになっていますね!

もしならない場合は、どこか記述が間違っている可能性があります
コマンドプロンプトに戻るとエラー内容が出力されていますのでそちらを参照して修正してください


次に、HTMLも編集してみましょう(編集するのは_static/srcフォルダ内のindex.html

適当な文字に変更してCtrl+Sを押してみてください
ブラウザを確認すると変更内容が反映されています

以上で、GulpをつかったブラウザシンクやSassコンパイルができていることを確認することができました


ちなみに、気づいた方がいるかもしれませんが、Sassを編集した際に、ブラウザがリロードしていないのに変更内容が反映されます

これはgulpfile.jsの以下赤枠部分の記述で、ストリームという機能を導入しているからです

なぜこのようにしているかというと、
Sassを編集するたびにブラウザのリロードが走ると、目がちかちかしてストレスだし、ページ下部のスタイルを変更した際に、時々ページトップに戻ってしまうことがあり、いちいち修正したい箇所にスクロールして戻る必要があるからです

なので、このストレスを解消するべくブラウザシンクのストリームというものを導入しています

おわりに

おつかれさまでした
少し長くなりましたが無事に環境構築ができたのではないでしょうか

今回紹介したタスクのほかにも画像自動圧縮機能や、GulpとwebpackBabelを併用することで、JSのコンパイルやバンドル、圧縮も自動で行うことがきるようになるため、サーバーにアップするファイル容量を各段に小さくすることができます

特に、ファイルの容量はサイトスピードに大きく影響するところなので、大変重要なポイントですよね

とはいえそれら対策のために、都度別のサイトやプラグインで圧縮したりするのは非常に手間です


しかし、Gulpでこれらのタスクを設定して自動化しておけば、意図せずともサイトスピードをあげることが可能になるため非常に効率的です

実際、このサイトもそのような設定のもと開発を行いましたが、サイトスピードを狙いにいっていないにも関わらず爆速な結果となりました

以下はGoogleのLighthouseを使用した結果です
(👇クリックしたら別タブで開きます)


このように、Gulpを使うと、開発者もユーザーもハッピーになれるので使わないともったいないですね!


Gulpをよりカスタマイズした内容についてはまた別の記事で紹介したいと思いますので楽しみにしていてください^^

今回デモで使用したファイルは以下よりダウンロード可能です