【Vue.js】CDNを使った簡単なデモ

2025-07-29

はじめに

Vue.jsを始める最も簡単な方法は、CDN(Content Delivery Network)を利用することです。この方法では、ビルドツールやNode.jsのインストールが不要で、HTMLファイルにscriptタグを追加するだけでVue.jsを使い始めることができます。この記事では、CDNを使ったVue.jsの基本的な使い方から、実際に動くデモアプリケーションの作成までをステップバイステップで解説します。

CDNとは?

CDNは、世界中に分散したサーバーからコンテンツを配信するネットワークです。Vue.jsのCDNを利用すると、以下の利点があります:

  1. サーバー設定が不要
  2. ビルドプロセスが不要
  3. すぐにコーディングを始められる
  4. 学習用やプロトタイピングに最適

基本的なセットアップ

まずは最もシンプルなVue.jsアプリケーションを作成してみましょう。このコードは、CDNから読み込んだVue.js 3を使って、画面に動的なメッセージを表示する最も基本的なサンプルです。<div id="app"> の中には最初はただ {{ message }} と書かれていますが、Vueアプリを作成して #app にマウントすることで、この部分がVueの管理下に入り、data() が返すオブジェクト内の message プロパティの値に自動的に置き換わります。ここでは 'こんにちは、Vue.js!' が表示されます。CDN経由で <script src="...vue.global.js"> を読み込んでいるため、ビルド環境を用意しなくてもブラウザだけでVueを試せる構成になっています。createApp({...}).mount('#app') の流れで「アプリを定義 → データを用意 → HTMLに結びつける」というVueの基本的な書き方を確認できます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue.js CDNデモ</title>
  <!-- Vue.jsのCDNを追加 -->
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
  <div id="app">
    {{ message }}
  </div>

  <script>
    // Vueアプリケーションの作成
    const { createApp } = Vue;

    createApp({
      data() {
        return {
          message: 'こんにちは、Vue.js!'
        }
      }
    }).mount('#app');
  </script>
</body>
</html>

データバインディングのデモ

次に、双方向データバインディングのデモを作成してみましょう。このコードは、Vue.jsを使って「双方向データバインディング(two-way data binding)」の仕組みを体験できるデモです。CDNからVue 3を読み込み、#app要素をVueアプリとして管理しています。data()ではnamemessageという2つのデータプロパティを定義し、それぞれ入力欄(<input><textarea>)にv-modelディレクティブで結び付けています。これにより、ユーザーがテキストを入力すると即座にVue内部のデータが更新され、同時に画面上の表示({{ name }}{{ message }})もリアルタイムで変化します。つまり、データの変更が画面表示に、画面操作がデータに即反映されるというVueの特徴をわかりやすく示しています。CSSでは中央寄せのレイアウトやフォーム要素のスタイルを整え、簡潔ながら実用的なUIを提供しています。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>双方向データバインディングデモ</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <style>
    .demo-container {
      max-width: 600px;
      margin: 0 auto;
      padding: 20px;
      font-family: Arial, sans-serif;
    }
    input, textarea {
      width: 100%;
      margin-bottom: 10px;
      padding: 8px;
    }
  </style>
</head>
<body>
  <div id="app" class="demo-container">
    <h1>双方向データバインディングデモ</h1>

    <div>
      <label for="name">名前:</label>
      <input id="name" v-model="name" placeholder="名前を入力">
    </div>

    <div>
      <label for="message">メッセージ:</label>
      <textarea id="message" v-model="message" rows="4"></textarea>
    </div>

    <div>
      <h3>プレビュー:</h3>
      <p><strong>{{ name }}</strong> さんのメッセージ:</p>
      <p>{{ message }}</p>
    </div>
  </div>

  <script>
    const { createApp } = Vue;

    createApp({
      data() {
        return {
          name: '',
          message: ''
        }
      }
    }).mount('#app');
  </script>
</body>
</html>

イベントハンドリングのデモ

