第1回:「実務で活かすNuxt3の基礎 – プロジェクトセットアップから基本構造まで」

『現場で使えるNuxt3入門 – フロントエンド開発の新スタンダードを学ぶ』シリーズを始めるにあたって

フロントエンド開発の世界は日々進化を続けています。その中でもNuxt3は、Vue.jsをベースにしながら、開発効率、パフォーマンス、SEOなど、現代のWeb開発に求められる要素を高いレベルで実現できるフレームワークとして注目を集めています。

しかし、多くの開発者が「公式ドキュメントを読んでも実際の使い方がイメージできない」「基本機能は理解できても、実務でどう活用すればいいのかわからない」という課題を抱えています。

このシリーズでは、Nuxt3の基礎から実践的な活用方法まで、現場での実例を交えながら段階的に解説していきます。

単なる機能説明ではなく、「なぜその機能を使うのか」「どういう場面で活用できるのか」という実務的な視点を重視し、明日からの開発に直接活かせる知識を提供していきます。

はじめに

Nuxt3は、「オープンソースのフルスタックフレームワーク」として2022年末に正式版がリリースされて以来、多くの企業での採用実績を重ねてきました。Vue.jsの強力な機能に加え、ファイルベースのルーティング、自動インポート、SSR/SSGのシームレスな対応など、モダンなWeb開発に必要な機能が豊富に揃っています。

しかし、これらの充実した機能を最大限に活用するには、適切な開発環境の構築が不可欠です。特に実務でNuxt3を使用する場合、個人での開発とは異なり、チームでの協業や保守性を考慮した環境設定が重要になってきます。

本記事では、Nuxt3プロジェクトの立ち上げから、実務で必要となる開発環境の構築まで、ステップバイステップで解説していきます。ESLintやPrettierといったコード品質を保つためのツール設定はもちろん、チーム開発で重要となるGitHubワークフローの設定まで、プロジェクトを成功に導くために必要な要素を一つずつ確認していきましょう。

まずは、Nuxt3の基本的な開発環境を整えることから始めていきます。

1. Nuxt3の開発環境の構築

効率的なNuxt3開発を始めるには、適切な開発環境の構築が不可欠です。ここでは、Nuxt3の開発に必要な環境構築を、実務での利用を想定してステップバイステップで進めていきます。

Node.jsのバージョン要件

Nuxt3を利用するには、Node.js v16.10以上が必要です。しかし、実務での安定性を考慮すると、LTS(Long Term Support)バージョンの使用をお勧めします。執筆時点(2025年2月)では、Node.js v20.x系のLTSを推奨環境として使用します。

Node.jsのバージョン管理には、voltaを使用します。voltaは高速で信頼性が高く、プロジェクトごとにNode.jsのバージョンを固定できる優れたツールです:

bash
# voltaのインストール(macOS / Linux)
curl https://get.volta.sh | bash

# Windowsの場合は、インストーラーをダウンロードして実行
# https://docs.volta.sh/guide/getting-started

# Node.jsのインストール
volta install node@20

# プロジェクトでのNode.jsバージョン固定
volta pin node@20

# バージョン確認
node -v

voltaの主なメリット:

  • プロジェクトごとに自動でNode.jsバージョンを切り替え
  • チーム全体で同じNode.jsバージョンを使用可能
  • インストールと設定が簡単
  • パフォーマンスが優れている

推奨開発ツール

Visual Studio Code

VSCodeは、Nuxt3開発において最も充実した開発体験を提供します。以下の拡張機能は、チーム開発でも統一して導入することをお勧めします:

  • Volar:Vue 3/Nuxt 3の公式推奨拡張機能
  • ESLint:コード品質の保持
  • Prettier:コードフォーマット
  • GitLens:Gitの変更履歴の可視化
  • DotENV:環境変数ファイルのシンタックスハイライト

これらの拡張機能は、.vscode/extensions.jsonに記述することで、チームメンバーへの推奨拡張機能として共有できます。

