振り返り
この本では,ペライチのHTMLファイルから出発しました.
| 章 | やったこと | ファイル構成 |
|---|---|---|
| 1 | 静的なHTMLを書いた | index.html |
| 2 | CDN + ESMでVueを読み込んだ | index.html + CDN |
| 3 | テンプレート構文でデータを表示した | index.html + CDN |
| 4 | リアクティビティで動的にした | index.html + CDN |
| 5 | コンポーネントで分割した | index.html + CDN |
5章を経て,検索・フィルタ機能を持つ動的なアプリケーションが完成しました.
そして,ファイルは最初から最後までindex.html一枚だけ です.
Node.jsは使っていません.
ビルドツールは使っていません.
ターミナルは開いていません.
これが"Progressive Framework"
Vue.jsが"Progressive Framework"と呼ばれる理由がここにあります.
必要な分だけ,段階的に導入できる.
1.まずHTMLがある2. Import Map + <script type="module"> でVueを追加する3.テンプレートにディレクティブを足す(HTMLのまま)4. ref() とcomputed() で動的にする5.コンポーネントで構造化する
各ステップは前のステップの上に積み重ねるだけです.
何かを捨てる必要はありません.
HTMLはHTMLのまま.テンプレートはHTMLのまま.
ここから先の道
ここまでの知識で,十分に実用的なアプリケーションが作れます.
しかし,アプリが大きくなると次の課題が見えてきます.
Single File Component (SFC)
コンポーネントのtemplateをJavaScriptの文字列で書くのは,規模が大きくなると辛くなります.
VueはSingle File Component (.vueファイル) という形式を提供しています.
<!-- BookCard.vue -->
<template>
<div class="card">
<h2>{{ book.title }}</h2>
<p>{{ book.description }}</p>
<span class="tag" v-for="tag in book.tags">
{{ tag }}
</span>
</div>
</template>
<script setup>
defineProps(["book"]);
</script>
<style scoped>
.card {
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 20px;
margin-bottom: 16px;
}
</style>
<template>, <script setup>, <style> — HTML, JavaScript, CSSがそれぞれのセクションに収まっています.
テンプレートは変わらずHTMLです.JavaScriptの文字列に押し込められることなく,シンタックスハイライトもエディタの補完も効きます.
<script setup> は,この本で使ってきたsetup() 関数をさらに簡潔にした構文です.
returnが不要になり,トップレベルで宣言した変数や関数がそのままテンプレートから使えます.
SFCを使うためにはビルドツール(Vite)が必要になりますが,この段階で初めてNode.jsが登場します.
Vue Router / Pinia
Vue Router: ページ遷移を管理する(SPAのルーティング)
Pinia: アプリケーション全体の状態管理
これらもすべて段階的に導入できます.
必要になったときに,必要な分だけ足す.
Nuxt
さらに大きなアプリケーションでは,Nuxtというメタフレームワークが選択肢に入ります.
サーバーサイドレンダリング,ファイルベースルーティング,自動インポートなど,フルスタックの機能を提供します.
Progressiveの階段
ペライチの HTML
↓ Import Map + ESM
CDN で Vue を導入
↓ ディレクティブを足すだけ
テンプレート構文
↓ ref() / computed() を定義するだけ
リアクティビティ
↓ template を切り出すだけ
コンポーネント
↓ ここで初めてビルドツール
SFC (.vue ファイル) + <script setup>
↓ 必要に応じて
Vue Router / Pinia
↓ さらに必要に応じて
Nuxt
各段階で「捨てるもの」はありません.
HTMLはHTMLのまま.テンプレートはHTMLのまま.
ただ「足していく」だけです.
これがProgressiveの意味です.
テンプレートはHTMLであるということ
この本を通して繰り返してきた最も重要なメッセージです.
VueのテンプレートはHTMLです.
v-for, v-if, v-bind, v-on, v-model — これらはすべてHTMLの属性 として書きます.
{{ }} — これはHTMLのテキストコンテンツの位置に書きます.
テンプレートを読むのに,JavaScriptの深い知識は要りません.
HTMLを書ける人なら,Vueのテンプレートを読めます.
これは意図的な設計です.
Vueは,Webの基盤であるHTMLを尊重し,その上に構築されたフレームワークです.
まとめ
Vueは ペライチのHTMLから フルスタックのアプリケーション まで段階的にスケールする
各段階で何かを捨てる必要はない — 常に足していくだけ
テンプレートは最初から最後までHTMLのまま
setup()とComposition API (ref,computed)でthisのないシンプルなコードが書けるビルドツールはSFCを使う段階で初めて必要になる
Vue Router, Pinia, Nuxt — 必要になったら足すだけ
Progressiveとは「段階的に導入できる」こと,そして「HTMLを壊さないこと」