Gulp の思想を考える

Gulp の思想を理解すると、Gulp でタスクをどう書くか、なぜブラックリストが存在しているのか、といったことの理解が深まる気がして、少し見てみた。


公式サイトには、「By preferring code over configuration」という言葉が出てきている。

設定を定義するというより、JavaScript で処理を記述していくというスタイルは、Gulp の基本思想ということだろう。


Gulp はブラックリストというものを用意しており、ブラックリストに指定されたプラグインを使おうとすると警告が表示される。

ブラックリストに追加されているプラグインは以下で確認できる。

Gulp がブラックリストに登録する理由には、依存している対象のツールが Duplicated (廃止) されているために Gulp プラグインも廃止になっているから、とか、信用ならないプラグインだから、とかいう理由の他に「Gulp の思想に反している」というものがある。

gulpは自身のストリームの仕様を満たさないプラグインをブラックリストとして登録する場所があって、npmのgulpタグがついたリポジトリを日々精査しています。

Gulp は Node.js の Stream という API を利用し、ビルドするファイルの読み書きをしている。

gulp は、入力されたものに対して処理をいれていき、1つの流れの中でビルドを行うアプローチになります。

Vinyl (ビニール) というのは Gulp で使用する仮想ファイルオブジェクトだが、これをあれこれ引き回し、Stream による処理を行わせるのが Gulp であり、Gulp プラグインはそういうことをするためのプラグインである必要がある、というワケだ。

browserify には、 gulp-browserify というモジュールがあるんだけど、これは宗教上の理由からブラックリスト入りしてるらしいので、ちゃんと生の browserify モジュールを使う。

そこで「bundle が返したオブジェクトを普通に pipe すればいいじゃん!」と思ってこんなことをしてしまうと、エラーが出る。

何故か?答えは、「bundle が返すオブジェクトは vinyl じゃないから」

われわれが browserify を gulp に通すには、bundle の返したファイルストリームを vinyl に変換する必要がある。ここで、 vinyl-source-stream というモジュールを使う。

ということで、Gulp は「入力を受け付けて適切に変換処理して出力する」という形を取っていない Gulp プラグインをブラックリストに入れる傾向がある、ということだ。

gulp 的には「入出力を伴わない処理をプラグインにすんじゃねーよバーカ」ってことなんだと思う。

Gulp と Node.js を混同していると、何でも Gulp プラグインとしてラップされていないと gulpfile.js に書けないと思いがちだが、そんなことはなく、Stream 処理する必要がないモノは直接呼び出して使えば良いのである。


このような考え方が理解できていると、Gulp をよりシンプルに、低い依存度で書けるようになると思う。