Nuxt3プロジェクトの作成

では、実際にプロジェクトを作成していきましょう。Nuxt3では、nuxiコマンドを使用して新規プロジェクトを作成します:

bash
# プロジェクトの作成
npx nuxi init my-nuxt-app

# ディレクトリに移動
cd my-nuxt-app

# 依存関係のインストール
npm install

# 開発サーバーの起動
npm run dev

プロジェクト作成時に表示される各種オプションについては、以下のように選択することをお勧めします:

  • パッケージマネージャー:npm(企業での採用実績が最も多い)
  • TypeScript:Yes(型安全性の確保)
  • モジュール構成:Minimal(必要に応じて追加する)
  • コード品質ツール:ESLint + Prettier(標準的な構成)
  • テストツール:Vitest(Vue.js公式が推奨)
  • レンダリングモード:Universal(SSR/SSGの選択肢を残す)

これで、実務で使用できる基本的な開発環境が整いました。

2. Nuxt3のプロジェクト構造の理解

Nuxt3のプロジェクト構造を理解することは、効率的な開発とチームでの協業において非常に重要です。特に実務では、ファイルの配置場所や命名規則を統一することで、コードの保守性と可読性が大きく向上します。

ディレクトリ構成の基本

新規作成したNuxt3プロジェクトの主要なディレクトリと役割を見ていきましょう:

my-nuxt-app/
├── .nuxt/           # ビルドファイル(自動生成)
├── assets/          # プリプロセスが必要なアセット
├── components/      # Vueコンポーネント
├── composables/     # 再利用可能な処理
├── layouts/         # レイアウトテンプレート
├── pages/           # ページコンポーネント
├── plugins/         # Nuxtプラグイン
├── public/          # 静的ファイル
├── server/          # サーバーサイドの処理
└── utils/           # ユーティリティ関数

各ディレクトリの役割と実践的な使い方

pages/

Nuxt3の特徴的な機能である、ファイルベースのルーティングの基点となるディレクトリです。

pages/
├── index.vue        # トップページ(/)
├── about.vue        # アバウトページ(/about)
└── users/
    ├── index.vue    # ユーザー一覧(/users)
    └── [id].vue     # ユーザー詳細(/users/[id])

components/

再利用可能なコンポーネントを配置します。実務では以下のような構成をお勧めします:

components/
├── common/          # 汎用的なコンポーネント
│   ├── Button.vue
│   └── Input.vue
├── layout/          # レイアウト関連のコンポーネント
│   ├── Header.vue
│   └── Footer.vue
└── features/        # 機能単位のコンポーネント
     └── users/
        ├── UserCard.vue
        └── UserList.vue

composables/

コンポーネント間で共有するロジックを配置します。Composition APIを活用した関数を中心に配置します:

composables/
├── useAuth.ts       # 認証関連のロジック
├── useApi.ts        # API通信の共通処理
└── useForm.ts       # フォーム関連の共通処理

assets/

SCSS、画像などのプリプロセスが必要なアセットを配置します:

assets/
├── styles/          # スタイルファイル
│   ├── main.scss
│   └── variables.scss
└── images/          # 画像ファイル
     └── logo.svg

nuxt.config.tsの基本設定

プロジェクトの設定ファイルであるnuxt.config.tsの基本的な設定例を見ていきましょう:

typescript
export default defineNuxtConfig({
  // TypeScriptの厳格モードを有効化
  typescript: {
    strict: true,
    shim: false,
  },

  // モジュールの設定
  modules: [
    '@nuxtjs/tailwindcss',
    '@pinia/nuxt',
  ],

  // アプリケーションの基本設定
  app: {
    head: {
      title: 'My Nuxt App',
      meta: [
        { charset: 'utf-8' },
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      ],
    },
  },

  // 開発時の設定
  devtools: { enabled: true }
})

このような構成で開発を進めることで、チームメンバー全員が同じ理解のもとでコードを書くことができ、保守性の高いアプリケーションを構築することができます。

