何故Vue.js/Nuxt.jsなのか、SSRや仮想DOMなどのメリットについてもまとめる

Published: 2018年9月1日 by tomsato

概要

Vue.jsやNuxt.jsで開発をすることが多くなってきたが

改めて「なんでVue.jsにしたの?」「仮想DOMって?」「SSRって何がいいの?」

などメリットを聞かれた時にサラサラと答えられなかったり用語についての説明が言えなかったりしたので自分なりにまとめる

フロントエンドの歴史について

何故フロントエンドエンジニアが必要になってきたのか

昨今フロントエンドエンジニアの需要が高まってきた、何故高まってきたのかはWebの歴史を見ていく必要がある

1990年代にWebが誕生しCSSやJavaScriptがWebブラウザに搭載されるようになったが
当初はJavaScriptは貧弱でCSSと共にページの装飾に用いられることが主だった

2000年代にはAjaxが登場し、GoogleMapsを始めとしてページ遷移をすることなくページの装飾を変更する技術が生まれたことによってWebブラウザでもデスクトップアプリケーションのようなインタラクティブなアプリケーションが作れるということを証明して衝撃を与えた
Ajaxができた後には、効率的にDOMが操作できるjQueryなどのライブラリが人気となってきてよりリッチなページが表現できるようになってきた
この頃からサーバーサイドの人はWebAPIの実装を担当、クライアントサイドの人はAjax周りの実装を担当、などの分業化が見られることとなった

Node.jsの登場やHTML5,ES2015などの登場によってフロントエンドの技術は年々進化をしてきているが、同時に複雑化することになっていった
フロントエンド周りで覚える技術が多くなって、またフロントエンド側の責務が大きくなり、本来バックエンドの責務であったデータフローの設計やルーティング、バリデーションなどの領域をフロントエンドが担うこととなったことからフロントエンド工数が高くなってフロントエンドエンジニアの需要が年々高くなってきている

また実際の仕事の中でバックエンドメンバーが急遽フロントエンドを任されることは少なくない、そうなった際は↓これらの課題が発生することになる

  • フロントエンドの技術について、トレンドを調ベなければならない
  • 実際にプロジェクトに導入する技術を選定しなければならない(フレームワークはVue.js?,AngularJS?選定した根拠は?など)
  • その技術を勉強しなければならない(自身、プロジェクトメンバー、今後新メンバーが入ってきた時や、プロジェクトを引き継ぐ時の引き継ぎ先の人にも)

これらをゼロから始めるだけでも身構えてしまうためフロントエンドエンジニアがプロジェクトに一人いるだけでも全然違ってくるのがわかる

何故フレームワークが必要になってきたのか

上記で記述したように、年々フロントエンド側で受け持つ責務が大きくなったことから、アプリケーションの構造化を持たないjQueryなどのライブラリでは力不足となってきた

プロフィールサイトなど簡単なページを作成するだけならjQueryでことが足りるが、多数の機能を有するECサイトなど複雑なページを実装する際は、MVCのようなアプリケーションの構造を持ったフレームワークが必要とされるようになってAngularJSなどのフレークワークやライブラリが続々と出現されるようになってきた

こうなってくると次に発生する問題はフレームワークまたはライブラリの「学習コスト」だが、Vue.jsはフレームワークの中でも特に学習コストが低くなるように考慮されている(詳しくは後述する)

Vue.jsのトレンドを比較する

Vue.jsは後発が故にnpm数やフォロー数などは低いが最近の増加率は高そう

JavaScript ベスト・オブ・ザイヤー2017

2017年の12ヶ月間に獲得したGithubのスター数からプロジェクトを定量的に評価し、JavaScript ベスト・オブ・ザ・イヤー 2017が決定されている

JavaScript ベスト・オブ・ザ・イヤー 2017

フロントエンドフレームワークとしてVue.jsはReact、Angularを抑えて見事に一位に輝いている
またそれ以上に、カテゴリを超えてもっとも人気のあったプロジェクトを見ているベストプロジェクト部門では2年連続でVue.jsが一位となっている

Googleトレンド

Vueが伸びているのがわかる

npmトレンド

GitHubのスター数

2018年8月下旬現在

twitterトレンド

2018年8月下旬現在
@angular フォロワー:289517
@vuejs フォロワー:87961
@reactjs フォロワー:250951

Vue.jsのメリット

敷居が低い

vue-cliと言う開発ツールを利用すると簡単にVueプロジェクトを作成できる

// vue-cliをインストールする
$ yarn global add vue-cli

// vue-cliを使ってvueのプロジェクトを作成する
$ vue init webpack my-project
? Project name my-project
? Project description A Vue.js project
? Author
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests Yes
? Pick a test runner jest
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recommended) yarn

...中略...

# Project initialization finished!
# ========================

To get started:

  cd my-project
  npm run dev

Documentation can be found at https://vuejs-templates.github.io/webpack

// プロジェクトの準備
$ cd my-project
$ yarn dev

testは何を使うか?など対話式で聞かれるのでよしなに答えるだけでプロジェクトを用意できる、よくわからなければ一旦全部Enterで大丈夫

yarn devを実行した状態で「http://localhost:8080/」にアクセスするとサンプルの画面を見ることができる

このようにvue-cliを使うと簡単にvueのソースコードが用意できて、testやwebpackの設定もよしなに入っているので超便利

ちなみにNuxt.jsプロジェクトを用意する方法はこちら

$ vue init nuxt-community/starter-template my-nuxt-project

開発の自由度が高い

Vue.js最大の特徴として選択肢の広さがある
これはVue.jsを作ったEvan You氏が提唱する「プログレッシブフレームワーク」と言う概念が元になっているから

