こんにちは!ウェブ開発担当の清水です。
「Fenrir Advent Calendar 2014」も終盤の 23 日目となりました。
近年フロントエンド中心の開発が増加し、その際考慮すべきことが複雑になってきました。例えば SASS や CoffeeScript などのコンパイル、複数ファイルの統合、圧縮(Minify)などが挙げられます。
それらのタスクを一度に処理できるツールには Grunt などがありますが、最近はよりシンプルに設定を記述できる gulp.js というなかなか良さそうなものが現れました。
私の「2014年にグッときたコレ」では、その gulp.js について簡単に紹介したいと思います。
インストール
gulp.js は Node.js のモジュールで、npm からインストールします。
$ npm install gulp -g
次に init コマンドでパッケージ管理ファイルの package.json を作成します。
$ npm init
package.json
{ "name": "gulp_test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
gulpfile.js 作成
今回は以下のようなタスクの自動化をしてみましょう。
- CoffeeScript のコンパイル
- ファイルを圧縮(.min)
必要なプラグインをインストールします。なお、–save-dev オプションを追加することで package.json に自動で登録されます。
$ npm install gulp gulp-coffee gulp-uglify gulp-rename --save-dev
では実際のタスクを記述する gulpfile.js 作成しましょう。Grunt における Gruntfile.js にあたります。
gulpfile.js
// プラグインの読み込み var gulp = require('gulp'), coffee = require('gulp-coffee'), // CoffeeScript コンパイル uglify = require('gulp-uglify'), // JavaScript 圧縮 rename = require('gulp-rename'); // リネーム // タスク定義 gulp.task('coffee-compile', function() { // 処理対象ファイル return gulp.src('coffee/**/*.coffee') .pipe(coffee()) .pipe(gulp.dest('js')) .pipe(rename({suffix: '.min'})) .pipe(uglify()) .pipe(gulp.dest('js')); });
gulp.pipe([実行処理]) を連結し、最後に gulp.dest([出力先]) で出力しています。Gruntfile では各タスクを json 形式で記述していくため若干長くなりがちですが、gulpfile はよりシンプルで処理の流れもわかりやすい印象を受けます。
実行
coffee ディレクトリに適当なファイルを作成し、gulp [タスク名] で実行してみましょう。
coffee/main.coffee
$ -> console.log 'gulp test' return
$ gulp coffee-compile [12:39:13] Using gulpfile ~/xxx/gulp_test/gulpfile.js [12:39:13] Starting 'coffee-compile'... [12:39:13] Finished 'coffee-compile' after 69 ms
すると js ディレクトリに main.js と main.min.js が生成されました!
js/main.js
(function() { $(function() { console.log('gulp test'); }); }).call(this);
js/main.min.js
(function(){$(function(){console.log("gulp test")})}).call(this);
変更を監視
さて、たびたびコマンドを叩くのは手間なので、ファイルの変更を監視して自動で実行するようにしてみましょう。監視メソッド gulp.watch([対象ファイル], [タスク名]) を追記します。
gulpfile.js
... gulp.task('watch', function() { gulp.watch(['coffee/**/*.coffee'], ['coffee-compile']); }); gulp.task('default', ['watch']);
これで coffee/**/*.coffee に変更があるたび coffee-compile が動作します。ちなみに、’default’ に定義してあるものはタスク名を省略できます。
$ gulp [12:39:58] Using gulpfile ~/xxx/gulp_test/gulpfile.js [12:39:58] Starting 'watch'... [12:39:58] Finished 'watch' after 7.55 ms [12:39:58] Starting 'default'... [12:39:58] Finished 'default' after 6.68 μs [12:40:07] Starting 'coffee-compile'... [12:40:07] Finished 'coffee-compile' after 59 ms
plumber を導入
現在の設定では CoffeeScript から JavaScript へのコンパイルでエラーとなった場合、監視自体が終了してしまいます。そこで plumber というプラグインを追加することで回避してみます。
$ npm install gulp-plumber --save-dev
gulpfile.js
var gulp = require('gulp'), coffee = require('gulp-coffee'), uglify = require('gulp-uglify'), rename = require('gulp-rename'), plumber = require('gulp-plumber'); // ←追加 gulp.task('coffee-compile', function() { return gulp.src('coffee/**/*.coffee') .pipe(plumber()) // コンパイルエラー時に中断させない .pipe(coffee()) .pipe(gulp.dest('js')) .pipe(rename({suffix: '.min'})) .pipe(uglify()) .pipe(gulp.dest('js')); }); ...
タスクを共有するときは
git などのバージョン管理システムを利用している場合、gulpfile.js と package.json を管理しておけば npm install を実行するだけで必要なプラグインが導入されます。また、npm のインストール時に自動作成される node_modules ディレクトリ以下は管理対象外しておくと良いかもしれません。
まとめ
gulp.js のプラグイン数は Grunt に比べるとまだまだ少ないものの、基本的な機能はそろっています。またタスクの記述がシンプルであるため、わりと理解しやすかと思います。ここで紹介したプラグインはほんの一部でしたが、他にも便利なものが色々とありますので、ぜひ試してみてください!
より詳しく知りたい方へ
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!