次に、ボタンクリックなどのイベントを処理するデモを作成します。このコードは、Vue.jsの「イベントハンドリング」と「リアクティブデータ更新」を学ぶためのシンプルなカウンターアプリの例です。CDNからVue 3を読み込み、#app内のcountデータをリアルタイムに操作できるようにしています。data()で初期値count: 0を定義し、methods内に3つのメソッド(incrementdecrementreset)を用意しています。各ボタンには@clickディレクティブを使ってクリックイベントをバインドしており、ボタンを押すたびにcountの値が即座に変更され、画面上に反映されます。また、v-ifv-else-ifを使い、カウントが10を超えると「10を超えました!」、0未満になると「0未満です!」というメッセージが条件に応じて切り替わります。CSSでは中央寄せのレイアウトや大きな数値表示を整え、直感的に操作できるデザインに仕上げられています。このコードはVueにおけるデータバインディング、条件分岐、イベント処理の基礎を理解するのに最適な教材です。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>イベントハンドリングデモ</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <style>
    .counter-container {
      max-width: 300px;
      margin: 50px auto;
      text-align: center;
      font-family: Arial, sans-serif;
    }
    .counter-value {
      font-size: 3rem;
      margin: 20px 0;
    }
    button {
      padding: 10px 20px;
      font-size: 1rem;
      margin: 0 10px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <div id="app" class="counter-container">
    <h2>カウンターアプリ</h2>
    <div class="counter-value">{{ count }}</div>
    <div>
      <button @click="increment">増やす (+1)</button>
      <button @click="decrement">減らす (-1)</button>
      <button @click="reset">リセット</button>
    </div>
    <p v-if="count > 10">10を超えました!</p>
    <p v-else-if="count < 0">0未満です!</p>
  </div>

  <script>
    const { createApp } = Vue;

    createApp({
      data() {
        return {
          count: 0
        }
      },
      methods: {
        increment() {
          this.count++;
        },
        decrement() {
          this.count--;
        },
        reset() {
          this.count = 0;
        }
      }
    }).mount('#app');
  </script>
</body>
</html>

条件付きレンダリングのデモ

v-ifとv-showの違いを理解するためのデモを作成します。このコードは、Vue.jsにおける「条件付きレンダリング」の仕組みを理解するためのデモです。v-ifv-showという2つのディレクティブの違いを、実際のDOM操作を通じて確認できるよう設計されています。アプリではisVisible(表示状態)とuseIf(制御方法の選択)という2つのデータを定義し、toggleVisibility()で表示・非表示を切り替え、toggleMethod()v-ifv-showの切り替え方法を変更します。

v-ifを使う場合は、条件がfalseになると対象の要素がDOMから完全に削除され、再度trueになると再生成されます。一方、v-showでは要素はDOMに残ったままで、CSSのdisplay: noneで非表示になるだけです。これにより、頻繁に表示を切り替える要素にはv-show、初期ロードの軽量化を重視する場合はv-ifが適しています。

このデモでは2つのボタンを使い、表示方法をリアルタイムで変更しながら挙動を比較できます。また、開発者ツールでDOM構造を確認することで、VueがどのようにDOMを操作しているかを視覚的に学べる実践的な教材です。CSSでは見やすいボックスデザインで情報を整理し、学習者が違いを直感的に理解できるよう工夫されています。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>条件付きレンダリングデモ</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <style>
    .demo-container {
      max-width: 600px;
      margin: 0 auto;
      padding: 20px;
      font-family: Arial, sans-serif;
    }
    .box {
      padding: 20px;
      margin: 10px 0;
      border: 1px solid #ccc;
      background-color: #f9f9f9;
    }
    button {
      padding: 8px 16px;
      margin-right: 10px;
    }
  </style>
</head>
<body>
  <div id="app" class="demo-container">
    <h1>条件付きレンダリングデモ</h1>

    <button @click="toggleVisibility">表示切り替え</button>
    <button @click="toggleMethod">切り替え方法変更 (現在: {{ useIf ? 'v-if' : 'v-show' }})</button>

    <div v-if="useIf ? isVisible : true" v-show="!useIf ? isVisible : true" class="box">
      <h2>{{ useIf ? 'v-ifで制御' : 'v-showで制御' }}</h2>
      <p>このコンテンツは {{ useIf ? 'v-if' : 'v-show' }} で表示を制御しています。</p>
      <p>開発者ツールでDOMの変化を確認してみましょう。</p>
    </div>

    <div class="box">
      <h3>v-ifとv-showの違い</h3>
      <ul>
        <li><strong>v-if</strong>: 条件がfalseの場合、DOMから要素が完全に削除される</li>
        <li><strong>v-show</strong>: 条件がfalseの場合、要素はDOMに残り、display: noneが適用される</li>
      </ul>
    </div>
  </div>

  <script>
    const { createApp } = Vue;

    createApp({
      data() {
        return {
          isVisible: true,
          useIf: true
        }
      },
      methods: {
        toggleVisibility() {
          this.isVisible = !this.isVisible;
        },
        toggleMethod() {
          this.useIf = !this.useIf;
        }
      }
    }).mount('#app');
  </script>
</body>
</html>

リストレンダリングのデモ

v-forディレクティブを使ったリストレンダリングのデモを作成します。このコードは、Vue.jsを用いて「リストレンダリング(v-for)」と「リアクティブデータ管理」を体験できるToDoリストアプリのデモです。CDNでVue 3を読み込み、#appをアプリケーションのルート要素としてマウントしています。data()には、初期ToDoリスト(3件のサンプルタスク)と新規入力用のnewTodoを定義。ユーザーが入力欄に文字を入力しEnterキーを押すか「追加」ボタンをクリックすると、addTodo()メソッドが実行され、todos配列に新しいタスクがオブジェクトとして追加されます。

各タスクはv-forディレクティブを使って<li>要素としてリスト表示され、:keyで一意の識別子を指定。チェックボックスにv-model="todo.completed"を設定しているため、完了状態がリアルタイムでデータに反映されます。完了タスクにはcompletedクラスが動的に付与され、CSSで打ち消し線と灰色表示になる視覚的効果を持たせています。また、「削除」ボタンを押すとremoveTodo(index)メソッドが呼ばれ、該当のタスクが配列から削除されます。

さらに、computedプロパティcompletedCountによって完了済みタスク数を自動的に計算し、合計件数・完了件数・未完了件数が動的に表示されます。これにより、Vue.jsの「データの双方向バインディング」「リストレンダリング」「算出プロパティ」「イベント処理」といった基本概念を一度に理解できる構成になっています。CSSで中央寄せや柔らかなレイアウトを整え、シンプルながら実用的なUIを実現しています。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>リストレンダリングデモ</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <style>
    .todo-container {
      max-width: 500px;
      margin: 0 auto;
      padding: 20px;
      font-family: Arial, sans-serif;
    }
    .todo-list {
      list-style: none;
      padding: 0;
    }
    .todo-item {
      display: flex;
      align-items: center;
      padding: 10px;
      border-bottom: 1px solid #eee;
    }
    .todo-item input[type="checkbox"] {
      margin-right: 10px;
    }
    .todo-item.completed {
      text-decoration: line-through;
      color: #888;
    }
    .add-todo {
      display: flex;
      margin-top: 20px;
    }
    .add-todo input {
      flex-grow: 1;
      padding: 8px;
    }
    .add-todo button {
      margin-left: 10px;
      padding: 8px 16px;
    }
  </style>
</head>
<body>
  <div id="app" class="todo-container">
    <h1>ToDoリスト</h1>

    <ul class="todo-list">
      <li v-for="(todo, index) in todos" :key="todo.id" class="todo-item" :class="{ completed: todo.completed }">
        <input type="checkbox" v-model="todo.completed">
        <span>{{ todo.text }}</span>
        <button @click="removeTodo(index)" style="margin-left: auto;">削除</button>
      </li>
    </ul>

    <div class="add-todo">
      <input v-model="newTodo" @keyup.enter="addTodo" placeholder="新しいToDoを追加">
      <button @click="addTodo">追加</button>
    </div>

    <div class="stats">
      <p>合計: {{ todos.length }}件 | 完了: {{ completedCount }}件 | 未完了: {{ todos.length - completedCount }}件</p>
    </div>
  </div>

  <script>
    const { createApp } = Vue;

    createApp({
      data() {
        return {
          newTodo: '',
          todos: [
            { id: 1, text: 'Vue.jsを学ぶ', completed: false },
            { id: 2, text: 'CDNの使い方を理解する', completed: false },
            { id: 3, text: 'デモアプリを作成する', completed: false }
          ]
        }
      },
      computed: {
        completedCount() {
          return this.todos.filter(todo => todo.completed).length;
        }
      },
      methods: {
        addTodo() {
          if (this.newTodo.trim() === '') return;

          this.todos.push({
            id: Date.now(),
            text: this.newTodo,
            completed: false
          });

          this.newTodo = '';
        },
        removeTodo(index) {
          this.todos.splice(index, 1);
        }
      }
    }).mount('#app');
  </script>
</body>
</html>

まとめ

この記事では、Vue.jsをCDNで利用する方法と、基本的なデモアプリケーションの作成方法を紹介しました。CDNを利用することで、以下のようなアプリケーションを簡単に作成できます。

  1. 双方向データバインディングのデモ
  2. イベントハンドリングのデモ
  3. 条件付きレンダリングのデモ
  4. リストレンダリングを使ったToDoアプリ

CDNを使った方法は、Vue.jsを学び始めるのに最適な方法です。簡単に試せるので、さまざまな機能を実験しながらVue.jsの基本概念を理解していきましょう。本格的なアプリケーション開発に進む際は、Vue CLIやViteを使ったプロジェクト構成も検討してください。