1
フロント開発をがんば
るためにGulpとGrunt
に入門してみた
Shou Takenaka
Nov 24, 2015
2
Table of Contents
Gulpとは
Gulpの基本
Gruntとの比較
まとめ
3
GulpとはNode.jsで動くビルドツール(The streaming build
system)
4
ビルドツールシステムをリリースするのに必要なタスク(コンパイ
ル、リンク、静的解析、テスト、デプロイ、etc...)の
実行をアシストしてくれるツール
GNU Make、Ant、Gradle、MSBuild、Rake、Grunt、
Gulp、etc...
5
タスク定義と実行タスクはgulpfile.jsに定義
JavaScriptで書く
gulpコマンドでタスク実行
6
タスク定義と実行gulpfile.js
var gulp = require("gulp");
gulp.task("hello", function() {
console.log("Hello Gulp !!");
});
gulp.task("default", ["hello"]);
実行すると
$ gulp
Hello Gulp !!
7
Gulp API (1)
gulp.task(name, deps, fn): タスク定義
name: タスク名
deps: 依存タスク
fn: タスクの処理内容
8
少し本格的なタスクvar gulp = require("gulp");
var uglify = require("gulp-uglify");
gulp.task("default", function() {
gulp.src("foo.js")
.pipe(uglify())
.pipe(gulp.dest("dest"));
});
9
pipe?
どこかで見たことある
| シェルのこれ
gulp.src() | uglify() | gulp.dest()
のようなイメージ
10
Gulpの動作イメージ
11
Gulpの動作イメージプラグインをpipeでチェイン
pipeで徐々に加工していって目的の出力を得る
UNIX的な考え方で処理を書ける
Node.js のStream API
12
Gulp API (2)
gulp.src(globs): 入力ファイルを取得
globs: 入力ファイルのパターン(src/**/*.jsみたいに
書ける)
13
Gulp API (3)
gulp.dest(path): ファイルへ書き込み
path: 出力先ディレクトリ
14
変更監視ファイルの変更監視もできる
特定のパターンにマッチするファイルが変更されたら
特定のタスクを実行
コールバック関数を実行
15
変更監視gulp.watch("src/**/*.js", ["build"]);
gulp.watch("src/**/*.js", function(event) {
console.log("File " + event.path + " was changed.");
});
16
Gulp API (4)
gulp.watch(glob, tasks), gulp.watch(glob, fn): 変更監視
glob: 監視対象のファイルのパターン
tasks: 変更時に実行したいタスクリスト
fn: 変更時に実行したいコールバック関数
17
基本的には以上4つのGulp API+プラグインでタスクを作っていく
Webアプリの開発に必要になりそうなものは大抵プラ
グインがある
→ 作る前に探す
18
Gruntとの比較同じくNode.jsで動くビルドツールGrunt と比較してみ
る
19
基本的な書き方Gruntfile.js
module.exports = function(grunt) {
grunt.registerTask("hello", "description", function() {
grunt.log.writeln("Hello Grunt !!");
});
grunt.registerTask("default", ["hello"]);
};
20
ちょっと複雑な例module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-contrib-uglify");
grunt.initConfig({
uglify: {
target1: {
src: "foo.js",
dest: "foo.min.js"
}
}
});
grunt.registerTask("default", ["uglify"]);
};
21
Gruntの動作イメージ
22
Gruntの動作イメージプラグインで入力ファイルを処理して、結果をファイ
ルに出力
処理結果をテンポラリファイルに出力し、後続タスク
でそれを読み込んで別の処理... を繰り返して、最終目
的の出力を得る
プラグインの動作は設定で調整
23
GulpとGruntの比較コードベースのGulp、設定ベースのGrunt
Gulpはプラグインを組み合わせて「どうやって目的
の出力を得るか」をコードで記述
Gruntはプラグインに対して「何から何を出力する
か」を設定ベースで記述
24
GulpとGruntの比較プラグインの粒度が違う
Gulpのプラグインは単機能
Gulp plugin guideline says "plugin should only do
one thing".
プラグインを組み合わせてタスクを作る
Gruntはプラグイン=タスク
25
GulpとGruntの比較Gruntは遅いらしいけど本当?
Gruntでプラグインをつないで処理する場合、プラ
グイン毎にディスクI/Oが発生
Gulpはインメモリで処理できるのでその分早い
ただ、トータルでどっちが早いかは状況(使ってる
プラグインなど)による
Grunt next version (0.5) では、Gulpと同じようにディ
スクI/Oなしでタスクの入出力をつなげるようにな
る
26
GulpとGruntの比較先発のGruntの方がユーザーベースが大きい?
Gulp: 1,595,761 DL in last month
Grunt: 1,495,772 DL in last month
27
結局どっちを使う?
できることはどっちも変わらない
一般論でどっちがいい、とは言い難い
コードベースと設定ベース、どっちがプロジェクト
に適しているかという話
28
我々はどっちを使う?
コードベースで手続きが書いてある方が、どういう順
番で何をやっているのかわかりやすい
単機能の処理をパイプでつないでいくという思想がし
っくりくる
必要そうなプラグインは一通り揃ってる
↓
ということでGulp使います

フロント開発をがんばるためにGulpとGruntに入門してみた