T-CREATOR

Vue.js とは?初心者でも 3 分でわかる次世代フロントエンド

Vue.js とは?初心者でも 3 分でわかる次世代フロントエンド

現代の Web 開発において、フロントエンドフレームワークの選択は非常に重要な決断となります。その中でも、Vue.js は開発者から絶大な支持を受け、急速に普及している注目のフロントエンドフレームワークです。「学習しやすく、使いやすく、そして強力」というコンセプトのもと開発された Vue.js は、初心者から上級者まで幅広い開発者に愛用されています。

この記事では、Vue.js の基本概念から特徴、他のフレームワークとの違い、そして実際の開発環境構築まで、初心者の方でも 3 分で理解できるよう丁寧に解説していきます。

Vue.js とは何か?

Vue.js(ビュージェーエス)は、Evan You 氏によって 2014 年に開発された JavaScript フレームワークです。ユーザーインターフェース(UI)の構築に特化したプログレッシブフレームワークとして設計されており、既存のプロジェクトに段階的に導入することができます。

Vue.js の正式名称は「Vue.js」ですが、単に「Vue」と呼ばれることも多く、フランス語で「見る」という意味の単語から名付けられました。

Vue.js の基本理念

Vue.js は以下の 3 つの基本理念に基づいて開発されています:

#理念説明
1Approachable(親しみやすさ)HTML と JavaScript の知識があれば簡単に始められる
2Versatile(汎用性)小さなウィジェットから大規模なアプリケーションまで対応
3Performant(高性能)最小限の最適化で高いパフォーマンスを実現

なぜ Vue.js が注目されているのか

急速な普及と開発者満足度

Vue.js は、Stack Overflow Developer Survey 2023 において**「最も愛されているフレームワーク」**の上位にランクインしており、GitHub 上でも 80,000 を超えるスターを獲得しています。

この人気の背景には、以下のような理由があります:

学習コストの低さ 従来の HTML テンプレートライクな書き方ができるため、jQuery から移行する開発者にとって親しみやすい設計となっています。

豊富なエコシステム Vue Router(ルーティング)、Pinia(状態管理)、Nuxt.js(フルスタックフレームワーク)など、開発に必要なツールが充実しています。

企業での採用実績 GitLab、Adobe、Nintendo、BMW、Louis Vuitton など、世界的な企業で実際に採用されており、信頼性の高さが証明されています。

Vue.js の 3 つの特徴

リアクティブシステム

Vue.js の最大の特徴は、リアクティブシステムです。データが変更されると、自動的に UI が更新される仕組みが標準で備わっています。

以下のサンプルコードをご覧ください:

javascript// Vue 3のComposition API を使用した例
<template>
  <div>
    <h1>{{ message }}</h1>
    <button @click="updateMessage">メッセージを更新</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

// リアクティブなデータを定義
const message = ref('こんにちは、Vue.js!')

// データを更新する関数
const updateMessage = () => {
  message.value = '更新されました!'
}
</script>

上記のコードでは、messageの値が変更されると、自動的にテンプレート内の{{ message }}部分が更新されます。これにより、煩雑な DOM 操作を書く必要がありません。

コンポーネント指向

Vue.js はコンポーネント指向の設計を採用しており、再利用可能な UI パーツを作成できます。

javascript// UserCard.vue コンポーネント
<template>
  <div class="user-card">
    <img :src="user.avatar" :alt="user.name" />
    <h3>{{ user.name }}</h3>
    <p>{{ user.email }}</p>
  </div>
</template>

<script setup>
// プロパティとして受け取るデータを定義
defineProps({
  user: {
    type: Object,
    required: true
  }
})
</script>

<style scoped>
.user-card {
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 16px;
  margin: 8px;
}
</style>

このコンポーネントは、以下のように他のコンポーネントで再利用できます:

javascript<template>
  <div>
    <UserCard :user="user1" />
    <UserCard :user="user2" />
  </div>
</template>

学習コストの低さ

Vue.js は学習コストの低さを重視して設計されています。HTML の知識があれば、すぐに理解できるテンプレート構文を採用しています。

javascript<template>
  <!-- 条件分岐 -->
  <div v-if="isLoggedIn">
    ログイン済みです
  </div>
  <div v-else>
    ログインしてください
  </div>

  <!-- リスト表示 -->
  <ul>
    <li v-for="item in items" :key="item.id">
      {{ item.name }}
    </li>
  </ul>

  <!-- イベントハンドリング -->
  <button @click="handleClick">クリック</button>
