アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

gulp-usemin

December 14, 2014開発bower, gulp, gulp-usemin, node.js

この前の記事では Grunt と grunt-usemin によるビルドを試したが、今回はこれの gulp 版となる gulp-usemin を利用してみる。ツールの使い方は以下の記事を参考にした。

プロジェクトのファイル構成

前回記事の構成を流用する。ルート直下に npm と Bower の設定ファイル、そして今回の gulp 用ファイルを配置し、src を開発用とする。gulp によるビルドを実行すると dist に成果物が出力される。

/
├ package.json
├ bower.json
├ gulpfile.js
│
└ bower_components/
│  └ ライブラリ
│
└ node_modules/
│  └ node.js パッケージ
│
└ src/
   ├ index.html
   ├ page-1.html
   ├ page-2.html
   ├ css
   │  └ style.css
   ├ js
   │  └ main.js
   └ img
      ├ logo.png
      └ background.png

gulpfile.js

Grunt と同様に gulp によるビルド処理は JavaScript または CoffeeScript で実装。ファイル名は gulpfile.js となる。

Grunt のビルドは grunt.initConfig に設定を定義して grunt.registerTask に登録したタスクから参照するスタイルだった。宣言的に設定を書くという思想があるのかもしれないが、この記法だと設定が増えてきたときタスクとの距離が遠くなる。設定を変数にくくり出すなどして整理しないと見通しにくい。

gulp の場合、設定ではなく処理を直接記述するような感じになる。The streaming build system と銘打つとおりファイルやフォルダをストリームとして扱い、その途中に処理を挟みこんでゆく。処理間は pipe で結ばれ。...という認識なのだが誤解してるかも。

では実際に使ってみよう。npm initbower init は済んでいるものとして、まずはグローバルに gulp をインストール。

$ npm install -g gulp

次にプロジェクトのルートでビルドに利用するパッケージをインストール。Grunt の時と同様に --save-dev オプションを付けて package.json へ記録。

$ npm install --save-dev gulp
$ npm install --save-dev gulp-concat
$ npm install --save-dev gulp-minify-css
$ npm install --save-dev gulp-uglify
$ npm install --save-dev gulp-usemin
$ npm install --save-dev gulp-watch
$ npm install --save-dev rimraf

これらを利用して Grunt の時に実装した処理を移植すると以下のようになる。

var gulp      = require( 'gulp' );
var uglify    = require( 'gulp-uglify' );
var minifyCSS = require( 'gulp-minify-css' );
var usemin    = require( 'gulp-usemin' );
var rimraf    = require( 'rimraf' );

gulp.task( 'clean', function( cb ) {
    rimraf( 'dist', cb );
} );

gulp.task( 'build', [ 'clean' ], function() {
    gulp.src( 'src/img/**'  ).pipe( gulp.dest( 'dist/img'  ) );

    gulp.src( 'src/**/*.html' )
        .pipe( usemin( {
            css: [ minifyCSS() ],
            js:[ uglify() ]
        } ) )
        .pipe( gulp.dest( 'dist' ) );
} );

gulp.task( 'watch', function( cb ) {
    gulp.watch( [ 'src/js/*.js', 'src/css/*.css' ], [ 'build' ] );
} );

gulp.task( 'default', [ 'watch' ] );

gulp.src で入力をとり pipe でストリームの連結と割り込み処理が実行されてゆく。pipegulp.dest を実行するとその時点のストリームが出力される。

今回の gulp-usemin だと入力が HTML になる。HTML のストリームから usemin が処理対象となる build:cssbuild:js とコメントされた区分を見つけその中を結合。Minify して HTML の参照を書き換える。最後に grunt.dest によって処理結果が dist へ出力される。

ビルドを実行する場合、今回のタスクだと build を利用する。プロジェクトのルートで以下を実行すると Grunt の時と同様の結果が dist フォルダに出力されるはず。

$ gulp build

個人的には gulp の方が Grunt に比べてビルド処理の結果を予測しやすくて好みだ。ビルドで頻出する src/dest の概念が組み込みという点も気に入った。

サンプル

今回の記事で作成したプロジェクトをサンプルとして GitHub に公開してみた。

clone して README.md の Installation に書かれた手順を実行すると gulp-usemin によるビルドを試せる。