Skip to content

Commit 7685a58

Browse files
committed
Merge pull request #85 from azu/gulp-pros-cons
gulp 向き不向き、エコシステム
2 parents cffa9c7 + cfa1b24 commit 7685a58

File tree

3 files changed

+69
-7
lines changed

3 files changed

+69
-7
lines changed

ja/ESLint/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ add(1, 3);
233233
この`RuleContext`はルールから使えるユーティリティメソッドをまとめたもので、
234234
今回は`RuleContext#report`というエラーメッセージをルールからMyLinterへ通知するものだけを実装しています。
235235

236-
ルールの実装の方を見てみると、直接オブジェクトをexportしてる訳ではなく
236+
ルールの実装の方を見てみると、直接オブジェクトをexportしてるわけではなく
237237
`context` つまり`RuleContext`のインスタンスを受け取っていることが分かると思います。
238238

239239
[import, no-console.js](../../src/ESLint/no-console.js)

ja/gulp/README.md

+65-6
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,69 @@ BufferはStringと相互変換が可能であるため、多くのgulpプラグ
214214

215215
つまり、prefixを付けるといった変換処理自体は、既存のライブラリで行うことができるようになっています。
216216

217-
gulpプラグインの仕組みは[vinyl](https://github.com/gulpjs/vinyl "vinyl")オブジェクトのデータをプラグイン同士でやり取りすることで入力/変換/出力を行い、そのインタフェースとして既存のNode.js Streamを使っていると言えます。
217+
gulpプラグインの仕組みは[vinyl](https://github.com/gulpjs/vinyl "vinyl")オブジェクトのデータをプラグイン同士でやり取りすることで入力/変換/出力を行い、
218+
そのインタフェースとして既存のNode.js Streamを使っていると言えます。
218219

219-
- [ ] どういう用途に向いている?
220-
- [ ] どういう用途に向いていない?
221-
- [ ] この仕組みを使っているもの
222-
- [ ] 実装してみよう
223-
- [ ] エコシステム
220+
## エコシステム
221+
222+
gulpのプラグインが行う処理は「入力に対して出力を返す」が主となっています。
223+
この受け渡すデータとして[vinyl](https://github.com/gulpjs/vinyl "vinyl")オブジェクトを使い、受け渡すAPIのインタフェースとしてNode.js Streamを使っています。
224+
225+
gulpではプラグインは単機能であること推奨しています。
226+
227+
> Your plugin should only do one thing, and do it well.
228+
> -- [gulp/guidelines.md](https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/guidelines.md "gulp/guidelines.md at master · gulpjs/gulp")
229+
230+
gulpは既存のNode.js Streamに乗ることで独自のAPIを使わずに解決しています。
231+
232+
元々、Transform Streamは1つの変換処理を行うことに向いていて、その変換処理を`pipe`を繋げることで複数の処理を行う事できます。
233+
234+
また、gulpはタスク自動化ツールであるため、既存のライブラリをそのままタスクとして使いやすくすることが重要だと言えます。
235+
Node.js Streamのデフォルトでは流れるデータが`Buffer`であるため、そのままでは既存のライブラリでは扱いにくい問題を
236+
データとして[vinyl](https://github.com/gulpjs/vinyl "vinyl")オブジェクトを流す事で緩和しています。
237+
238+
このようにして、gulpはタスクに必要な単機能のプラグインを既存のライブラリを使って作りやすくしています。
239+
これにより再利用できるプラグインが多くできることでエコシステムを構築していると言えます。
240+
241+
## どういう用途に向いている?
242+
243+
gulpはそれ自体はデータの流れを管理するだけであり、タスクを実現するためにはプラグインが重要になります。
244+
タスクには様々な処理が想定されるため、必要になるプラグインも種類が様々なものとなります。
245+
246+
gulpでは[vinyl](https://github.com/gulpjs/vinyl "vinyl")オブジェクトを中間フォーマットと決めたことで、
247+
既存のライブラリをラップしただけのプラグインが作りやすくなっています。
248+
249+
またgulpは、Gruntとは異なり、タスクをJavaScriptのコードして表現します。
250+
これにより、プラグインの組み合わせだけだと実現できない場合に、直接コードを書くことで対応するといった対処法を取ることができます。
251+
252+
そのため、プラグインの行う処理の範囲が予測できない場合に、gulpのように中間フォーマットとデータの流し方だけを決めるというやり方は向いています。
253+
254+
まとめると
255+
256+
- 既存のライブラリをプラグイン化しやすい
257+
- 必要なプラグインがない場合も、設定としてコードを書くことで対応できる
258+
259+
## どういう用途に向いていない?
260+
261+
プラグインを複数組み合わせ扱うものに共通することですが、プラグインの組み合わせの問題はgulpでも発生します。
262+
263+
例えば、[Browserify](https://github.com/substack/node-browserify)はNode.js Streamを扱えますが、
264+
先頭に置かないと他のプラグインと組わせて利用できない問題があります。
265+
266+
- [gulp/browserify-transforms.md at master · gulpjs/gulp](https://github.com/gulpjs/gulp/blob/master/docs/recipes/browserify-transforms.md "gulp/browserify-transforms.md at master · gulpjs/gulp")
267+
268+
また、gulpは単機能のプラグインを推奨していますが、これはAPIとしてそういう制限があるわけではないためあくまでルールとなっています。
269+
270+
このような問題に対してgulpはガイドラインやレシピといったドキュメントを充実させることで対処しています。
271+
272+
- [gulp/docs at master · gulpjs/gulp](https://github.com/gulpjs/gulp/tree/master/docs "gulp/docs at master · gulpjs/gulp")
273+
274+
既存のライブラリをプラグイン化しやすい一方、
275+
プラグインとライブラリのオプションが異なったり、利用者はプラグイン化したライブラリの扱い方を学ぶ必要があります。
276+
277+
ライブラリとプラグインの作者が異なるケースも多いため、同様の機能を持つプラグインが複数できたり、質もバラバラとなりやすいです。
278+
279+
まとめると
280+
281+
- プラグインの組み合わせ問題は利用者が解決しないといけない
282+
- 同様の機能を持つプラグインが生まれやすい

test/prh-rule.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,6 @@ rules:
8686
- expected: String
8787
patterns:
8888
- 文字列オブジェクト
89+
90+
- expected: わけでは
91+
patterns: 訳では

0 commit comments

Comments
 (0)