3. 開発環境のカスタマイズ

Nuxt3プロジェクトの基本構造を理解したところで、実務での開発効率を高めるための環境カスタマイズを行っていきましょう。ここでは、コード品質の維持とチーム開発の効率化に焦点を当てた設定を行います。

ESLint・Prettierの設定

コードの品質維持と統一的なフォーマットのために、ESLintとPrettierの設定を行います。

bash
# 必要なパッケージのインストール
npm install -D eslint eslint-plugin-vue @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-prettier prettier

.eslintrc.jsの設定例:

javascript
module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
  },
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@typescript-eslint/parser',
  },
  extends: [
    'plugin:vue/vue3-recommended',
    'plugin:@typescript-eslint/recommended',
    'prettier',
  ],
  rules: {
    'vue/multi-word-component-names': 'off',
    'vue/require-default-prop': 'off',
    '@typescript-eslint/no-unused-vars': 'warn',
    // プロジェクトに応じてカスタマイズ
  },
}

.prettierrcの設定例:

json
{
  "semi": false,
  "singleQuote": true,
  "trailingComma": "all",
  "printWidth": 100,
  "tabWidth": 2,
  "endOfLine": "auto"
}

TypeScriptの設定

型安全性を高めるために、TypeScriptの設定を調整します。

tsconfig.jsonの拡張設定:

json
{
  "extends": "./.nuxt/tsconfig.json",
  "compilerOptions": {
    "strict": true,
    "skipLibCheck": true,
    "types": [
      "@types/node",
      "nuxt-windicss"
    ]
  }
}

GitHubワークフローの設定

チーム開発を円滑に進めるために、GitHub Actionsを使用したCI/CDパイプラインを構築します。

.github/workflows/ci.ymlの例:

yaml
name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: volta-cli/action@v4
      - name: Install dependencies
        run: npm ci
      - name: Lint
        run: npm run lint
      - name: Type check
        run: npm run typecheck
      - name: Test
        run: npm run test

VSCodeの推奨設定

プロジェクトのルートに.vscodeディレクトリを作成し、チーム共通の設定を行います。

.vscode/settings.json

json
{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "typescript.tsdk": "node_modules/typescript/lib",
  "files.associations": {
    "*.css": "postcss"
  }
}

.vscode/extensions.json

json
{
  "recommendations": [
    "Vue.volar",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "eamodio.gitlens",
    "mikestead.dotenv"
  ]
}

これらの設定により、以下のような利点が得られます:

  • コードの一貫性維持
  • 自動フォーマットによる効率化
  • 型エラーの早期発見
  • CIによる品質担保
  • チーム全体での開発環境の統一

4. Nuxt3でシンプルなページの作成

設定が整ったところで、実際にNuxt3でページを作成していきましょう。ここでは、シンプルなトップページを作成しながら、Nuxt3の基本的な機能と実務でよく使用するパターンを学んでいきます。

トップページの作成

まずはpages/index.vueを作成し、基本的なページ構造を実装します:

vue
<script setup lang="ts">
const title = ref('Welcome to Nuxt3')
const description = ref('Modern Vue.js Framework for Production')
</script>

<template>
  <div class="container mx-auto px-4 py-8">
    <h1 class="text-4xl font-bold mb-4">{{ title }}</h1>
    <p class="text-gray-600 mb-8">{{ description }}</p>
    
    <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
      <AppCard title="Features">
        <ul class="list-disc list-inside">
          <li>File-based routing</li>
          <li>Auto-imports</li>
          <li>Server-side rendering</li>
        </ul>
      </AppCard>
      
      <AppCard title="Getting Started">
        <p>Start building your next Vue.js application with Nuxt 3.</p>
        <AppButton @click="navigateToGuide">
          View Guide
        </AppButton>
      </AppCard>
    </div>
  </div>
</template>

コンポーネントの作成

再利用可能なコンポーネントをcomponents/ディレクトリに作成します。

components/app/Card.vue:

