もーいーくつねーるーと~、おーしょーうーがーつー♪
という所で、今年も残り 10 営業日を切りましたね・・・・!早いですね!
皆さまいかがお過ごしでしょうか♪

世間はクリスマスなムード一色ですが、皆さまお忘れになってはいないでしょうか。
大掃除という名の一大行事を!!終えない限りはクリスマスを迎えられませんよね(鬱
今週こそはきっと・・・ほほほ。。

自分を追い込んでみたところで、本題に入りたいと思います!
こちらは、ソニックムーブ Advent Calendar 2014 12日目の記事になります!

目次

なぜ gulp なのか

当記事は grunt から gulp に乗り換えを考えているユーザーを対象としているので、Node.js のインストール方法の説明を省かせていただきます・・・!

gulp の実装当時は、grunt と比べてプラグインが少なかったことを理由に grunt を採用する方が多かったかと思います。ですが、今現在は何ら不便がないところまでプラグインも増えてきています!Google の WebStarterKit でも、ついに gulp が採用しました。これはもう乗り換えるしかありませんよね・・・!

gulp に乗り換えるにあたり、メリット・デメリットは下記のようになります。

メリット

  • grunt に比べてコード量が少なくタスクを定義できる
  • StreamAPI を利用することでファイルを毎回書き出す grunt より高速に処理ができる
  • なんとなく先取り感が味わえる

デメリット

  • 記述が Node.js 寄りなので、ある程度 javascript の知識が必要
  • 記述を少なくできる言っても、処理が断長になれば記述もそれなりに多くなる

「なんとなく先取り感が味わえる」・・・これ大事ですよね!!! とりあえず、今回はこの「なんとなく先取り感が味わえる」ように、既存の grunt を gulp へ地道に書き換えてまいりますっ

目標

マークアップをする上で必要不可欠なタスクを厳選しています! これらのタスクなどの設定を順序立てて、解説していきます。

  • Sass/Compass を扱う
  • 簡易サーバーを立ち上げる
  • ファイルが更新されたら自動でブラウザをリロードする
  • 自動でベンダープレフィックスを付与する
  • 自動で CSS のプロパティをソートする
  • 画像のデータ容量を圧縮する
  • ファイルをコピーする
  • ファイルを削除する
  • タスクを直列処理する

gulp-compass

sass/compass を扱うパッケージ。自動で css sprite を生成させる。

gulp-compass

gulp-connect

簡易サーバーを立ち上げるパッケージ。

gulp-connect

gulp-watch

ファイルが更新されたら自動でブラウザをリロード(Livereload)するパッケージ。

gulp-watch

gulp-autoprefixer

自動でベンダープレフィックスを付与するパッケージ。

gulp-autoprefixer

gulp-csscomb

自動で CSS のプロパティをソートするパッケージ。

grunt-csscomb

gulp-imagemin

画像のデータ容量を圧縮するパッケージ。

gulp-imagemin

gulp-clean

ファイルを削除するパッケージ。

gulp-clean

run-sequence

タスクを並列/直列処理するパッケージ。

run-sequence

Before(grunt)

After(gulp)

ディレクトリ構成

構成はシンプルに開発用と納品用でディレクトリを分けるようにしています。

開発中にブラウザチェックを行なうルートとなるディレクトリは、「_src」 直下になります! ディレクトリ「dist」は空っぽで問題ありません!ディレクトリ「css」やディレクトリ「img」内は、カテゴリ毎でディレクトリを分けても耐えられるようにしています。

基本設定

1. package.json を作成する

1)コマンドプロンプトでプロジェクトとなるディレクトリに移動します。

※[path] は任意

2)コマンドプロンプトで下記コマンドを入力します。

3)設定についていろいろ質問が続きますが・・・ ひとまずは、すべて Enter を押していきます。

すると、設定した内容で package.json が生成されたことが確認できます! package.json の設定はのちほど変更することができますが・・・。name の値が gulp となっていると、「3. ローカルに gulp をインストールする」でエラーが出るので、gulp 以外の適当な英数字な値に変更しておきましょう!!

ss1

2. グローバルに gulp をインストールする

管理者権限でコマンドプロンプトを立ち上げ、下記コマンドを入力します。

