brand logo

ドキュメント

Vue.js 開発

Nuxt は Vue.js を使用し、コンポーネントの自動インポート、ファイルベースのルーティング、SSR に適した使用のためのコンポーザブルなどの機能を追加します。

Nuxt は Vue 3 を統合しており、これは Nuxt ユーザーに新しいパターンを可能にする Vue の新しいメジャーリリースです。

Nuxt を使用するために Vue の深い知識は必要ありませんが、vuejs.org のドキュメントを読み、いくつかの例を試すことをお勧めします。

Nuxt は常にフロントエンドフレームワークとして Vue を使用してきました。

私たちが Nuxt を Vue の上に構築することを選んだ理由は以下の通りです:

  • データの変更がインターフェースの変更を自動的に引き起こす Vue のリアクティビティモデル。
  • HTML をウェブの共通言語として保持しつつ、コンポーネントベースのテンプレートを使用することで、インターフェースを一貫性を保ちながらも強力に保つ直感的なパターンを可能にします。
  • 小規模なプロジェクトから大規模なウェブアプリケーションまで、Vue はスケールに応じてパフォーマンスを維持し、アプリケーションがユーザーに価値を提供し続けることを保証します。

Nuxt と Vue

シングルファイルコンポーネント

Vue のシングルファイルコンポーネント(SFC または *.vue ファイル)は、Vue コンポーネントのマークアップ (<template>)、ロジック (<script>)、スタイリング (<style>) をカプセル化します。Nuxt は Hot Module Replacement を使用して、SFC に対してゼロコンフィグの体験を提供し、シームレスな開発者体験を実現します。

自動インポート

Nuxt プロジェクトの components/ ディレクトリで作成されたすべての Vue コンポーネントは、インポートすることなくプロジェクト内で利用可能になります。コンポーネントがどこにも使用されていない場合、プロダクションコードには含まれません。

こちらも参照 guide > concepts > auto-imports

Vue Router

ほとんどのアプリケーションは複数のページとそれらをナビゲートする方法を必要とします。これを ルーティング と呼びます。Nuxt は pages/ ディレクトリと命名規則を使用して、公式の Vue Router ライブラリ を使用してファイルにマッピングされたルートを直接作成します。

こちらも参照 getting-started > routing
サンプルコードの編集とプレビューexamples > features > auto-imports

Nuxt 2 / Vue 2 との違い

Nuxt 3+ は Vue 3 に基づいています。新しいメジャーな Vue バージョンは、Nuxt が活用するいくつかの変更を導入しています:

  • より良いパフォーマンス
  • Composition API
  • TypeScript サポート

より速いレンダリング

Vue の仮想 DOM (VDOM) はゼロから書き直され、より良いレンダリングパフォーマンスを可能にします。さらに、コンパイルされたシングルファイルコンポーネントを使用する場合、Vue コンパイラはビルド時に静的および動的マークアップを分離することでさらに最適化できます。

これにより、初回レンダリング(コンポーネント作成)と更新がより速くなり、メモリ使用量が減少します。Nuxt 3 では、より速いサーバーサイドレンダリングも可能になります。

より小さなバンドル

Vue 3 と Nuxt 3 では、バンドルサイズの削減に重点が置かれています。バージョン 3 では、テンプレートディレクティブや組み込みコンポーネントを含む Vue の機能のほとんどがツリーシェイク可能です。使用しない場合、プロダクションバンドルには含まれません。

このようにして、最小限の Vue 3 アプリケーションは 12 kb gzipped に削減できます。

Composition API

Vue 2 では、コンポーネントにデータとロジックを提供する唯一の方法は Options API を通じてであり、datamethods のような事前定義されたプロパティを使用してテンプレートにデータとメソッドを返すことができます:

export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment(){
      this.count++
    }
  }
}

Vue 3 で導入された Composition API は Options API の代替ではありませんが、アプリケーション全体でのロジックの再利用をより良くし、複雑なコンポーネントで関心ごとにコードをグループ化するより自然な方法を提供します。

<script> 定義で setup キーワードを使用して、上記のコンポーネントを Composition API と Nuxt 3 の自動インポートされたリアクティビティ API を使用して書き直したものがこちらです:

const count = ref(0)
const increment = () => count.value++

Nuxt の目標は、Composition API を中心に優れた開発者体験を提供することです。

TypeScript サポート

Vue 3 と Nuxt 3+ はどちらも TypeScript で書かれています。完全に型付けされたコードベースはミスを防ぎ、API の使用を文書化します。これにより、アプリケーションを TypeScript で書く必要はありません。Nuxt 3 では、ファイル名を .js から .ts に変更するか、コンポーネントに <script lang="ts"> を追加することでオプトインできます。

こちらも参照 guide > concepts > typescript

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

Nuxt と Vue 3 の統合についての補足解説

Nuxt 3 は Vue 3 をコアに据えたフレームワークであり、Vue 3 の新しい機能やパフォーマンス向上を活かして、より快適で効率的な開発体験を提供します。本記事では、Nuxt 公式ドキュメントの Vue 3 に関する説明を補完し、実務での具体的な活用例や注意点を丁寧に解説します。


1. イントロダクション:Vue 3 を使うメリットと解決できる課題