vue
<script setup lang="ts">
interface Props {
  title: string
}

defineProps<Props>()
</script>

<template>
  <div class="bg-white shadow rounded-lg p-6">
    <h2 class="text-xl font-semibold mb-4">{{ title }}</h2>
    <slot />
  </div>
</template>

components/app/Button.vue:

vue
<script setup lang="ts">
interface Props {
  variant?: 'primary' | 'secondary'
}

const props = withDefaults(defineProps<Props>(), {
  variant: 'primary'
})
</script>

<template>
  <button
    :class="[
      'px-4 py-2 rounded-md transition-colors',
      variant === 'primary'
        ? 'bg-blue-500 hover:bg-blue-600 text-white'
        : 'bg-gray-200 hover:bg-gray-300 text-gray-800'
    ]"
  >
    <slot />
  </button>
</template>

スタイリングの適用

Nuxt3では、複数のスタイリング方法が選択できます。ここでは、TailwindCSSとSCSSの組み合わせで実装していきます。

assets/styles/main.scss:

SCSS
// グローバルスタイル
@layer base {
  body {
    @apply bg-gray-50 text-gray-900;
  }
}

// カスタムユーティリティ
@layer utilities {
  .container {
    @apply max-w-7xl mx-auto;
  }
}

これらのコンポーネントとスタイルを組み合わせることで、メンテナンス性が高く、再利用可能なUIを構築することができます。

コンポーネント設計のポイント

実務でのコンポーネント開発では、以下の点に注意を払うことをお勧めします:

  1. 単一責任の原則を守る
  2. Props、Emitsの型定義を明確にする
  3. コンポーネントの粒度を適切に保つ
  4. グローバルな状態管理を最小限に抑える

5. Nuxt3でよくあるトラブルシューティング

Nuxt3での開発を進める中で、特に初期段階でよく遭遇するエラーや問題について解説します。実務でのトラブルを素早く解決できるよう、代表的な事例とその対処法をまとめていきましょう。

よくあるエラーと解決方法

1. Auto-importsに関する問題

typescript
// エラー
// Component 'AppButton' has no exported component declaration.
<AppButton>Click me</AppButton>

このようなエラーが発生した場合の対処法:

  • .nuxt/ディレクトリを削除して再ビルド
  • components/ディレクトリの命名規則の確認
  • nuxt.config.tsでのコンポーネント設定の確認

2. TypeScriptの型エラー

typescript
// エラー
// Property 'value' does not exist on type 'Ref<undefined>'
const value = ref()
value.value = 'test'

解決策:

typescript
// 正しい型定義
const value = ref<string>('')
// または
const value = ref<string | undefined>()

3. ビルド時のメモリエラー

Node.jsのメモリ不足でビルドが失敗する場合:

bash
# package.jsonのscriptsを修正
{
  "scripts": {
    "build": "NODE_OPTIONS=--max-old-space-size=4096 nuxt build"
  }
}

デバッグの方法

Vue DevTools の活用

Vue DevToolsを使用したデバッグ方法:

  • コンポーネントの状態確認
  • Pinia ストアの監視
  • パフォーマンスのプロファイリング
typescript
// デバッグモードの有効化
export default defineNuxtConfig({
  devtools: {
    enabled: true,
    timeline: true
  }
})

サーバーサイドのデバッグ

server/ディレクトリ内のコードをデバッグする方法:

typescript
// server/api/example.ts
export default defineEventHandler((event) => {
  console.log('Server-side log:', event)  // Node.jsのコンソールに出力
})

Nuxt3関連の参考リソース

トラブルシューティングに役立つ公式リソース:

これらの問題に遭遇した際は、まず公式ドキュメントを確認し、解決できない場合はGitHub IssuesやNuxtコミュニティでの類似事例を参照することをお勧めします。

次回は「実践的なNuxt3ルーティング設計 – 大規模アプリケーションに備える」と題して、より実践的なルーティング設計について解説していく予定です。