プログレッシブフレームワークについての図↓

引用元Vue.js @ LaraconEU

簡単に言うと作りたいサイトの規模に応じてVue.jsを拡張できると言うこと

  • ただJavaScriptの変数とHTMLを紐付けるだけの機能を使ってサイトを作ることができる
  • コンポーネントの機能を使ってモジュール単位でソースを分割するようにできる
  • Webサイトから、SPAなどの小規模な「Webアプリ」と呼ぶべき領域に入った時にルーティングやバリデーションを導入することができる
  • Vuexを使ってストア管理を行う

など必要に応じて機能を段階的に拡張することができる

シンプルな実装

1ソースの中でHTML,CSS,JavaScriptをそれぞれ書くことができる(単一ファイルコンポーネント)
HTML,CSS,JavaScriptをそれぞれ書くことができるのでデザイナーとフロントエンドエンジニアで分業がしやすくなっている

ソースコードのイメージ↓

templateタグ: HTMLを記述する
scriptタグ: JSを記述する
styleタグ: CSSを記述する

メモ:この画像の中で「style scoped」としているがscopedと記述するとコンポーネントやページ単位でCSSを記述することができて他のコンポーネントに影響を与えずに実装をすることができる(デメリットとしてScoped CSSのスタイルが子コンポーネントのルート要素に効いてしまうと言うのがあるっぽいけど)

ReactのようなJSX記法ではなく、限りなくHTMLに近いDSLを持っているのでわかりやすいものとなっている

ドキュメンが豊富

Vue.jsやNuxt.jsは公式のドキュメントも日本語訳のものがあったり、最近のトレンドとなっていることからVue.js関連の記事が多いのでわからないことがあった時にはすぐに調べることができる

ちなみに他のフレームワークと比較している公式ドキュメントがあるのでReactやAngularなどと比較したい場合には参考になりそう

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

学習コストが低い

ここまでで話が出てきているが

  • プログレッシブフレームワークであることから小規模サイトならば最低限の機能で実装することができる
  • 敷居が低く簡単に利用できる
  • コンポーネント単位でHTML/CSS/JavaScriptを書くことができる
  • 日本語ドキュメントが多く、利用者も多いことからわからないことがあった時に簡単に調べられる

などから学習コストも低いと思っている

仮想DOMについて

仮想DOMとは

JSでDOMの変更をすると処理が重く、そうした課題を解決するための概念・実装手法

実際のDOMツリーとは別で仮想のDOMツリーを作って、状態変更によって差分を抽出して実際のDOMに反映させる(差分レンダリング)
仮想DOMの実態は、仮想DOMの構造体表現とそれを用いて実DOMに反映するためのdiff/patchアルゴリズムのこと

Vue.jsやReactは仮想DOMを利用している

仮想DOMのメリット

差分のみDOMに反映させることから早い

もう少し深堀ると今まではページ移動やボタンクリックなどで状態が変化した際に、毎回実DOMを一から作成してブラウザに描画を行なっていたが、仮想DOMがあることで差分を実DOMに反映するだけで良いことが早い要因となっている

実DOMを新しく作り直す > (新しい仮想DOMを作って古い仮想DOMと比べて差分を抽出 + 差分を実DOMに反映)

Nuxt.jsについて

Nuxt.jsとは

Vue.jsのフレームワーク

詳しくははじめに – Nuxt.jsを見た方が早い

Nuxt.jsのメリット

  • SSRをデフォルトでサポートしている(SSRについては後述)
  • Webpackの設定を隠蔽してくれるので開発に集中できる
  • Nuxt.jsのソースコードをnuxt generateコマンドにかけると静的ファイルを出力するので、それをホスティングサービスにおくだけで静的サイトが簡単に作れてしまう
  • Vue.jsのフレームワークではある故にディレクトリ構成が決まっているが、初学者としてはディレクトリ構成に迷わなくて済むので嬉しい(ちょっとした制約が初学者には嬉しい、しかもガチガチに制約が厳しいわけではない)
  • 自動ルーティングがデフォルトである(pages/sample.vueを作成すると/sampleにアクセスした時に設定もなしにpages/sample.vueが読み込まれることになる)

Nuxt.jsのディレクトリ構成についてはこちらを参考

SSR(サーバーサイドレンダリング)について

SSRとは

SPAなどで本来クライアントで生成するHTMLをサーバで生成する

SSR化によるメリット

  • サイトが高速化する、サイトの表示が遅いと継続率や離脱率など重要指標に悪影響を及ぼすリスクがある
  • 検索エンジンのクローラが完全に描画されたページを解析するため、SEOが向上する(例えばページを表示する際に、非同期にAPIを叩いてその結果を表示する場合、クローラーはそれを待たない)

SSR化によるデメリット

Node.jsを入れたサーバの用意が必要、トラフィックが多い場合はサーバの負荷についても考えなければならない

SSRをするべきかどうか

ただSEOを向上させたいだけでNuxt.jsを使うとする前にプリレンダリング(事前描画)についても考えて欲しい
プリレンダリングはNuxt.jsのnuxt generateのようにビルド時に静的なHTMLファイルを生成するので静的サイトを作ることができる
詳しくはこちら

SSRにするべきかどうかは主にアプリケーションのコンテンツに対する時間の重要性になる
最初に数百ミリ秒かかってしまうことがそれほど重要ではないサイトであればSSRはやりすぎで、最初に表示するまでの時間が非常に重要である場合はSSRにしてできるだけ早く初期ロードパフォーマンスを保つことができる

Vue

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