Windows の場合

Mac の場合

3. ローカルに gulp をインストールする

コマンドプロンプトで再びプロジェクトとなるディレクトリに移動して、下記コマンドを入力します。

grunt を扱っていた方はご存知なように、–save-dev を付けることによって package.json にパッケージの記述が自動的に追加されていきます!!

ss2

※github のリポジトリの記述がありますが、無くて大丈夫です。

4. gulpfile.js を作成する

もろもろ準備が整ったところで、gulp の設定を行ってまいりましょう!

1)ファイル名「gulpfile.js」として、新規ファイルを作成します。
2)gulpfile.js にパッケージ「gulp」をインポートする記述を追加します。

3)gulpfile.js にディレクトリ設定の記述を追加します。

このように定義して、ディレクトリパスを管理しやすくします!

さて・・・これで準備完了です!! 次はいよいよ、最強の武器となるタスクを設定していきます!

タスク設定

compass

sass/compass を扱うタスク。
自動で css sprite を生成させる。

パッケージ

gulp-compass

インストール

設定

css や sass のオプションは必須のようです。設定が重複するので、confing.rb の css_dir や sass_dir は削除しておきましょう!

connect

簡易サーバーを立ち上げるタスク。

パッケージ

gulp-connect

インストール

設定

reload

ファイル監視中に更新されたタイミングでブラウザを自動更新するために、事前にタスクを作成しておきます!!

設定

watch

ファイルが更新されたら自動でブラウザをリロード(Livereload)するタスク。

パッケージ

gulp-watch

インストール

設定

autoprefixer

自動でベンダープレフィックスを付与するタスク。

パッケージ

gulp-autoprefixer

インストール

設定

csscomb

自動で CSS のプロパティをソートするタスク。

パッケージ

gulp-csscomb

インストール

設定

imagemin

画像のデータ容量を圧縮するタスク。

パッケージ

gulp-imagemin

インストール

インストール(Windows7の場合)

設定

copy

タスク「pngmin」で画像を圧縮した後、dist ディレクトリにコピーします! コピーするだけだと、特別なパッケージをインストールする必要はありません! 下記の記述を追加するだけとなりますっ

設定

clean

ファイルを削除するタスク。

パッケージ

gulp-clean

インストール

設定

default

開発用タスク。各ファイル監視してビルドする。

設定

dist

納品用タスク。データを最適化したり、データ容量を圧縮する。

パッケージ

run-sequence

インストール

設定

gulp は登録したタスクが並列で実行されていくようになっているのですが、並列で動作するとタスク「imagemin」で画像が軽量化される前に タスク「copy」が実行され、軽量化されないデータがディレクトリ「dist」に書き出されてしまうなど、色々と問題が発生してしまうのです。。これらを防ぐため、タスクが完了してから次のタスクを実行するよう直列な処理ができるように、パッケージ「run-sequence」を併用してあげます!

以上で gulpfile.js が完成となります!!

トラブルシューティング

package.json の name を gulp にしていた場合のエラー

ss10

package.json にある name の値が gulp となっていませんか? gulp 以外の適当な英数字な値に変更しましょう!

gulp-imagemin をインストールする際に発生するエラー

ss3

※2014/12/11現在 gulp-imagemin@2.0.0

このようなエラーが発生したら・・・。 Windows7 で最新版をインストールしようとすると、エラーが出るので旧バージョンをインストールしましょう。

どうやら・・・Windows7 に対応している最新バージョンは「1.0.0」なようです。最新版からスタートして、インストール/アンインストールを繰り返し地道に調べましたよっ

さいごに

いかがでしたでしょうか?

今回は grunt で使っていたタスクをそのまま gulp に書き換えるよう専念しましたが、処理を組み合わせることで、もっともっと記述を短くして処理を軽くすることができるようです!

パッケージをインポートする部分の記述は package.json の内容を自動で読み込むように改変したい・・・!! 今後、今の半分は記述を減らせるように精進したいと思います!!

こちらの記事が皆様のお役に立てていただければ幸いでございます!
長文となりましたが・・・お付き合いいただきありがとうございました!

参考URL

あわせて読みたい記事