JavaScriptユーティリティライブラリのlodashがバージョン3.5に達して,npmパッケージリポジトリの中で最も多く参照されるライブラリになった。もはや代用品などではなく,信頼できる選択肢のひとつだ。
そもそもの始まりは,コントリビュータ間の意見の相違が原因で,Underscore.jsからフォークしたことだ。John-David Dalton氏がリーダであった頃の目標は,より“ブラウザに依存しない,一貫性のある挙動 ...とパフォーマンス改善”を実現することだった。その後,プロジェクトは後継の開発を続け,今年1月にバージョン3.0がリリースされた。
lodashは,以前の名称であるUnderscoreと同じく,すべての機能名の前にある文字にちなんで命名されている。グローバルな$
にすべてアタッチするjQueryと同じように,lodashではグローバルな_
を使うことで,便利なツールに簡単にアクセスできる。配列のすべての要素を処理するには,次のように記述する。
_.each([1, 2], function(n) { console.log(n); });
バージョン3では,_.camelCase
や_.flattenDeep
のような47のメソッドが新たに追加されるなど,多くの変更が行われている。さらに重要なのは,メソッドの呼び出しを連続的に実行する連鎖メソッドが,遅延評価されるように変更されたことだ。
var users = [
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'pebbles', 'age': 1 }
];
var youngest = _.chain(users)
.sortBy('age')
.map(function(chr) {
return chr.user + ' is ' + chr.age;
})
.first()
.value();
// → 'pebbles is 1'
このようなメソッドに対して,遅延評価を適用することによってパフォーマンスの最適化が可能になる,とDalton氏は,InfoQとのインタビューで語っている。
遅延評価の導入によって,メソッドの連鎖は,明示的ないし暗黙の
value()
が要求されるまで実行されません。実行が延期されることにより,処理を一体化してショートカットするなどの最適化が可能になります。連続した反復処理を結合することで,繰り返し回数を大幅に削減することができるのです。
Filip Zawada氏は,この変更によってパフォーマンスが大きく向上した,と述べている。
lodashはもともと,Underscoreを置き換えるものとしてスタートしたが,バージョン3.0では,置き換え対象となるUnderscoreのビルドは特定されなくなった。“Undersocre/Backboneのユニットテストによるテストは行っていますが,lodash v3では,特定のUndersocre/Backboneのビルドのサポートはしていません。”とDalton氏は言う。
昨年以降,UnderscoreがlodashのAPIに一致するようになってきたため,Underscoreのビルドを区別する必要性が少なくなりました。特別な部分での互換性が必要ならば,lodash v3のモジュールを使用して,Underscoreでの使用を補完することを推奨します。
JavaScriptトランスパイラのBabel,ブログプラットフォームのGhost,プロジェクトのベースとなるツールであるYeomanなど,npmの主要なパッケージのいくつかは,lodashに依存している。Ghostの場合は,当初使用していたUndersocreからlodashに切り替えている。Ghostがlodashを採用した理由について,開発者のJohn O'Nolan氏はInfoQに,“主として私たちオープンソースコミュニティがあおり立てた,とても現実的な決定だったのです。”と話している。
lodashは機能が多くてパフォーマンスもよく,構文のバージョニングも適切です。Node.jsコミュニティ(依存関係もすべて含む)では,とても有名な存在になりつつあります。
lodashはnode.js開発者の間で有名なだけでなく,ブラウザベースのプロジェクトでも利用されている。Web開発者はライブラリ全体をダウロードする代わりに,実験的ビルドツールを使って,プロジェクトに必要なメソッドをチェリーピックすることが可能だ。node.jsプロジェクトでパッケージ全体が必要でない場合には,メソッドを個別にをインクルードできる。