長くライバルと見られていた,人気のJavaScriptライブラリであるUnderscoreとLodashが,統合に向けて協議を開始した。開発者としては期待を持てる話題ではあるが,それぞれのプロジェクトをリードする個性の強さから,完全な合意に至るのは難しいようにも思われる。
先週のGithubイシューの中で,Underscoreの開発者であるJeremy Ashkenas氏は,Lodashを開発したJohn-David Dalton氏から,2つのライブラリを統合する可能性について申し入れがあったことを明らかにした。コミュニティから熱狂的な議論が起きるのは必至だった。どちら側がメインになるべきかという理由について,それぞれの支持者たちが自身の考える理由を表明した。
Underscoreは重要性の低い小規模なライブラリであるため,Lodashこそが唯一の選択肢である,とする意見もあった。“単純にUndersocreを廃止してはどうだろう? Lodashの完成度が高いのは明らかで,両方を継続できる”と,Nijiko Yonskai氏は言う。さらに氏は,
Underscoreを捨ててLodashを継続するのでない限り,2つのプロジェクトを統合する意味はありません。目的とするものが違います。Lodashはより包括的で強固な,メンテナンスの行き届いたライブラリを要する人たちのためのものなのです。
Lodashの優れた点はモジュール性だ。ライブラリ全体をインクルードする必要はなく,必要な関数だけを含めることができる。モジュール毎にnpmで公開されているので,個別に参照することが可能なのだ。
npm install lodash.map
var map = require('lodash.map');
ドキュメントに関しては,アプローチする方向が違う。Underscoreが対話的な論調であるのに対して,Lodashのアプローチはよりフォーマルな形式を指向しているのだ。each
関数についてのドキュメントを例にすれば,次のような違いがある。
リストの要素を反復処理して,順にIteratee関数に引き渡す。要素が渡されると,Iterateeはそのコンテキストオブジェクトにバインドされる。Iteratee関数は起動毎に,(element, index, list)という3つの引数で呼び出される。リストがJavaScriptオブジェクトの場合,引数は(value, key, list)になる。チェーンのためのリストを返却する。
コレクションの各要素を反復し,それぞれに対してIterateeを呼び出す。IterateeはthisAgeにバインドされ,3つの引数 (value, index|key, collection) を伴って呼び出される。Iteratee関数から明示的にfalseを返すことで,反復を早期に完了することが可能である。
InfoQとのインタビューでDalton氏は,Ashkenas氏に申し入れした理由として,ライブラリに対するビジョンの共有を挙げている。
私たちはほとんど同じ目標,ほとんど同じAPI(~60%),ほとんど同じコントリビュータを共有しています。双方で重複する労力を削減し,開発者の選択とサポートを簡単にするために,プロジェクトの統合は理に適っています。
しかしながら,“どのように”統合するかは不明確だ。Underscoreコントリビュータ間のGitHubディスカッションでは,Ashkenas氏が次のように語っている。
複雑性を増長するような寄せ集めコード(FrankenScore)をあわてて開発したり,公開したりする必要はないでしょう。意味があるとは思えません。皆が合意できる統合版 “Undersocre 2.0”を構想して,その目標に向かう方が,より価値のある作業だと思います。
統合に関するInfoQの質問に対して,BabelのコントリビュータであるJames Kyle氏が主張するのは現状維持だ。“これまでと同じことが続いていくではないでしょうか。Lodashがゆっくりと,しかし確実に,状況を引き継ぐと思います。” 氏の個人的な希望のようにも聞こえるが,しかし,
今日のJavaScriptコミュニティには,重複した活動があまりにも多すぎます。その大きな理由は,意見を異にする時に,適当な合意に達することができていない点にあります。Lodashには,Underscoreに対応するための変更を加えるに十分な柔軟性があると思いますが,もしもUnderscoreに譲歩の余地のない部分があるのならば,個人的には統合しない方がよいように思います。
Underscore.jsとLodashはいずれも,最も広く利用されているJavaScriptライブラリのひとつだ。先月のnpmでは,両方合わせて約200万件のダウンロードを記録している。