Vue 3 は Vue 2 と比べて大幅に進化し、Nuxt 3 ではこれを最大限に活用しています。主なメリットは以下の通りです。

  • パフォーマンスの向上
    仮想 DOM の再設計やコンパイル時の最適化により、初回レンダリングや更新処理が高速化され、メモリ消費も削減されます。

  • Composition API の導入
    ロジックの再利用性が高まり、複雑なコンポーネントでも関心ごとごとにコードを整理しやすくなりました。

  • バンドルサイズの削減
    ツリーシェイク可能な設計により、不要なコードがビルドに含まれず、軽量なアプリケーションを実現します。

  • TypeScript サポートの強化
    型安全な開発が可能になり、開発効率とコード品質の向上に寄与します。

これらの特徴により、Nuxt 3 は小規模から大規模まで幅広いプロジェクトで高いパフォーマンスと保守性を両立できます。


2. まず結論:Vue 3 と Nuxt 3 のポイントまとめ

  • Vue 3 の仮想 DOM は高速化され、Nuxt 3 の SSR もより効率的に動作する。
  • Composition API によって、ロジックの再利用やコードの整理がしやすくなる。
  • 自動インポート機能と組み合わせることで、コードがシンプルかつ読みやすくなる。
  • TypeScript を自然に導入でき、型安全な開発が可能。
  • バンドルサイズが小さくなり、ユーザー体験が向上する。

3. いつ使うべきか・使わない方がよいケース

使うべきケース

  • 新規プロジェクトでの開発
    最新の Vue 3 と Nuxt 3 の恩恵を最大限に活かせます。

  • 既存の Vue 2 / Nuxt 2 プロジェクトのアップグレードを検討している場合
    パフォーマンス改善や最新機能の利用を目的に移行を検討しましょう。

  • 複雑なロジックを持つコンポーネントの開発
    Composition API によるコードの整理と再利用が効果的です。

  • TypeScript を導入したい場合
    Nuxt 3 は TypeScript をネイティブにサポートしているため、スムーズに移行できます。

使わない方がよいケース

  • 既存の Vue 2 / Nuxt 2 プロジェクトで大規模なリファクタが難しい場合
    移行コストが高いので、段階的なアップグレード計画が必要です。

  • 非常にシンプルな静的サイトで、Vue の高度な機能を使わない場合
    Vue 3 の恩恵が少ないため、過剰な導入になる可能性があります。


4. 実務でよくあるユースケースとサンプルコード

ユースケース1:Composition API を使った状態管理の整理

従来の Options API では、datamethods が分かれて記述されていましたが、Composition API では関連するロジックをまとめて管理できます。

<script setup lang="ts">
import { ref } from 'vue'

const count = ref(0)
const increment = () => {
  count.value++
}
</script>

<template>
  <button @click="increment">クリック数: {{ count }}</button>
</template>

このように、状態と操作を同じスコープで管理できるため、コードの見通しが良くなります。


ユースケース2:自動インポートされたリアクティビティ API の活用

Nuxt 3 では Vue のリアクティビティ API(ref, computed など)が自動インポートされるため、明示的なインポートなしで利用可能です。

<script setup lang="ts">
const message = ref('こんにちは、Nuxt 3!')
const reversed = computed(() => message.value.split('').reverse().join(''))
</script>

<template>
  <p>{{ message }}</p>
  <p>逆順: {{ reversed }}</p>
</template>

これにより、コードがさらにシンプルになります。


ユースケース3:TypeScript と組み合わせた型安全な開発

<script setup lang="ts">
import { ref } from 'vue'

const count = ref<number>(0)
const increment = (): void => {
  count.value++
}
</script>

<template>
  <button @click="increment">カウント: {{ count }}</button>
</template>

型を明示することで、IDE の補完や型チェックが強化され、バグを未然に防げます。


5. よくある落とし穴・注意点

SSR と Hydration の問題

Vue 3 の仮想 DOM は高速ですが、サーバーサイドレンダリング(SSR)とクライアントサイドの Hydration(再活性化)時にマークアップの不一致が起こると、警告や描画の乱れが発生します。特に動的に変わる値や非同期データの扱いに注意が必要です。

  • 対策
    • useAsyncDatauseFetch を活用して、サーバーとクライアントで同じデータを取得する。
    • クライアント専用の処理は process.client で条件分岐する。
    • 状態の初期値をサーバーとクライアントで一致させる。

パフォーマンス面の注意

Composition API は便利ですが、過剰に細かく分割しすぎると逆にパフォーマンスが低下することがあります。リアクティブな状態の数が増えすぎると、Vue のリアクティビティシステムに負荷がかかるため、適切な粒度で設計しましょう。

バンドルサイズの最適化

Vue 3 はツリーシェイク可能ですが、外部ライブラリやプラグインの導入でバンドルサイズが増加することがあります。必要な機能だけをインポートし、不要なコードを含めないように注意してください。


6. まとめ

Nuxt 3 と Vue 3 の組み合わせは、パフォーマンス、開発効率、保守性の面で大きなメリットをもたらします。Composition API や自動インポート、TypeScript サポートを活用することで、よりモダンで堅牢なアプリケーション開発が可能です。一方で、SSR と Hydration の整合性やリアクティビティの設計には注意が必要です。これらを理解し適切に使いこなすことで、Nuxt 3 の真価を引き出せるでしょう。


Vue 3 の新機能は学習コストがあるものの、Nuxt 3 の自動インポートや公式の組み込みコンポーザブルを活用するとスムーズに導入できます。まずは小さなコンポーネントから試してみることをおすすめします。