なぜReact.jsを使うのか、jQueryやVue.jsとの違いをいまさら調べてみた
巷の人はなぜReact.jsを使っているのか理解するため、他のJavaScript(js)ライブラリ・フレームワークとの違いなどを調べてみました。
最初にまとめ
- SPAというページの一部を更新するタイプの構成が流行りだよ
- Reactは仮想DOMを使うからページの一部を更新するのが速い
- Reactは宣言的記述ができるから複雑なコードでも読みやすい。間違いにくい
- jQueryは複雑になると読みにくい
- 個人開発ではVue.jsとReact.js好きな方を使えば良い
- Vue.jsも上の同じ特性を持ってるよ
なぜjsが必要なのか?
そもそもjsはなぜ必要なのでしょうか?答えは単純です。ユーザのアクション(入力・クリックなど)やDBのデータ更新などに応じて動的にページを書きかえたいからです。
SPAを作りたい
SPA(シングルページアプリケーション)ではページ遷移を行わず、ページの遷移・更新はjsによるdom(jsで操作できる、HTMLを表現するオブジェクト)操作による差分更新により擬似的に行うという特徴があります。これによりサーバーからのリクエストを最初の一回だけで全てやってしまうのでその後の動作が軽量になるというメリットがあります。
近年はこのSPAの導入によるwebページのパフォーマンスアップが常識になってきているということがReact.js導入の動機となっています。
ここで、なぜSPAならReact.jsが使われるのか、という話になると思います。先ほど述べたようにSPAはページの遷移・更新はjsによるdom操作による差分更新により擬似的に行います。
Reactは、この差分更新を適切にやってくれる+更新処理をわかりやすく書けるため、SPAのweb開発で用いられているのです。以下では、その仕組みについてお話しして行きたいと思います。
参考
仮想DOMという概念
Reactでは、仮想DOMという方法を使い、今までのDOM操作をより効率よく行うことで高速化を実現しています。
ともかく、仮想DOMというものを使ってそこを経由してDOM操作を行うことで、高速になるらしいです。詳しいことはわかりませんが、そういうことです。
ページの一部だけを更新するのがJavaScriptの基本の処理なので、そこが早くなるのは当然嬉しいというわけですね。要は高速な処理ができるからReactはいいぞということ。
参考: VirtualDOMの仕事ってなに?(Reactの表示速度がはやい理由) - Qiita
従来:jQueryなどの手続き型のDOM操作
React.jsでは「宣言的記述」がキーワードとしてあります。jQueryなどの手続き型の記述と違っています。
「宣言的記述」では、テンプレートに変数を書いておき、その変数の値の変更に応じて自動的にレンダリングされます。
「手続き型の記述」では、DOMを直接操作し、例えばリストの値を一つ追加する際には以下の様な手続き型のプログラムを書きます。
「宣言的記述」の例
引用:Reactを使うとなぜjQueryが要らなくなるのか - Qiita
// ItemListのコンポーネント定義(実体は関数) const ItemList = props => { return <ul className="item-list"> {props.items.map(item => <ItemDetail item={item} />)} </ul>; }; // ItemDetailのコンポーネント定義 const ItemDetail = props => { const item = props.item; return <li className={'item' + item.stock === 0 ? ' soldout' : ''}> <div className="item-name">{item.name}</div> <div className="item-price">{item.price}</div> </li>; }; fetch('/api/items').then(res => res.json()).then(data => { ReactDOM.render( <ItemList items={data.items} />, // これを document.getElementById('container') // ここにレンダリングしろ ); });
「手続き型の記述」の例
引用:Reactを使うとなぜjQueryが要らなくなるのか - Qiita
$.getJSON('/api/items').then(data => { const ul = $('ul.item-list').empty(); data.items.forEach(item => { const li = $('<li>').addClass('item').appendTo(ul); if (item.stock === 0) li.addClass('soldout'); $('<div>').addClass('item-name').text(item.name).appendTo(li); $('<div>').addClass('item-price').text(item.price).appendTo(li); }); });
一見、宣言的記述の方が記述量が多いだけのようにも思えるかもしれませんが、宣言的記述では見た目がほぼHTMLで、正しい構造であることを確認しやすいのです。
手続き型の記述の場合、とてもじゃないですがHTMLには見えません。複雑なコードになった際、正しい構造であることを確認しづらくなり、間違ったHTMLタグを混入させてしまう可能性などがあり、バグを生みやすくなります。
こういった点で宣言的記述が有利であり、複雑化しやすいフロントエンドのコードを管理しやすくしています。
類似フレームワークVue.jsとの違い
他のフレームワークとの比較 — Vue.js によると、Vue.jsとReact.jsとの違いはそれほど大きくなさそうです。
大きな違いとしては、htmlの書き方にあります。ReactはJSX、VueはTemplatesという書き方を利用することになります。
我らがReact様のJSXのメリットとしては、JSXはhtmlのように見えるjsであり、jsとしてhtmlを書くことができることです。ただし、見た目はHTMLとは少し違いますし、CSSもJSXに組み込むように書くことが多いので、慣れていない人にとっては慣れるまで時間がかかります。
VueのTemplatesのメリットとしては、HTML・CSSはほぼ普通のそれと同じように書くことができる点です。とにかく、とっつきやすい。
[React] JSXの例
引用:ReactとVueってどう違う?全く同じアプリをReactとVueで作成してみて分かった相違点 | コリス
createNewToDoItem = () => { this.setState( ({ list, todo }) => ({ list: [ ...list, { todo } ], todo: '' }) ); }; handleInput = e => { this.setState({ todo: e.target.value }); }; <input type="text" value={this.state.todo} onChange={this.handleInput}/>
[Vue] Templatesの例
引用:ReactとVueってどう違う?全く同じアプリをReactとVueで作成してみて分かった相違点 | コリス
<script> createNewToDoItem() { this.list.push( { 'todo': this.todo } ); this.todo = ''; } </script> <template> <input type="text" v-model="todo"/> </template>
個人開発においてはどちらを使っても大差はないでしょう。