</template>

このように、HTML ライクな記述でありながら、強力な機能を提供しています。

他のフレームワークとの違い

React、Angular との比較表

#項目Vue.jsReactAngular
1学習コストの低さ★★★★★★★★☆☆★★☆☆☆
2テンプレート記法HTML ライクJSXTypeScript + HTML
3状態管理PiniaRedux/ContextRxJS
4型安全性TypeScript 対応TypeScript 対応TypeScript 標準
5コミュニティサイズ特大
6企業サポートなしMetaGoogle
7バンドルサイズ軽量軽量重い

具体的な違いの例

同じ機能をそれぞれのフレームワークで実装した場合

Vue.js(最もシンプル):

javascript<template>
  <div>{{ count }}</div>
  <button @click="count++">+1</button>
</template>

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

React(JSX を使用):

javascriptimport { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <div>{count}</div>
      <button onClick={() => setCount(count + 1)}>
        +1
      </button>
    </div>
  );
}

Angular(より多くのボイラープレートが必要):

typescript@Component({
  selector: 'app-counter',
  template: `
    <div>{{ count }}</div>
    <button (click)="increment()">+1</button>
  `,
})
export class CounterComponent {
  count = 0;

  increment() {
    this.count++;
  }
}

Vue.js でできること

Single Page Application(SPA)

Vue.js を使用することで、ページ遷移がスムーズなSPAを構築できます。

javascript// Vue Router を使用したルーティング設定
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

リアルタイムアプリケーション

WebSocket を組み合わせることで、チャットアプリやリアルタイム更新が必要なアプリケーションも構築可能です。

javascript<template>
  <div>
    <div v-for="message in messages" :key="message.id">
      {{ message.text }}
    </div>
    <input v-model="newMessage" @keyup.enter="sendMessage" />
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import io from 'socket.io-client'

const messages = ref([])
const newMessage = ref('')
const socket = io('ws://localhost:3000')

onMounted(() => {
  socket.on('message', (message) => {
    messages.value.push(message)
  })
})

const sendMessage = () => {
  socket.emit('message', newMessage.value)
  newMessage.value = ''
}
</script>

Progressive Web App(PWA)

Vue.js とサービスワーカーを組み合わせることで、ネイティブアプリのような体験を提供する PWA を開発できます。

実際に動くサンプルコード

シンプルな ToDo アプリケーション

以下は、Vue.js で作成した ToDo アプリの完全なサンプルコードです:

javascript<template>
  <div class="todo-app">
    <h1>Vue.js ToDoアプリ</h1>

    <!-- タスク追加フォーム -->
    <form @submit.prevent="addTodo">
      <input
        v-model="newTodo"
        placeholder="新しいタスクを入力"
        required
      />
      <button type="submit">追加</button>
    </form>

    <!-- タスク一覧 -->
    <ul class="todo-list">
      <li
        v-for="todo in todos"
        :key="todo.id"
        :class="{ completed: todo.completed }"
      >
        <input
          type="checkbox"
          v-model="todo.completed"
        />
        <span>{{ todo.text }}</span>
        <button @click="deleteTodo(todo.id)">削除</button>
      </li>
    </ul>

    <!-- 統計情報 -->
    <div class="stats">
      <p>総タスク数: {{ todos.length }}</p>
      <p>完了済み: {{ completedCount }}</p>
    </div>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

// リアクティブデータ
const newTodo = ref('')
const todos = ref([
  { id: 1, text: 'Vue.jsを学習する', completed: false },
  { id: 2, text: 'ToDoアプリを作る', completed: true }
])

// 算出プロパティ
const completedCount = computed(() => {
  return todos.value.filter(todo => todo.completed).length
})

// メソッド
const addTodo = () => {
  if (newTodo.value.trim()) {
    todos.value.push({
      id: Date.now(),
      text: newTodo.value,
      completed: false
    })
    newTodo.value = ''
  }
}

const deleteTodo = (id) => {
  todos.value = todos.value.filter(todo => todo.id !== id)
}
</script>

<style scoped>
.todo-app {
  max-width: 500px;
  margin: 0 auto;
  padding: 20px;
}

.todo-list {
  list-style: none;
  padding: 0;
}

.todo-list li {
  display: flex;
  align-items: center;
  padding: 10px;
  border-bottom: 1px solid #eee;
}

.completed span {
  text-decoration: line-through;
  color: #999;
}

