
GitHubのクイックリサーチによれば、JavaScriptプロジェクトは2017年5月時点で110万以上存在しています。npmjs.orgには利用可能なパッケージが50万個あり、ダウンロード数は毎月約100億回にのぼります。開発者の数よりもJavaScriptフレームワーク、ライブラリー、ツールの数のほうが多いかもしれません。
本記事では、クライアントサイドで特に人気の高いJavaScriptフレームワーク、ライブラリー、ツールの基礎や主な違いを紹介します。選んで、使ってみて「ベスト」を見つけてください。ただし、いつかは「より良い」フレームワーク、ライブラリー、ツールが登場すると覚えておいてください。
以下の条件に同意の上してから読み進めてください。
「フレームワーク」、「ライブラリー」、「ツール」は、使う人、状況、文脈に応じて変わる可能性があります。定義は以下のとおりです。
ライブラリーは便利な機能を体系的にまとめたものです。典型的なライブラリーは文字列、日付、HTML DOM要素、イベント、クッキー、アニメーション、ネットワークリクエストなどを扱う関数を備えています。各関数は呼び出し元のアプリケーションに値を返します。アプリケーションには任意のライブラリーを組み合わせられます。車の部品選びに置き換えると、車を組み立てるためにどんなものを使っても良いですが、エンジンは自分で作る必要があります。
ライブラリーは、高度に抽象化されているため、細部の実装を気にする必要がなくなり、一貫性が保てます。たとえば、AjaxはXMLHttpRequest APIを使いますが、実装には数行コードを書き、ブラウザー間の微妙な差異を考慮する必要があります。ライブラリーなら「ajax()関数」で、細部の実装を気にすることなく、高度なビジネスロジックに集中できます。
ライブラリーで細かい部分を気にする必要がなくなり、開発時間を20%短縮できます。ただし、欠点もあります。
フレームワークはアプリケーションの骨格です。フレームワークを使う場合は特定の手法を用いてソフトウェアを設計することが必要になり、ロジックも決まった場所に挿入します。フレームワークは基本的に、イベント、ストレージ、データバインディングなどの機能を備えています。車でいえば、フレームワークは製造済みのシャシー、ボディ、エンジンを用意してくれます。車を走れる状態に保つかぎり、部品の追加、削除、変更が可能です。
フレームワークは通常、ライブラリーよりも高度に抽象化されているため、使用することでプロジェクトを80%の所まで素早く進められます。欠点は次のとおりです。
ツールがあれば開発が捗りますが、プロジェクトに必要不可欠ではありません。ツールにはビルドシステム、コンパイラー、トランスパイラー、コード圧縮ツール、画像圧縮ツール、デプロイツールなどがあります。
ツールがあれば開発プロセスがより簡単になります。たとえば、CSSよりもコードの分割、ネスト、変数、ループ処理、関数を使用できるSassを好むコーダーは多いです。ブラウザーはSaSS、SCSSの構文を理解できないので、テストとデプロイ前に適切なツールを使ってコードをCSSにコンパイルします。
ライブラリー、フレームワーク、ツールの境界線は不明瞭で、フレームワークにライブラリーが含まれたり、ライブラリーがフレームワークのようなメソッドを実装していたり、ツールがライブラリーやフレームワークに必要だったりします。記事ではプロジェクトをどれかに割り当てていますが、実際の機能の幅はさまざまです。
ここまで読んで、複雑だと感じるなら、素のJavaScriptを書く手もありますが、JavaScriptはブラウザーとOSの上で稼働する抽象化した存在なので、やがてライブラリーやフレームワークを書いたりメンテナンスしたりする日が来ます。
人気順でプロジェクトを紹介します。
| jQuery | |
|---|---|
| 種別 | ライブラリー |
| Webサイト | jquery.com |
| リポジトリ | github.com/jquery/jquery |
| 現在のバージョン | 3.2.1 |
| 開発者 | jQueryチーム |
| 公開日 | 2006年8月 |
| サイズ | 30KB(圧縮版) |
| 主な用途 | 多目的 |
| 使用率 | 全Webサイト中72.4%が使用 |
jQueryはこれまでに作られたJavaScriptライブラリーの中で、一番利用されているライブラリーです。 WordPress、ASP.NET、そのほかのフレームワークでも利用できます。DOMノードの取得にCSSセレクターを導入し、イベントハンドラー、アニメーション、Ajaxコールを組み合わせることでクライアントサイドの開発に革命をもたらしました。
jQueryは近年人気が落ちていますが、JavaScriptの機能が少しだけ必要なプロジェクトには、有力な選択肢です。
長所:
短所:
| React | |
|---|---|
| 種別 | ライブラリー |
| Webサイト | facebook.github.io/react/ |
| リポジトリ | github.com/facebook/react |
| 現在のバージョン | 15.5.4 |
| 開発者 | Facebookおよびコントリビューター |
| 公開日 | 2013年3月 |
| サイズ | 21KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Reactはユーザーインターフェイスを構築するためのJavaScriptライブラリーで、この1年でもっとも話題になったライブラリーです。MVC(Model-View-Controller)の「ビュー」に特化して、状態を保持するUIコンポーネントを簡単に作成できます。Reactは仮想DOMを実装した最初期のライブラリーで、メモリ内の構造とページとの差異を演算することで、ページを効率的に更新できます。
統計によるとReactの使用率は低いです。おそらく、ReactがWebサイトよりもアプリケーションで使われているためです。開発者の38%近くがReactを使っていると答えています。
長所:
短所:
| Lodash | |
|---|---|
| 種別 | ライブラリー |
| Webサイト | lodash.com/ |
| リポジトリ | github.com/lodash/lodash/ |
| 現在のバージョン | 4.17.4 |
| 開発者 | John-David Dalton |
| 公開日 | 2012年4月 |
| サイズ | 4KB~24KB(圧縮版) |
| 主な用途 | 多目的 |
| 使用率 | 低 |
| Underscore | |
|---|---|
| 種別 | ライブラリー |
| Webサイト | underscorejs.org |
| リポジトリ | github.com/jashkenas/underscore |
| 現在のバーション | 1.8.3 |
| 開発者 | Jeremy Ashkenas |
| 公開日 | 2009年10月 |
| サイズ | 6KB(圧縮版) |
| 主な用途 | 多目的 |
| 使用率 | 低 |
LodashとUnderscoreをまとめて紹介します。どちらも文字列、数値、配列などの基本的なネイティブオブジェクトのメソッドを補う機能的なJavaScriptユーティリティを数多く備えています。機能の一部が重複しているので、プロジェクトで両方のライブラリーが必要になる可能性は低いです。
クライアントサイドでの使用率は低いですが、どちらのライブラリーもサーバーサイドのNode.jsアプリケーションに使えます。
長所:
短所:
| AngularJS | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | angularjs.org |
| リポジトリ | github.com/angular/angular.js |
| 現在のバージョン | 1.6.4 |
| 開発者 | グーグル |
| 公開日 | 2010年10月 |
| サイズ | 144KB |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Angularはこの記事で最初に紹介するフレームワーク(またはMVCアプリケーションフレームワーク)です。よく使われるのはバージョン1.xで、HTMLを双方向データバインディングによって拡張し、DOM操作をアプリケーションロジックから分離しています。
バージョン2がリリースされたにもかかわらず(現在はバージョン4)、Angular 1.xはまだ開発が続いています。以下で説明します。
長所:
短所:
| Angular | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | angular.io |
| リポジトリ | github.com/angular/angular.js |
| 現在のバージョン | 4.1 |
| 開発者 | グーグル |
| 公開日 | 2016年9月 |
| サイズ | 450KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Angular 2.0は2016年9月にリリースされました。完全に書き直し、コンポーネントをベースにしたモジュール方式のモデルを導入しています。TypeScript(JavaScriptにコンパイルされる)で作られています。さらに、バージョン4.0が2017年3月にリリースされました(バージョン3はセマンティックバージョニングの問題を避けるためにスキップされました)。
Angular 2+はバージョン1と根本的に違います。互換性もありません。グーグルは別のプロジェクト名を付けるべきだったかもしれません。
長所:
短所:
| Vue.js | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | vuejs.org |
| リポジトリ | github.com/vuejs/vue |
| 現在のバージョン | 2.0 |
| 開発者 | Evan You |
| 公開日 | 2014年2月 |
| サイズ | 19KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Vue.jsはユーザーインターフェイスを作るための軽量で先進的なフレームワークです。Reactのような仮想DOMを使ったビュー層がフレームワークの核で、ほかのライブラリーとの統合が可能です。シングルページアプリケーションを作ることもできます。フレームワークの作者Evan You氏はAngularJSの開発に携わっていましたが、AngularJSから好きな部分を抽出したVue.jsを作成しました。
Vue.jsはHTMLベースのテンプレート構文でDOMとインスタンスデータをバインドします。モデル層は純粋なJavaScriptのオブジェクトで、データが変更されたときにビューを更新します。追加ツールを使えばスキャフォールディング(Scaffolding)、ルーティング、状態管理、アニメーションを実装できます。
長所:
短所:
| Backbone.js | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | backbonejs.org |
| リポジトリ | github.com/jashkenas/backbone/ |
| 現在のバージョン | 1.3.3 |
| 開発者 | Jeremy Ashkenas |
| 公開日 | 2010年10月 |
| サイズ | 8KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Backbone.jsは、サーバーサイドのフレームワークのMVC構造を、クライアントサイドで利用できるようにした初期のフレームワークです。同じ開発者によって作られたUnderscore.jsが唯一の依存オブジェクトです。
Backbone.jsはほかのプロジェクトと統合できるため、ライブラリーだと位置付けています。個人的には、Backbone.jsをフレームワークと考えている開発者が大半なのではないかと疑っています。もっとも、一部の人たちほどこの点に固執していませんが。
長所:
短所:
| Ember.js | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | emberjs.com |
| リポジトリ | github.com/emberjs/ember.js |
| 現在のバージョン | 2.15.0 |
| 開発者 | Emberチーム |
| 公開日 | 2011年12月 |
| サイズ | 96KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Ember.jsはMVVM(Model-View-ViewModel)パターンに基づいて作られた独自性の強いフレームワークです。単一のパッケージにテンプレート、データバインディング、ライブラリーを実装しています。設定より規約(convention-over-configuration)の考え方を採用しているのでRuby on Railsの経験がある人はすぐに習得できます。
長所:
短所:
| Knockout.js | |
|---|---|
| 種別 | フレームワーク |
| Webサイト | knockoutjs.com |
| リポジトリ | github.com/knockout/knockout |
| 現在のバージョン | 3.4.2 |
| 開発者 | Steve Sanderson |
| 公開日 | 2010年7月 |
| サイズ | 59KB(圧縮版) |
| 主な用途 | シングルページアプリケーション |
| 使用率 | 低 |
Knockout.jsは比較的古いMVVMフレームワークで、Observableを使ってユーザーインターフェイスとデータを同期します。特徴はテンプレートや依存関係トラッキングです。
長所:
短所:
人気は劣るものの検討の価値があるプロジェクトです。
ビルドツールはプリプロセッシング、コンパイル、画像最適化、コード圧縮、Lintの実行、テストといったさまざまなWeb開発タスクを自動化します。ビルドツールで複数のタスクを1つの実行可能なパッケージにまとめて管理できます。人気のビルドツールを紹介します。
| Gulp.js | |
|---|---|
| Webサイト | gulpjs.com |
| リポジトリ | github.com/gulpjs/gulp |
| 現在のバージョン | 3.9.1 |
| 月間ダウンロード数 | 300万 |
Gulpは後発のタスクランナーですが、あっという間に一番人気になりました。個人的にも気に入っています。GulpはJavaScriptのコードなので読みやすいです。ソースファイルをストリームに読み込み、pipeを用いてデータをさまざまなプラグインで処理してからビルドフォルダーに出力します。シンプルで高速なので楽しく使えます。ほかの選択肢を試す前に、まずGulp.jsを試してください。
| npm | |
|---|---|
| Webサイト | npmjs.com |
| リポジトリ | github.com/npm/npm |
| 現在のバージョン | 4.5.0 |
| 月間ダウンロード数 | 300万 |
npmはNode.jsのパッケージマネージャーですが、npmの機能「scripts」は汎用タスクランナーとしても使えます。依存オブジェクトの少ないシンプルなプロジェクトにとって魅力的な選択肢です。ただし、タスクが複雑になると一気に非実用的になる恐れがあります。
| Grunt | |
|---|---|
| Webサイト | gruntjs.com |
| リポジトリ | github.com/gruntjs/grunt |
| 現在のバージョン | 1.0.1 |
| 月間ダウンロード数 | 200万 |
Gruntは最初に普及したJavaScriptタスクランナーの1つでしたが、速度が遅く、JSONの設定が複雑だったために、Gulpに人気を奪われました。現在は致命的な問題は解決され、多くの開発者に支持されています。
複数のJavaScriptファイルを管理するのは面倒な作業です。ブラウザーで使うファイルはコンパイルされないので、依存オブジェクトを適切な順序で読み込み、連結します。ES6 ModulesやCommonJSなどの選択肢がありますが、ブラウザーのサポートが限定的なのでモジュールバンドラーが必要不可欠です。
| Webpack | |
|---|---|
| Webサイト | webpack.js.org |
| リポジトリ | github.com/webpack/webpack |
| 現在のバージョン | 2.5.1 |
| 月間ダウンロード数 | 600万 |
Webpackは人気のあるモジュールオプションをすべてサポートしており、React開発に欠かせない存在です。Webpackはモジュールバンドラーですが、汎用タスクランナーとしても使えます。
| Browserify | |
|---|---|
| Webサイト | browserify.org |
| リポジトリ | github.com/substack/node-browserify |
| 現在のバージョン | 14.3.0 |
| 月間ダウンロード数 | 260万 |
BrowserifyはNode.jsで使われているCommonJSモジュールをサポートしています。すべてのモジュールをコンパイルしてブラウザーが理解できる1つのファイルにまとめます。
| RequireJS | |
|---|---|
| Webサイト | requirejs.org |
| リポジトリ | github.com/jrburke/r.js |
| 現在のバージョン | 2.3.3 |
| 月間ダウンロード数 | 100万 |
RequireJSはブラウザー側で動作するモジュールローダーですが、Node.jsでも利用できます。
「Lint」とは、コードを解析し、潜在的なエラーや模範的な構文からの逸脱を検出することです。Lintを使えば、括弧の閉じ忘れや変数の宣言漏れを防止できます。
| ESLint | |
|---|---|
| Webサイト | eslint.org |
| リポジトリ | github.com/eslint/eslint |
| 現在のバージョン | 3.19.0 |
| 月間ダウンロード数 | 600万 |
ESLintは着脱可能なLintツールです。すべてのルールがプラグインで決められるので、好みに応じて設定できます。
| JSHint | |
|---|---|
| Webサイト | jshint.com |
| リポジトリ | github.com/jshint/jshint |
| 現在のバージョン | 2.9.4 |
| 月間ダウンロード数 | 200万 |
JSHintは柔軟性の高いJavaScript用Lintツールです。エラーの報告と構文の指摘のバランスが絶妙です。個人的にお気に入りです。
| JSLint | |
|---|---|
| Webサイト | jslint.com |
| リポジトリ | github.com/reid/node-jslint |
| 現在のバージョン | 0.10.3 |
| 月間ダウンロード数 | 50,000 |
もっとも古いLintツールの1つで、デフォルトのルールセットが厳格です。頑固すぎるかなと思います。
テスト駆動開発では、コードを書き始める前に「コードをテストするためのコード」を書く必要があります。
Ava、Tape、Jestなど数多くの選択肢がありますが、人気がある3つのツールです。
| Mocha | |
|---|---|
| Webサイト | mochajs.org |
| リポジトリ | github.com/mochajs/mocha |
| 現在のバージョン | 3.3.0 |
| 月間ダウンロード数 | 500万 |
MochaはJavaScriptテストフレームワークで、Node.jsやブラウザーでテストを実行できます。非同期テストをサポートしているほか、テストコードの可読性を上げるためにChaiと組み合わせて使えます。
| Jasmine | |
|---|---|
| Webサイト | jasmine.github.io |
| リポジトリ | github.com/jasmine/jasmine-npm |
| 現在のバージョン | 2.6.0 |
| 月間ダウンロード数 | 200万 |
Jasmineはビヘイビア駆動テストスイートです。ブラウザーでのユーザーインターフェイスとインタラクションのテストを自動化できます。
| QUnit | |
|---|---|
| Webサイト | https://qunitjs.com/ |
| リポジトリ | github.com/kof/node-qunit |
| 現在のバージョン | 1.0.0 |
| 月間ダウンロード数 | 25,000 |
QUnitは単体(Unit)テストフレームワークです。所定の引数を渡すと関数の実行結果を検証します。また、テストカバレッジを報告するので、特定のコードブランチのテスト漏れを確実に防止します。
JavaScritpが好きじゃない人でもTypeScript、LiveScript、CoffeeScriptなどのコンパイラーを使えば、開発の満足度が向上するかもしれません。または、Babelを使ってモダンで簡潔なES2015のソースコードをクロスブラウザー対応のES5のコードに変換する方法もあります。
Mustache、Handlebars、Pug (Jade)、EJSといったJavaScriptで作られたHTMLテンプレートエンジンがあります。個人的にはEJSやdoTのように、軽量でJavaScriptの構文を維持しているツールが好きです。
最後に、ドキュメントの自動生成を利用して、自分のドキュメントを書いてみませんか?ESDoc、JSDoc、YUIdoc、documentation.js、Transcriptionなど、ES2015互換のドキュメント生成ツールがおすすめです。
集団の知恵に従うなら、勢いがあるのはReactです。ほかのライブラリーも同様の技術的方針に舵を切っています。Webアプリケーションにとって安全で汎用的な選択肢だと言えますが、Vue.jsも注視しておくことをおすすめします。
モノリシックフレームワークは人気を失っていますが、堅固な構造が必要な大規模プロジェクトではAngularJSが人気です。大半がバージョン1.0を使い続けていますが、好きで選んでいるというよりは必要に迫られてのことだと思います。TypeScriptを学ぶ意思があるなら、長期的にはバージョン4+が無難です。
jQueryを軽視しないでください。技術関係のニュースでもめったに言及されませんが、jQueryのトレンドは続いており、開発が盛んで、Webサイトやアプリケーションの作成に役立ちます。jQueryは学習コストが低く、世界中の多くの開発者が理解しているのです。
冒険好きな人にはSvelteが興味深いでしょう。クライアント、サーバーの両方で使用可能で、ビルド時にJavaScriptをプリレンダリングします。Svelteは開発手法を変える可能性を持っています。
ツールの選択は比較的重要度が低く、またプロジェクトによってどれを使うべきか変わります。大半はGulpですが、WebPackの人気も拡大しています。テストにはESLintやMochaを選んでおけば間違いありません。しかし、選択肢はたくさんあります。
プロジェクト、チーム、スキルセットは1つとして同じではありません。評価に使える時間は限られているので、すでに知っている道具は魅力的に映ります。もっとおすすめのフレームワークがあると思う人もいるかもしれませんが、ハンマーを持つ人にはすべてが釘に見えるものです。
最後に、ライブラリー、フレームワーク、ツールはオプションだと決して忘れないでください。JavaScriptによる開発は過去10年の間に革新を遂げました。かつては初歩的なヘルパーライブラリーがいくつかあるだけでしたが、いまでは圧倒的な数の選択肢があります。止まらない複雑化に疲弊してしまうことや、話題のフレームワークを数カ月ごとに切り替えてばかりになることもあります。小さなタスクや個人的なタスクでは素のJavaScriptを検討してください。身に着けた知識は時代遅れにならず、プロジェクトでフレームワークを選ぶときに価値を発揮します。
本記事はJavaScriptエコシステムの現状を反映し、2017年5月29日に更新しました。また、Panayiotis Velisarakos、Sebastian Seitzが査読を担当しています。最高のコンテンツに仕上げるために尽力してくれたSitePointの査読担当者のみなさんに感謝します。
(原文:Best JavaScript Frameworks, Libraries and Tools to use in 2017)
[翻訳:薮田佳佑/編集:Livit]
