他のフレームワークとの比較

Angular

何にでも当てはまるわけではないと思いますが、Angular の代わりに Vue を使用する理由がいくつかあります:

興味深いことに、 Angular 1 が抱えるこれらの問題に対する Angular 2 と Vue の取り組み方には、類似点がとても多いです。

React

React.js と Vue.js は、どちらもリアクティブ&コンポーザブルな View のコンポーネントを提供し、いくつかの類似性があります。もちろん、多くの違いも同様にあります。

まず、内部実装は根本的に違います。React のレンダリングは実際の DOM がどのような状態にするためにメモリ内の表現で仮想 DOM を活用します。状態を変更するとき、React は仮想 DOM の完全な再レンダリングを行い、その差分を求めて、そして実際の DOM にパッチをします。

仮想 DOM のアプローチは、任意のタイミングで View を描画する関数型の方法を提供します。オブザーバーを利用せず、更新ごとにアプリケーション全体を再描画しているため、View はデータと常に同期がされていることが保証されます。これは、他の isomorphic JavaScript アプリケーションでも同様の可能性を与えることができます。

仮想 DOM の代わりに、Vue.js はテンプレートとして実在する DOM を使用し、データバインディングに対して実在するノードに参照を保ちます。これは DOM が存在する環境に Vue.js に制限しますが、よくある誤解に反して、React は他の何よりも速いという仮想 DOM によく誤解しますが、ホットな更新が来るとき Vue.js は実際には React より優れており、そしてほとんど手によってチューニングされた最適化を必要としません。React では、どこでも shouldComponentUpdate の実装が必要で、完全に最適化を達成するために、イミュータブル(不変)なデータ構造が必要です。

API は賢いですが、React (または JSX) における1つの問題は、描画関数は多くの場合に多数のロジックを伴い、むしろインターフェイスの視覚的な表現というよりもプログラムの一部のように見えることです。一部の開発者にとっては恩恵になると思いますが、私のようなデザイナーと開発者のハイブリッドにとっては、テンプレートを持つことでデザインと CSS をはるかに簡単に視覚的に捉えられるようにしてくれます。JSX に JavaScript のロジックを組み合わせるのは、私がコードをデザインに変換していくために必要としている視覚モデルの邪魔になります。対照的に、Vue.js は、軽量なデータバインディング DSL によりコストをかけており、そのために視覚的に構築可能なテンプレートと、ディレクティブとフィルタにカプセル化されたロジックを持っています。

React について別の問題を挙げるなら、DOM の更新が完全に仮想 DOM に委任されていることです。実際に、DOM を自分でコントロールしたいとき、少しトリッキーです(理論的には出来ますが、React の思想に反する結果になります)。アドホックな DOM 操作を必要とするアプリケーションの場合、これがかなり厄介な制限になることになります。この面では、Vue.js はより柔軟性があり、例として multiple FWA/Awwwards winning sites には Vue.js が組み込まれています。

いくつかの追加注意事項です:

Ember

Ember は非常に独断的に設計されたフル機能フレームワークです。たくさんの確立された規約を提供し、一度それらに十分精通していると、非常に生産的に作ることができます。しかしながら、それは学習曲線が高いことと柔軟性が悪くなることを意味します。独断的なフレームワークと一緒に動作するツールの疎結合セットなライブラリとの間で選択するのを試すのはトレードオフです。後者はよりあなたに自由を与えるだけではなく、あなたによりアーキテクチャの意思決定をする必要があります。

以下は、恐らく Vue.js コアと Ember のテンプレートとオブジェクトモデルレイヤとの間のよりよい比較になるでしょう:

Polymer

Polymer はさらにもう1つの Google によってスポンサーされたプロジェクトで、実際には Vue.js も同様、インスピレーションの源でした。Vue.js のコンポーネントは Polymer のカスタム要素と比較して緩く、そして両方ともとても似た開発スタイルを提供します。最大の違いは、Polymer は最新の Web Components の機能に基づいて構築されており、そしてネイティブにこれらの機能をサポートしていないブラウザでは動作せるために(パフォーマンス低下)、ささいでない polyfills を必要します。これとは対照的に、Vue.js は依存関係なしで IE9 においても動作します。

また、Polymer 1.0 はパフォーマンスを保証するために非常に限定的なデータバインディングのシステムしか持たされていませんでした。例えば、Polymer のテンプレートでサポートされる唯一の式は、ブール否定と単一メソッド呼び出しです。そこでの算出プロパティの実装もまた非常に柔軟とは言えません。

最後に、プロダクションにデプロイする場合、Polymer の要素は vulcanizer と呼ばれる Polymer 依存のツールによってバンドルされる必要があります。一方、単一ファイルの Vue のコンポーネントは Webpack のエコシステムを提供しているすべてのものを活用でき、したがって Vue コンポーネントで ES6 や希望するあらゆる CSS プリプロセッサを簡単に利用できます。

Riot

Riot 2.0 はコンポーネントベースの開発モデルに似たもの (Riot では “tag” と読んでいます) および、最小限の美しく設計された API を提供します。私は Riot と Vue は多くの設計哲学を共有していると考えます。しかし、Riot より若干重いにもかかわらず、Vue には Riot に対していくつかの重要な利点を提供します。