.stats {
  margin-top: 20px;
  padding: 10px;
  background-color: #f5f5f5;
  border-radius: 4px;
}
</style>

このサンプルコードでは、Vue.js の主要な機能を実際に使用しています:

  • リアクティブデータ: ref()で状態管理
  • 算出プロパティ: computed()で動的な値計算
  • イベントハンドリング: @click@submitでユーザー操作に対応
  • 条件分岐: v-ifで表示切り替え
  • リスト表示: v-forで配列データの表示

Vue.js を始めるための環境構築

方法 1: CDN を使用した簡単導入(初心者推奨)

最も簡単に Vue.js を試す方法は、CDN リンクを使用することです:

html<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0"
    />
    <title>Vue.js 入門</title>
  </head>
  <body>
    <div id="app">
      <h1>{{ message }}</h1>
      <button @click="updateMessage">クリック</button>
    </div>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script>
      const { createApp, ref } = Vue;

      createApp({
        setup() {
          const message = ref('Hello Vue.js!');

          const updateMessage = () => {
            message.value = '更新されました!';
          };

          return {
            message,
            updateMessage,
          };
        },
      }).mount('#app');
    </script>
  </body>
</html>

方法 2: Vite を使用した本格的な開発環境

実際の開発では、Vite を使用した環境構築がおすすめです:

bash# Node.jsのバージョン確認(18.0以上推奨)
node --version

# Vue.jsプロジェクトの作成
yarn create vue@latest my-vue-app

# プロジェクトディレクトリに移動
cd my-vue-app

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

# 開発サーバーの起動
yarn dev

作成時に表示される設定オプション:

yamlVue.js - The Progressive JavaScript Framework

 Project name:  my-vue-app
 Add TypeScript?  No / Yes
 Add JSX Support?  No / Yes
 Add Vue Router for Single Page Application development?  No / Yes
 Add Pinia for state management?  No / Yes
 Add Vitest for Unit Testing?  No / Yes
 Add an End-to-End Testing Solution?  No
 Add ESLint for code quality?  No / Yes

初心者におすすめの設定

  • TypeScript: Yes(型安全性のため)
  • Vue Router: Yes(ページ遷移のため)
  • Pinia: No(最初は不要)
  • ESLint: Yes(コード品質のため)

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

エラー 1: yarn コマンドが見つからない
bashyarn : command not found

解決方法

bash# Yarnのインストール
npm install -g yarn

# インストール確認
yarn --version
エラー 2: Node.js のバージョンが古い
basherror: This version of Node.js is not supported

解決方法: Node.js 18.0 以上をインストールしてください。Node.js 公式サイトからダウンロードできます。

エラー 3: ポート 3000 が使用中
bashPort 3000 is already in use

解決方法

bash# 別のポートで起動
yarn dev --port 3001

# または使用中のポートを強制終了
lsof -ti:3000 | xargs kill -9

VS Code 拡張機能の推奨設定

Vue.js 開発を効率化するために、以下の拡張機能をインストールすることをおすすめします:

#拡張機能名説明
1Vue Language Features (Volar)Vue.js の構文ハイライト・IntelliSense
2TypeScript Vue Plugin (Volar)TypeScript 用の型チェック
3Auto Rename TagHTML タグの自動リネーム
4Prettierコードフォーマッター
5ESLintコード品質チェック

まとめ

Vue.js は、現代のフロントエンド開発において非常に魅力的な選択肢です。その理由として、以下の点が挙げられます:

学習コストの低さ HTML と JavaScript の基礎知識があれば、すぐに始めることができる親しみやすい設計です。

強力なリアクティブシステム データの変更が自動的に UI に反映される仕組みにより、複雑な DOM 操作を書く必要がありません。

豊富なエコシステム Vue Router、Pinia、Nuxt.js など、実際の開発に必要なツールが充実しており、企業レベルのアプリケーション開発にも対応できます。

高いパフォーマンス 最小限の最適化で高いパフォーマンスを実現し、ユーザー体験の向上に貢献します。

Vue.js を学習することで、現代的な Web アプリケーション開発のスキルを身につけることができます。まずは今回紹介した CDN 版から始めて、慣れてきたら Vite を使用した本格的な開発環境に挑戦してみてください。

フロントエンド開発の世界は日々進化していますが、Vue.js の持つ「シンプルさ」と「強力さ」のバランスは、これからも多くの開発者に愛され続けるでしょう。

関連リンク