Vue CLI入門:モダンなVue.js開発環境を構築


Vue CLI入門:モダンなVue.js開発環境を構築する

はじめに:なぜVue CLIが必要なのか?

Vue.jsは、インタラクティブなユーザーインターフェイスを構築するための、プログレッシブなフレームワークです。学習が容易で、小規模なアプリケーションから大規模なシングルページアプリケーション(SPA)まで、幅広いプロジェクトに適用できます。

Vue.jsを使った開発を始めるにあたり、いくつかの方法があります。最もシンプルなのは、HTMLファイルに<script>タグでVue.jsライブラリを読み込む方法です。これは小規模なデモや静的なサイトへの組み込みには便利ですが、本格的なアプリケーション開発には向いていません。

モダンなフロントエンド開発では、以下のような要素が不可欠とされています。

  • コンポーネントベースの開発: UIを再利用可能な部品(コンポーネント)に分割して開発する。
  • モジュールシステム: JavaScriptコードをモジュールに分割し、依存関係を管理する (import/export)。
  • トランスパイル: 最新のJavaScript構文 (ES Next) やTypeScript、JSXなどを、ブラウザが理解できる形に変換する。
  • CSSプリプロセッサー: Sass, Less, StylusなどのCSSプリプロセッサーを使って、CSS記述を効率化する。
  • ホットリロード/ホットモジュールリプレースメント (HMR): コード変更時にブラウザを自動的に更新したり、アプリケーションの状態を維持したまま更新したりする。
  • コード分割 (Code Splitting): アプリケーションを小さなチャンクに分割し、必要な時にだけロードすることで初期ロード時間を短縮する。
  • アセットの最適化: 画像やフォントなどのアセットを最適化する。
  • プロダクションビルド: デプロイ用にコードをバンドルし、ミニファイ(圧縮)して最適化する。
  • 静的解析 (Linting) & コードフォーマット: コード品質を保ち、チーム開発でのスタイル統一を enforces する。
  • 単体テスト & E2Eテスト: アプリケーションの品質を保証するためのテスト。

これらの要素をゼロから手動で設定しようとすると、WebpackやBabel、PostCSSなどの様々なツールについて深く理解し、複雑な設定ファイルを記述する必要があります。これは非常に時間と労力がかかる作業であり、特にフロントエンド開発初心者にとっては大きな障壁となります。

ここでVue CLIの出番です。

Vue CLIは、Vue.jsアプリケーション開発のための標準ツールチェーンです。上記のモダンな開発環境を、事前の設定なしにすぐに利用できるように、複雑な設定を抽象化し、コマンド一つで提供してくれます。

Vue CLIを使うことで、開発者は環境構築の煩雑さから解放され、アプリケーション自体の開発に集中できるようになります。また、公式ツールであるため、Vue.jsのエコシステムとの連携もスムーズです。

この記事では、Vue CLIを使ってモダンなVue.js開発環境を構築し、基本的な開発ワークフローを学ぶためのステップを詳細に解説します。この記事を読み終える頃には、あなたはVue CLIを活用して、効率的で保守性の高いVue.jsアプリケーション開発を始めることができるようになっているはずです。

Vue CLIとは何か?

Vue CLIは、Vue.js開発のための公式コマンドラインインターフェイスツールです。主な目的は、Vue.jsプロジェクトの迅速なスキャフォールディング(骨組み作成)と、すぐに使えるモダンな開発環境の提供です。

Vue CLIが提供する主な機能は以下の通りです。

  1. プロジェクトスキャフォールディング: 対話式のウィザードを使って、プロジェクトの種類(Vue 2 or Vue 3)、必要な機能(Babel, TypeScript, Router, Vuex, Linterなど)を選択するだけで、適切な構成のプロジェクトディレクトリとファイル群を自動生成します。
  2. 開発サーバー: 高速な開発サーバーを提供します。ホットモジュールリプレースメント (HMR) をサポートしており、コード変更時にブラウザを自動的に更新し、多くの場合アプリケーションの状態を維持します。
  3. プロダクションビルド: デプロイ用に、コードを最適化された静的アセットとしてビルドします。コード分割、ミニファイ、キャッシュバストなどが自動的に行われます。
  4. プラグインシステム: プロジェクトにRouter、Vuex、TypeScript、ESLintなどの機能を追加したり、UIフレームワーク(Vuetify, Element Plusなど)を統合したりするための柔軟なプラグインシステムを持っています。これらの機能はプロジェクト作成時だけでなく、後からいつでも追加できます。
  5. 設定のカスタマイズ: 複雑なWebpack設定などを直接編集することなく、vue.config.js という設定ファイルを通じて、プロジェクトのビルドや開発サーバーの挙動を柔軟にカスタマイズできます。
  6. GUI (Graphical User Interface): CLIだけでなく、ブラウザ上で操作できるGUIツールも提供しています。プロジェクトの作成、プラグイン管理、設定変更、タスク実行などを視覚的に行えます。

これらの機能により、Vue CLIは以下のメリットを開発者にもたらします。

  • 時間と労力の節約: 環境構築にかかる時間を大幅に短縮できます。
  • 標準化: Vue.js開発の標準的なプラクティスに基づいたプロジェクト構成を提供します。
  • 最新技術の恩恵: Webpackなどの設定を意識することなく、コード分割やアセット最適化といったモダンなビルド技術の恩恵を受けられます。
  • 拡張性: プラグインシステムにより、プロジェクトの要件に合わせて機能を追加・変更できます。
  • 保守性: 設定が抽象化されているため、基盤となるツールのアップデート(Webpackのバージョンアップなど)への追従が比較的容易になります。

Vue CLIは、Vue.jsアプリケーション開発を始める上で、もはや欠かせないツールと言えるでしょう。

前提条件:Node.jsとnpm/yarn

Vue CLIを使用するには、まずお使いのコンピューターにNode.js®がインストールされている必要があります。Node.jsは、JavaScriptの実行環境であり、npm (Node Package Manager) というパッケージ管理ツールが同梱されています。多くのフロントエンドツールはnpmを通じてインストール・管理されます。

Node.jsのインストール

Node.jsの公式ウェブサイト (opens new window) から、お使いのOSに合ったインストーラーをダウンロードして実行してください。通常は「推奨版」を選べば問題ありません。

インストールが完了したら、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行して正しくインストールされたか確認してください。

bash
node -v
npm -v

それぞれNode.jsとnpmのバージョンが表示されれば成功です。

yarnのインストール(オプション)

npmの代替として、yarnという別のパッケージ管理ツールも広く利用されています。yarnはnpmよりも高速なインストールや、より信頼性の高い依存関係管理を提供すると言われています。必須ではありませんが、モダンな開発環境ではyarnが好まれることも多いです。

yarnを使用したい場合は、以下のコマンドでグローバルインストールしてください(npmが必要です)。

bash
npm install -g yarn

インストール後、以下のコマンドでバージョンを確認します。

bash
yarn -v

この記事では、主にnpmを使ったコマンドを記述しますが、yarnを使っている場合は適宜 npm installyarn add に、 npm runyarn に読み替えてください。例えば、npm install package-nameyarn add package-name に、npm run serveyarn serve となります。

Vue CLI自体は、npmまたはyarnのどちらかを使ってインストールできます。

推奨されるNode.jsのバージョン

Vue CLIは特定のNode.jsバージョンに依存します。執筆時点では、Node.jsのLTS (Long Term Support) バージョン(例: v14.x, v16.x, v18.x)が推奨されています。最新の機能を利用するには、比較的新しいバージョンを使用することをお勧めします。v8以下の古いバージョンではVue CLI v4以降は動作しません。

もし複数のNode.jsバージョンを使い分ける必要がある場合は、nvm (Node Version Manager) や Volta のようなツールを利用すると便利です。

Vue CLIのインストール

Node.jsとnpm(またはyarn)の準備ができたら、いよいよVue CLIをインストールします。Vue CLIはグローバルにインストールすることで、どのディレクトリからでも vue コマンドを実行できるようになります。

ターミナルを開き、以下のコマンドを実行します。npmを使う場合:

bash
npm install -g @vue/cli

yarnを使う場合:

bash
yarn global add @vue/cli

このコマンドは、Vue CLIの最新バージョンをグローバルにインストールします。インストールには数分かかる場合があります。

インストールの確認

インストールが完了したら、以下のコマンドを実行してVue CLIのバージョンを確認します。

bash
vue --version

または

bash
vue -V

例:

@vue/cli 4.5.15

このようにバージョン情報が表示されれば、Vue CLIのインストールは成功です。これで、新しいVue.jsプロジェクトを作成する準備ができました。

古いバージョンのCLIからの移行 (v3以前)

もし以前にVue CLI v2を使用していた場合、v3以降はパッケージ名が @vue/cli に変更されています。v2 (vue-cli) は非推奨となっているため、新しいプロジェクトでは @vue/cli を使用することを強く推奨します。もし vue-cli がグローバルインストールされている場合は、以下のコマンドでアンインストールできます。

bash
npm uninstall -g vue-cli

または

bash
yarn global remove vue-cli

その後、改めて @vue/cli をインストールしてください。

新しいプロジェクトの作成 (vue create)

Vue CLIのインストールが完了したら、最も頻繁に使用するコマンドである vue create を使って新しいプロジェクトを作成しましょう。

まず、プロジェクトを作成したいディレクトリに移動します。例えば、デスクトップに my-vue-projects というフォルダを作成し、その中にプロジェクトを作成する場合:

bash
cd Desktop
mkdir my-vue-projects
cd my-vue-projects

そして、以下のコマンドを実行します。<project-name> の部分は、作成したいプロジェクトの名前に置き換えてください(例: my-first-vue-app)。

bash
vue create <project-name>

例:

bash
vue create my-first-vue-app

コマンドを実行すると、Vue CLIがプロジェクトのセットアップを開始し、対話式のプロンプトが表示されます。

“`
? Please pick a preset:
Default ([Vue 2] babel, eslint)
Default (Vue 3) ([Vue 3] babel, eslint)

Manually select features
“`

ここで、プロジェクトに含める機能をプリセットから選ぶか、手動で選択するかを決めます。

  • Default ([Vue 2] babel, eslint): Vue 2、Babel (JavaScriptトランスパイラ)、ESLint (コード品質・スタイルチェック) が含まれる最小限の構成です。手軽に始めたい場合に適しています。
  • Default (Vue 3): 上記のVue 3版です。Composition APIなどVue 3の機能を使いたい場合はこちらを選びます。
  • Manually select features: Babel, TypeScript, PWA, Router, Vuex, CSS Pre-processors, Linter/Formatter, Unit Testing, E2E Testing など、必要な機能を細かく選択できます。本格的なアプリケーション開発では、この「手動選択」を選ぶことが多いです。

今回は、モダンな開発環境を構築する目的で、Manually select features を選択してみましょう。上下矢印キーで選択し、Enterキーを押します。

手動設定 (Manually select features) の詳細

「Manually select features」を選択すると、次にプロジェクトに含める機能を選択するプロンプトが表示されます。スペースキーで選択/解除し、Enterキーで確定します。

“`
? Check the features needed for your project: (Press to select, to toggle all, to invert selection)

( ) Babel
( ) TypeScript
( ) Progressive Web App (PWA) Support
( ) Router
( ) Vuex
( ) CSS Pre-processors
( ) Linter / Formatter
( ) Unit Testing
( ) End-to-End Testing
“`

ここでは、それぞれの機能が何を提供してくれるのかを理解することが重要です。

  • Babel: 最新のJavaScript (ES Next) 構文やJSXなどを、より多くのブラウザで動作するES5などの構文に変換(トランスパイル)するために必要です。通常は必須です。
  • TypeScript: JavaScriptに静的型付けを導入します。大規模なアプリケーションやチーム開発で、コードの可読性、保守性、エラー早期発見に貢献します。TypeScriptで開発したい場合に選択します。
  • Progressive Web App (PWA) Support: アプリケーションをPWAとして機能させるための設定やService Workerを追加します。オフラインでの動作や、ネイティブアプリのようにホーム画面に追加できる機能などを実現できます。
  • Router: シングルページアプリケーション (SPA) における画面遷移を管理するためのVue Routerライブラリを導入します。URLパスに応じて表示するコンポーネントを切り替えたり、ブラウザの履歴管理を行ったりします。SPA開発ではほぼ必須です。
  • Vuex: アプリケーション全体で共有する状態(データ)を管理するためのVuexライブラリを導入します。複数のコンポーネント間でデータをやり取りする場合や、アプリケーションの状態が一元的に管理されている方が都合が良い場合に役立ちます。大規模なアプリケーションで特に有用です。
  • CSS Pre-processors: Sass, Less, StylusといったCSSプリプロセッサーを使えるように設定します。変数、ネスト、ミックスインなどの機能を使って、CSS記述を効率化・構造化できます。
  • Linter / Formatter: コードの品質を維持し、コードスタイルを統一するためのESLintやPrettierといったツールを導入します。文法エラーや怪しいコードを指摘したり、コードを自動整形したりしてくれます。チーム開発では特に重要です。
  • Unit Testing: コンポーネントや特定の関数の単体テストを行うためのフレームワーク(JestまたはMocha)と、VueコンポーネントをテストするためのVue Test Utilsを導入します。
  • End-to-End Testing: アプリケーション全体がユーザーの操作通りに機能するかをテストするためのフレームワーク(CypressまたはNightwatch)を導入します。

今回は、一般的なモダンVue.jsアプリケーション開発でよく使われる機能として、以下のものを選択してみましょう。

  • (x) Babel
  • ( ) TypeScript (今回はJavaScriptで進めますが、必要に応じて選択してください)
  • ( ) Progressive Web App (PWA) Support (今回は含めません)
  • (x) Router
  • (x) Vuex
  • (x) CSS Pre-processors
  • (x) Linter / Formatter
  • ( ) Unit Testing (今回は含めません)
  • ( ) End-to-End Testing (今回は含めません)

選択したらEnterキーを押します。

次に、Vueのバージョンを選択します。

“`
? Choose a version of Vue.js to install:

3.x
2.x
“`

Vue 3はVue.jsの最新メジャーバージョンであり、パフォーマンスの向上や新しいComposition APIなど多くの改善が含まれています。特別な理由がない限り、3.x を選択するのが良いでしょう。

次に、Routerの履歴モードを選択します。

? Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n)

  • Y を選択すると、ブラウザのHistory APIを使用した履歴モード (/path/to/page) になります。URLがクリーンで、SPAらしい見た目になります。ただし、ページを直接リロードしたりブックマークしたりした場合に、サーバー側で適切なフォールバック設定(存在しないパスへのリクエストを index.html にリダイレクトする設定)が必要です。
  • n を選択すると、ハッシュモード (/#/path/to/page) になります。サーバー設定は不要ですが、URLに # が含まれます。

多くの場合、URLをクリーンに保ちたいので Y を選択することが多いですが、今回はサーバー設定の手間を省くため、あるいはシンプルさを優先するため n を選択しても構いません。ここでは Y を選択してみましょう。

次に、CSSプリプロセッサーを選択します。

“`
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default):

Less
Sass/SCSS (with dart-sass)
Stylus
“`

好きなプリプロセッサーを選択してください。最も広く使われているのは Sass/SCSS です。

次に、Linter/Formatterの設定を選択します。

“`
? Pick a linter / formatter config:
ESLint with error prevention only
ESLint + Airbnb config
ESLint + Standard config

ESLint + Prettier
“`

  • ESLint with error prevention only: 文法エラーなど、問題を引き起こす可能性のあるコードだけをチェックします。
  • ESLint + Airbnb config: Airbnbの厳格なJavaScriptスタイルガイドに基づいた設定です。非常に厳格です。
  • ESLint + Standard config: JavaScript Standard Style に基づいた設定です。セミコロンを使わないスタイルなどが特徴です。
  • ESLint + Prettier: ESLintでコード品質をチェックし、Prettierでコードフォーマット(インデント、引用符など)を自動的に行います。ESLintとPrettierを連携させることで、コード品質とスタイルの両方を維持できます。最も人気のある組み合わせです。

ここでは、コードフォーマットも自動で行ってくれる ESLint + Prettier を選択するのがおすすめです。

次に、Linter/Formatterをいつ実行するかを選択します。

“`
? Pick additional lint features: (Press to select,
to toggle all, to invert selection)

(*) Lint on save
( ) Lint and fix on commit
“`

  • Lint on save: ファイルを保存するたびにLinter/Formatterを実行します。開発中にリアルタイムでフィードバックが得られるため便利です。
  • Lint and fix on commit: Gitコミット時にLintとフォーマットを実行します。コミットされるコードが常にきれいであることを保証できます。これは lint-staged と husky を使用して実現されます。

両方選択することも可能ですが、まずは Lint on save だけを選択するのが一般的です。

最後に、これらの設定を今後のプロジェクトのためにプリセットとして保存するか聞かれます。

? Save this as a preset for future projects? (y/N)

もし今回行った設定をよく使うようであれば、y を選択して名前をつけて保存しておくと、次回 vue create 時にそのプリセットを選択するだけで同じ構成のプロジェクトをすぐに作成できます。今回は初めてなので n を選択しても構いません。

これで、必要な機能の選択は完了です。Enterキーを押すと、Vue CLIがプロジェクトディレクトリの作成、選択した機能に基づいた設定ファイルの生成、および必要なnpmパッケージのインストールを開始します。

このプロセスには数分かかることがあります。特に、依存関係のインストールはネットワーク環境に依存します。

インストールが完了すると、以下のようなメッセージが表示されます。

“`
🎉 Successfully created project my-first-vue-app.
👉 Get started with the following commands:

$ cd my-first-vue-app
$ npm install # 如果您使用的是 yarn,运行 yarn
$ npm run serve
“`

(メッセージの内容は多少異なる場合があります)

これで、Vue CLIを使った新しいプロジェクトの作成が完了しました!

プロジェクトのディレクトリ構造

作成されたプロジェクトディレクトリ (my-first-vue-app) の中身を見てみましょう。

my-first-vue-app/
├── node_modules/ # プロジェクトの依存関係がインストールされるディレクトリ
├── public/ # 静的なアセットを配置するディレクトリ
│ ├── favicon.ico # アプリケーションのファビコン
│ └── index.html # アプリケーションのエントリーポイントとなるHTMLテンプレート
├── src/ # ソースコードディレクトリ
│ ├── assets/ # 静的なアセット(画像、フォントなど)
│ ├── components/ # 再利用可能なVueコンポーネント
│ ├── router/ # Vue Routerの設定ファイル (Routerを選択した場合)
│ │ └── index.js
│ ├── store/ # Vuexストアの設定ファイル (Vuexを選択した場合)
│ │ └── index.js
│ ├── App.vue # ルートコンポーネント
│ └── main.js # アプリケーションのエントリーポイント(Vueインスタンス生成など)
├── .gitignore # Gitの管理対象から外すファイル・ディレクトリを指定
├── babel.config.js # Babelの設定ファイル (Babelを選択した場合)
├── .eslintrc.js # ESLintの設定ファイル (Linterを選択した場合)
├── package.json # プロジェクト情報、依存関係、スクリプトなどが記述されたファイル
├── README.md # プロジェクトの説明
└── vue.config.js # Vue CLIの設定をカスタマイズするためのファイル(後述)

これがVue CLIによって生成された標準的なプロジェクト構造です。各ディレクトリやファイルには重要な役割があります。

  • node_modules/: プロジェクトが依存するライブラリやツールがnpm (またはyarn) によってインストールされる場所です。このディレクトリはGit管理の対象外とします(.gitignore に含まれています)。
  • public/: Webpackによる処理を経ずに、そのまま出力ディレクトリ(デフォルトでは dist)にコピーされる静的なファイル群です。index.html はアプリケーションの骨組みとなるHTMLファイルです。ビルド時にVue CLIによって生成されたスクリプトやスタイルシートがここに注入されます。
  • src/: アプリケーションの主要なソースコードを配置するディレクトリです。
    • assets/: 画像、フォント、スタイルシートなど、Webpackによるアセット処理が必要な静的ファイルを置きます。
    • components/: 再利用可能なVueコンポーネントを置きます。
    • router/: Vue Routerの設定を行います。index.js にルーティングルールを記述します。
    • store/: Vuexストアの設定を行います。index.js に状態、ミューテーション、アクションなどを定義します。
    • App.vue: アプリケーションのルートコンポーネントです。通常、このコンポーネント内に他のコンポーネントを配置したり、<router-view> を置いてルーティングされたコンポーネントを表示したりします。
    • main.js: アプリケーションのエントリーポイントです。ここでVueアプリケーションインスタンスを生成し、ルートコンポーネント (App.vue) をマウントしたり、RouterやVuexストアを登録したりします。
  • .gitignore: Gitが無視するファイルやディレクトリを指定します。node_modules/ やビルド出力ディレクトリ (dist/) などが含まれます。
  • babel.config.js: Babelの設定ファイルです。選択したプリセットやプラグインに基づいた設定が含まれます。
  • .eslintrc.js: ESLintの設定ファイルです。コード品質やスタイルに関するルールが記述されています。
  • package.json: プロジェクトのメタ情報(名前、バージョン、説明など)、依存関係(dependencies, devDependencies)、およびスクリプト(開発サーバー起動、ビルド、Lint実行など)が定義されています。
  • README.md: プロジェクトの説明を記述するファイルです。
  • vue.config.js: Vue CLIのビルド設定などをカスタマイズするためのオプションファイルです。デフォルトでは存在しませんが、カスタマイズが必要な場合にルートディレクトリに作成します。

この構造を理解することは、Vue CLIプロジェクトで効率的に開発を進める上で非常に重要です。

開発サーバーの起動 (npm run serve)

プロジェクトが作成され、依存関係のインストールも完了しました。いよいよ開発サーバーを起動して、ブラウザでアプリケーションを表示してみましょう。

まず、作成したプロジェクトディレクトリに移動します。

bash
cd my-first-vue-app

そして、以下のコマンドを実行します。

bash
npm run serve

yarnを使う場合:

bash
yarn serve

このコマンドは、package.jsonscripts セクションに定義されている serve スクリプトを実行します。Vue CLIが提供する開発サーバーが起動し、ソースコードをビルドして提供します。

コマンド実行後、以下のような出力が表示されます。

“`
DONE Compiled successfully in 3179ms

App running at:
– Local: http://localhost:8080/
– Network: http://192.168.1.100:8080/

Note: the development build is not optimized.
To create a production build, run npm run build.
“`

(出力されるIPアドレスやポート番号は環境によって異なる場合があります)

この出力は、開発サーバーが正常に起動し、アプリケーションが http://localhost:8080/ でアクセス可能であることを示しています。ブラウザを開き、このURLにアクセスしてみてください。

Vue CLIによって生成されたデフォルトのVue.jsアプリケーションの画面が表示されるはずです。

ホットモジュールリプレースメント (HMR)

開発サーバーの大きな利点は、ホットモジュールリプレースメント (HMR) です。開発中にソースコード(.vue ファイル、.js ファイル、.css ファイルなど)を変更して保存すると、開発サーバーがそれを検知し、自動的に変更部分だけをブラウザに反映させます。ページの完全なリロードではなく、アプリケーションの状態を維持したままモジュール単位で更新されるため、開発効率が格段に向上します。

例えば、src/components/HelloWorld.vue<template> 部分を少し変更して保存してみてください。ブラウザの表示がすぐに更新されるのが確認できるはずです。

開発サーバーを停止するには、ターミナルで Ctrl + C を押します。

プロジェクトの構造と基本的なファイルの役割

開発サーバーを起動してアプリケーションを表示できましたが、ソースコードの各ファイルがどのような役割を果たしているのか、さらに詳しく見ていきましょう。

主要なファイルは src ディレクトリ以下にあります。

src/main.js:エントリーポイント

このファイルはアプリケーションの起動点です。Vueアプリケーションインスタンスが作成され、設定が行われます。

“`javascript
import { createApp } from ‘vue’ // Vue 3の場合
// import Vue from ‘vue’ // Vue 2の場合
import App from ‘./App.vue’
import router from ‘./router’ // Routerを選択した場合
import store from ‘./store’ // Vuexを選択した場合
import ‘./assets/base.css’ // CSSプリプロセッサーやCSSファイルをインポートすることも可能

// Vue 3
createApp(App).use(store).use(router).mount(‘#app’)

/*
// Vue 2
Vue.config.productionTip = false

new Vue({
router,
store,
render: h => h(App)
}).$mount(‘#app’)
*/
“`

  • import { createApp } from 'vue' (Vue 3) または import Vue from 'vue' (Vue 2): Vueライブラリ自体をインポートします。
  • import App from './App.vue': ルートコンポーネントである App.vue をインポートします。
  • import router from './router': Routerを選択した場合、Routerの設定ファイル (src/router/index.js) をインポートします。
  • import store from './store': Vuexを選択した場合、Vuexストアの設定ファイル (src/store/index.js) をインポートします。
  • createApp(App) (Vue 3): ルートコンポーネント (App) を引数に、新しいVueアプリケーションインスタンスを作成します。Vue 3ではアプリケーションインスタンスが新しく導入されました。
  • .use(store), .use(router): 作成したアプリケーションインスタンスに、VuexストアやVue Routerをプラグインとして登録します。これにより、アプリケーション全体で $store$router を使えるようになります。
  • .mount('#app'): アプリケーションを、HTMLファイル (public/index.html) 内のセレクター #app に指定された要素にマウント(描画)します。
  • new Vue(...) (Vue 2): Vue 2では、new Vue コンストラクタを使ってルートVueインスタンスを作成します。
  • render: h => h(App) (Vue 2): ルートインスタンスの render オプションで、レンダリング関数を使って App コンポーネントを描画することを指定します。
  • .$mount('#app') (Vue 2): 作成したインスタンスを #app 要素にマウントします。

簡単に言えば、main.js は「App.vue をルートコンポーネントとして、RouterとVuexを使って、HTMLの #app 要素の中にVueアプリケーションを起動する」という処理を行っています。

public/index.html:HTMLテンプレート

このファイルは、アプリケーションの「入れ物」となるHTMLテンプレートです。開発サーバーやビルドプロセスによって、ここにJavaScriptやCSSファイルが自動的に注入されます。

“`html






// ここにVueアプリケーションがマウントされる


“`

重要なのは <div id="app"></div> です。main.js.mount('#app') と指定した要素がこれです。Vueアプリケーションの全てのコンテンツはこの要素の中に描画されます。

また、<link rel="icon" href="<%= BASE_URL %>favicon.ico"><title><%= htmlWebpackPlugin.options.title %></title> のように、特別な記法 (<%= ... %>) が使われています。これらはHTMLWebpackPluginというWebpackプラグインによって処理され、package.jsonvue.config.js で定義された値に置き換えられたり、ビルドされたアセットへのパスが挿入されたりします。

public ディレクトリに置かれたファイルは、特に設定しない限り、ビルド出力ディレクトリのルートにコピーされます。

src/App.vue:ルートコンポーネント

App.vue はアプリケーションのルートコンポーネントです。通常、アプリケーション全体のレイアウトを定義したり、ナビゲーションバーやフッターなど、全てのページに共通する要素を配置したりします。

Routerを使用している場合は、ページごとに内容が変わる部分に <router-view/> タグを配置します。このタグの位置に、現在のURLに対応するコンポーネントが描画されます。

App.vue は単一ファイルコンポーネント (SFC) の形式で記述されています。SFCについては後述します。

.vue ファイル (単一ファイルコンポーネント – SFC)

Vue CLIプロジェクトにおけるほとんどのコンポーネントは .vue ファイルとして記述されます。これはVueの単一ファイルコンポーネント (SFC) 形式です。一つのファイルの中に、コンポーネントのテンプレート、スクリプト(JavaScript/TypeScript)、スタイル(CSS/SCSS/Lessなど)をまとめて記述できます。

“`vue

“`

  • <template>: コンポーネントのHTML構造を記述します。Vueのテンプレート構文(ディレクティブ、データバインディングなど)を使用できます。
  • <script>: コンポーネントのJavaScriptロジックを記述します。export default {} の中に、コンポーネントのデータ、メソッド、算出プロパティ、ライフサイクルフックなどを定義します。
  • <style>: コンポーネントのCSSスタイルを記述します。

<style> タグに scoped 属性を付けると、そのスタイルは現在のコンポーネントにのみ適用されるようになります。これにより、異なるコンポーネント間でスタイルが衝突するのを防ぐことができます。Vue CLIはこれらを適切に処理(CSS Modulesなど)してくれます。

CSSプリプロセッサーを選択した場合、<style lang="scss">, <style lang="less">, <style lang="stylus"> のように lang 属性を指定することで、それぞれの言語でスタイルを記述できます。

SFCは、Webpackの vue-loader というローダーによって、ブラウザが理解できるJavaScript、HTML、CSSに分割されて処理されます。Vue CLIはこれらの設定を自動で行ってくれます。

src/router/index.js:Vue Router設定

Routerを選択した場合に生成されるファイルです。アプリケーションのルーティング設定を定義します。

“`javascript
import { createRouter, createWebHistory } from ‘vue-router’ // Vue 3の場合
// import Vue from ‘vue’ // Vue 2の場合
// import Router from ‘vue-router’ // Vue 2の場合
import HomeView from ‘../views/HomeView.vue’ // src/views/HomeView.vue をインポート

// Vue 2
// Vue.use(Router)

const routes = [
{
path: ‘/’, // パスが ‘/’ の場合
name: ‘home’, // ルート名
component: HomeView // このコンポーネントを表示する
},
{
path: ‘/about’, // パスが ‘/about’ の場合
name: ‘about’,
// route level code-splitting
// this produces a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/ webpackChunkName: “about” / ‘../views/AboutView.vue’)
// 上記はコード分割(遅延ロード)の設定例。/about にアクセスされた時に初めてAboutView.vueをロードする
}
]

// Vue 3
const router = createRouter({
history: createWebHistory(process.env.BASE_URL), // 履歴モード (history mode)
routes // 上記で定義したルーティングルール
})

/
// Vue 2
const router = new Router({
mode: ‘history’, // historyモード または ‘hash’ モード
base: process.env.BASE_URL,
routes
})
/

export default router
“`

  • import ... from 'vue-router': Vue Routerライブラリをインポートします。Vue 3では createRoutercreateWebHistory (または createWebHashHistory) を使います。Vue 2では Vue.use(Router) とします。
  • import ... from '../views/...': 各ルートに対応するコンポーネントをインポートします。
  • routes: ルーティングルールを定義した配列です。各オブジェクトは一つのルートを表します。
    • path: ブラウザのURLパスです。
    • name: そのルートに名前を付けることができます。ナビゲーションなどで便利です。
    • component: そのパスにアクセスされたときに表示するコンポーネントを指定します。import(...) を使うと、そのコンポーネントのコードが別のJavaScriptファイルに分割され、必要になったときに遅延ロードされるようになります (Code Splitting)。
  • createRouter({...}) (Vue 3) または new Router({...}) (Vue 2): Routerインスタンスを作成します。
    • history: createWebHistory(process.env.BASE_URL) (Vue 3) または mode: 'history' (Vue 2): 履歴モード (history または hash) を設定します。process.env.BASE_URL はVue CLIが設定する環境変数で、アプリケーションがサブディレクトリに配置される場合などに使用されます。
    • routes: 定義したルーティングルールを渡します。
  • export default router: 作成したRouterインスタンスを main.js でインポートできるようにエクスポートします。

src/store/index.js:Vuexストア設定

Vuexを選択した場合に生成されるファイルです。アプリケーションの状態管理を行うストアを定義します。

“`javascript
import { createStore } from ‘vuex’ // Vue 3の場合
// import Vue from ‘vue’ // Vue 2の場合
// import Vuex from ‘vuex’ // Vue 2の場合

// Vue 2
// Vue.use(Vuex)

export default createStore({ // Vue 3
// export default new Vuex.Store({ // Vue 2
state: { // アプリケーションの状態(データ)
count: 0
},
getters: { // stateから算出される値
doubleCount(state) {
return state.count * 2
}
},
mutations: { // stateを変更するための唯一の方法(同期処理)
increment(state, payload = 1) { // payloadは省略可能
state.count += payload
}
},
actions: { // 非同期処理を含む、stateを変更するための方法(mutationsをコミットする)
incrementAsync({ commit }, payload = 1) {
setTimeout(() => {
commit(‘increment’, payload)
}, 1000)
}
},
modules: { // ストアが大規模になった場合に分割するためのオプション
}
})
“`

  • import { createStore } from 'vuex' (Vue 3) または import Vuex from 'vuex' (Vue 2): Vuexライブラリをインポートします。
  • Vue.use(Vuex) (Vue 2): VueにVuexをプラグインとして登録します。
  • createStore({...}) (Vue 3) または new Vuex.Store({...}) (Vue 2): Vuexストアインスタンスを作成します。
    • state: アプリケーション全体で共有されるデータです。リアクティブなオブジェクトである必要があります。
    • getters: stateから派生した値を算出するためのプロパティです。コンポーネントの算出プロパティ (computed) のストア版と考えられます。キャッシュされます。
    • mutations: stateを変更するための関数群です。stateを変更できるのはmutationsだけ です。ミューテーションは同期的に実行される必要があります。コンポーネントからは store.commit('mutationName', payload) のように呼び出します。
    • actions: stateを変更するための関数群ですが、非同期処理を含むことができます。mutationをコミットすることでstateを変更します。コンポーネントからは store.dispatch('actionName', payload) のように呼び出します。
    • modules: ストアが大きくなった場合に、モジュールに分割して管理できます。
  • export default ...: 作成したストアインスタンスを main.js でインポートできるようにエクスポートします。

これらのファイルは、RouterやVuexを選択した場合に自動生成され、それぞれの機能の中核を担います。これらのファイルを理解し、適切に修正・拡張していくことが、Vue CLIプロジェクトでの開発の基本となります。

Vue CLIの機能詳解

Vue CLIは、プロジェクトの骨組み作成だけでなく、開発プロセス全体をサポートするための多くの強力な機能を備えています。ここでは、特に重要な機能である「プラグイン」「設定のカスタマイズ」「プロダクションビルド」「GUI」について詳しく見ていきましょう。

Plugins

Vue CLIの中心的な設計思想の一つに「プラグインシステム」があります。これにより、コア機能をシンプルに保ちつつ、様々な機能を必要に応じてプロジェクトに追加したり、カスタマイズしたりできます。

Vue CLIのプラグインは、プロジェクトの依存関係をインストールするだけでなく、Babel, Webpack, ESLintなどのツールチェーンに対して設定を注入したり、新しいコマンド (vue-cli-service test:unit のような) を登録したりする役割を担います。

プロジェクト作成時に選択した機能(Router, Vuex, TypeScript, ESLintなど)は、実は Vue CLIの公式プラグインとして実装されています(例: @vue/cli-plugin-router, @vue/cli-plugin-vuex)。

既存プロジェクトへのプラグイン追加 (vue add)

プロジェクト作成後に、新しい機能を追加したくなることもあります。例えば、最初はRouterなしで始めたが、途中で画面遷移が必要になった場合などです。このような場合、vue add コマンドを使用します。

vue add コマンドは、指定されたVue CLIプラグインをインストールし、そのプラグインが必要とする設定(依存関係の追加、設定ファイルの変更・作成など)をプロジェクトに適用します。

例:既存のプロジェクトにVue Routerを追加する場合

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

コマンドを実行すると、Routerプラグインがインストールされ、Routerに関する設定やファイル(src/router/index.js, src/views/AboutView.vue など)がプロジェクトに追加されます。途中、Routerモードの選択などの対話式プロンプトが表示されることもあります。

例:既存のプロジェクトにVuexストアを追加する場合

bash
vue add vuex

例:Vuetify (UIフレームワーク) を追加する場合

bash
vue add vuetify

vue add コマンドは、 @vue/cli-plugin- で始まる公式プラグインだけでなく、サードパーティ製のVue CLIプラグインにも対応しています。例えば、人気のあるUIフレームワークであるVuetifyやElement Plusなども、Vue CLIプラグインとして提供されており、vue add vuetifyvue add element-plus のように簡単に追加できます。

vue add <plugin-name> を実行すると、Vue CLIは自動的に @vue/cli-plugin-<plugin-name> または vue-cli-plugin-<plugin-name> という名前のパッケージを探し、インストールして実行します。したがって、公式プラグインの場合は <plugin-name> だけで済み、サードパーティ製の場合はパッケージ名全体を指定する必要がある場合が多いです。

インストールされているプラグインの確認

プロジェクトにインストールされているプラグインは、package.jsondevDependencies を見ると確認できます。 @vue/cli-plugin- で始まるパッケージや、vue-cli-plugin- で始まるパッケージがそれにあたります。

Presets

プロジェクト作成時に手動選択した一連の機能設定は、将来のプロジェクトで再利用するためにプリセットとして保存できます。

プロジェクト作成ウィザードの最後に「Save this as a preset for future projects?」と聞かれた際に y を選択すると、その設定に名前をつけて保存できます。

保存されたプリセットは、ホームディレクトリの .vuerc ファイルに JSON 形式で保存されます。

json
{
"latestVersion": "4.5.15",
"useTaobaoRegistry": false,
"packageManager": "npm",
"presets": {
"my-awesome-preset": { // ここがプリセット名
"useConfigFiles": true,
"cssPreprocessor": "sass",
"plugins": {
"@vue/cli-plugin-babel": {},
"@vue/cli-plugin-router": {
"historyMode": true
},
"@vue/cli-plugin-vuex": {},
"@vue/cli-plugin-eslint": {
"config": "prettier",
"lintOn": [
"save"
]
}
}
}
}
}

次回 vue create コマンドを実行した際に、プリセット選択のオプションとして保存したプリセットが表示されるようになります。これにより、毎回手動で機能を選択する手間を省き、チームや個人の開発スタイルに合わせた環境を素早く構築できます。

保存したプリセットは .vuerc ファイルを直接編集することで管理することも可能です。

Configuring Vue CLI (vue.config.js)

Vue CLIは、基盤となるWebpackなどの設定をほとんど抽象化してくれますが、デフォルトの設定では対応できない特定の要件がある場合があります。このような場合、プロジェクトのルートディレクトリに vue.config.js というファイルを作成して、Vue CLIの内部設定をカスタマイズできます。

vue.config.js は CommonJS モジュールとしてエクスポートされる JavaScript ファイルで、様々なオプションを指定できます。

“`javascript
// vue.config.js
module.exports = {
// プロジェクトをサブディレクトリにデプロイする場合のパス
// publicPath: process.env.NODE_ENV === ‘production’
// ? ‘/my-app/’
// : ‘/’,

// ビルド出力先ディレクトリ (デフォルト: dist)
// outputDir: ‘dist’,

// assetsDir: ‘assets’, // 生成される静的アセットを配置するディレクトリ

// index.html の出力先 (デフォルト: index.html)
// indexPath: ‘index.html’,

// ファイル名にハッシュを含めるか (キャッシュ対策)
// filenameHashing: true,

// ESLint を保存時に実行するか
// lintOnSave: process.env.NODE_ENV !== ‘production’,

// ランタイム + コンパイラビルドを含めるか
// runtimeCompiler: false,

// Webpack の設定をカスタマイズする
configureWebpack: {
// resolve.alias など、Webpack の設定オブジェクトを直接記述
resolve: {
alias: {
‘@’: require(‘path’).resolve(__dirname, ‘src/’)
}
}
// または関数でカスタマイズ
// configureWebpack: config => {
// if (process.env.NODE_ENV === ‘production’) {
// // 本番環境向けの最適化などをここで行う
// } else {
// // 開発環境向けの設定
// }
// }
},

// Webpack-chain API を使って設定をより細かくカスタマイズ
// chainWebpack: config => {
// config.module
// .rule(‘vue’)
// .use(‘vue-loader’)
// .loader(‘vue-loader’)
// .tap(options => {
// // options を変更する
// return options
// })
// },

// 開発サーバーの設定
devServer: {
// port: 8080,
// open: true, // サーバー起動時にブラウザを自動で開くか
// proxy: { // APIサーバーへのリクエストをプロキシする場合
// ‘/api’: {
// target: ‘http://localhost:3000’,
// ws: true,
// changeOrigin: true
// }
// }
},

// PWA プラグインの設定
// pwa: {
// name: ‘My Vue App’,
// themeColor: ‘#4DBA87’,
// msTileColor: ‘#000000’,
// appleMobileWebAppCapable: ‘yes’,
// appleMobileWebAppStatusBarStyle: ‘black’,
// // workboxOptions など
// },

// その他のプラグインオプション
// pluginOptions: {
// // …
// }
}
“`

いくつか代表的な設定オプションを説明します。

  • publicPath: アプリケーションがサブディレクトリ(例: https://my-site.com/my-app/)にデプロイされる場合、ここでそのパスを指定します。静的アセットへの参照パスがこれに基づいて調整されます。デフォルトは / です。
  • outputDir: ビルド出力先のディレクトリ名を変更できます。デフォルトは dist です。
  • assetsDir: 生成される画像やフォントなどの静的アセットを、outputDir の中のどのディレクトリに配置するかを指定します。デフォルトは空文字列(outputDir の直下)です。
  • indexPath: public/index.html を出力する際のファイル名を変更できます。デフォルトは index.html です。
  • filenameHashing: ビルドされた静的アセットのファイル名にキャッシュ無効化のためのハッシュ (app.a7f34f.js) を含めるかどうかを設定します。本番ビルドでは true にするのが一般的です。
  • lintOnSave: 保存時にESLintを実行するかを設定します。true (Lintエラー/警告をコンソールに表示), false (無効), "default" (設定による), "warning" (警告のみコンソールに表示し、エラーは表示しない), true | warning (開発環境でのみ有効) といった値を指定できます。
  • runtimeCompiler: Vueテンプレートをランタイムでコンパイルする機能を含めるかどうかを設定します。デフォルトは false です。実行時に文字列テンプレートをコンパイルする必要がある場合(例えば、CDNからVueをロードして、<template> オプションに文字列でテンプレートを指定する場合)は true に設定しますが、通常はSFCを使用するため false で問題ありません。false の場合、テンプレートはビルド時に事前にコンパイルされるため、ビルドサイズが小さくなります。
  • configureWebpack: Webpackの設定オブジェクトをマージしたり、関数として受け取って直接変更したりできます。ここで resolve.alias を設定して、src ディレクトリへのエイリアス @ を定義していることが多いです(これはVue CLIのデフォルト設定にも含まれています)。
  • chainWebpack: Webpackの設定を、より細かく、破壊的でない方法で変更するための Webpack-chain API を使用できます。特定のローダーやプラグインの設定を変更するのに便利です。
  • devServer: 開発サーバーの挙動をカスタマイズできます。ポート番号、自動ブラウザ起動、APIサーバーへのプロキシ設定など、様々なオプションがあります。特に proxy 設定は、フロントエンドの開発サーバーとバックエンドのAPIサーバーが異なるオリジン(ドメイン、ポート)で動いている場合に、クロスオリジン問題を回避するために非常に役立ちます。

これらのオプションを vue.config.js に記述することで、Vue CLIのデフォルト設定を上書きし、プロジェクト固有の要件に合わせたビルドプロセスや開発サーバーの挙動を実現できます。

Build for Production (npm run build)

アプリケーションの開発が完了し、本番環境にデプロイする準備ができたら、npm run build コマンドを実行します。

bash
npm run build

yarnを使う場合:

bash
yarn build

このコマンドも package.jsonscripts に定義されています。Vue CLIのビルドプロセスが実行され、ソースコードが本番環境向けに最適化されて出力されます。

ビルドプロセスで行われる主な最適化は以下の通りです。

  • バンドル: アプリケーションの全コードと依存関係を複数のJavaScriptファイルにまとめます。
  • トランスパイル: Babelなどを使って、異なるブラウザで互換性のあるJavaScriptコードに変換します。
  • ミニファイ (Minification): JavaScript, CSS, HTMLコードから不要な空白やコメントを取り除き、変数名を短縮するなどしてファイルサイズを最小化します。
  • ツリーシェイキング (Tree Shaking): 使用されていないコードを最終的なバンドルから除去します。
  • コード分割 (Code Splitting): ルーティングされたコンポーネントなどを、アクセスされたときに遅延ロードされる別のチャンクに分割します。
  • アセットの最適化: 画像圧縮などを行います。
  • キャッシュ無効化: デフォルトで、ビルドされたファイルのファイル名にコンテンツベースのハッシュを含めます (app.a7f34f.js)。これにより、ファイル内容が変更されない限りブラウザキャッシュが利用され、変更されたファイルだけがダウンロードされるようになります。

ビルドが完了すると、デフォルトではプロジェクトルートに dist ディレクトリが生成されます。この dist ディレクトリの中身が、デプロイすべき静的アセット群です。

dist/
├── css/
│ └── app.xxxxx.css
├── js/
│ ├── app.xxxxx.js
│ ├── chunk-vendors.xxxxx.js
│ └── about.xxxxx.js (コード分割されたチャンク)
├── img/ (src/assets/images など)
├── fonts/ (src/assets/fonts など)
└── index.html

dist ディレクトリには、最適化されたHTML (index.html)、CSS、JavaScriptファイル、およびその他の静的アセットが含まれています。このディレクトリ全体を、Nginx, Apache, Surge, Netlify, Vercel, GitHub Pagesなどの静的サイトホスティングサービスにアップロードすれば、アプリケーションを公開できます。

履歴モード (history mode) を使用している場合は、サーバー側で適切なフォールバック設定が必要になることを忘れないでください(存在しないパスへのリクエストを index.html にリダイレクトする設定)。

npm run build --report のように --report フラグを付けてビルドを実行すると、ビルドされたファイルのサイズや構成を可視化するインタラクティブなレポートHTMLファイルを生成できます。これにより、アプリケーションのビルドサイズを分析し、最適化のボトルネックを見つけるのに役立ちます。

Vue UI (Graphical User Interface)

Vue CLIはコマンドラインインターフェイスだけでなく、ブラウザ上で操作できるGUIツールも提供しています。これは特にGUIを好むユーザーや、CLIコマンドに慣れていない場合に便利です。

Vue UIを起動するには、プロジェクトのルートディレクトリで以下のコマンドを実行します。

bash
vue ui

コマンドを実行すると、ブラウザが自動的に開き、Vueプロジェクトマネージャーの画面が表示されます。

GUIでは以下の操作が可能です。

  • プロジェクトの作成: vue create と同様に、対話式のウィザードを通じて新しいプロジェクトを作成できます。
  • プロジェクトのインポート: 既存のVue CLIプロジェクトをGUIにインポートして管理できます。
  • プロジェクトの管理: インポートしたプロジェクトの一覧が表示され、プロジェクトを選択して詳細を確認したり、設定を変更したりできます。
  • プラグイン: プロジェクトにインストールされているVue CLIプラグインの一覧が表示され、新しいプラグインを検索・追加したり、既存のプラグインを削除したりできます。
  • 依存関係: プロジェクトの依存関係(npmパッケージ)を管理できます。新しいパッケージのインストール、既存パッケージのアップデートや削除などを行えます。
  • 設定: vue.config.js で設定できる様々なオプションをGUI上で変更できます。Webpackの設定、CSSプリプロセッサー、ESLintルールなどを視覚的に編集できます。
  • タスク: package.jsonscripts に定義されているコマンド(serve, build, lint など)をGUI上から実行できます。各タスクの実行状況や出力、統計情報を確認できます。

Vue UIは、特にプロジェクトの初期設定、プラグインの追加、依存関係の管理、設定の調整、タスクの実行といった場面で非常に直感的で便利です。CLI操作に自信がない場合や、プロジェクトの全体像を視覚的に把握したい場合に活用すると良いでしょう。

開発のヒントとベストプラクティス

Vue CLIを使ったプロジェクトでの開発をさらに効率的に進めるためのヒントや、一般的なベストプラクティスをいくつか紹介します。

1. コンポーネントの分割と再利用

Vue.js開発の基本はコンポーネントベースです。UIを小さく再利用可能な部品に分割することで、コードの保守性が高まり、開発効率も向上します。

  • 単一責任の原則: 一つのコンポーネントは一つのことだけを行うように設計します。
  • 親子関係: コンポーネントは親子関係を持ち、データは親から子へ Props で渡し、子から親へはイベント ($emit) で伝えます。
  • 共通コンポーネント: アプリケーション全体で繰り返し使用されるUI要素(ボタン、モーダル、入力フォームなど)は、src/components ディレクトリに共通コンポーネントとして定義し、再利用します。
  • ページコンポーネント: Routerを使用する場合、各ルートに対応するコンポーネントは、通常 src/views (または src/pages) ディレクトリに配置します。これらのコンポーネントは、他の共通コンポーネントを組み合わせてページを構成する役割を担うことが多いです。

2. Vue Routerを使ったページ間のナビゲーション

Routerを導入した場合、ページ遷移は <router-link> コンポーネントを使うのが標準的な方法です。

“`vue

“`

<router-link> はクリックすると指定した to パスへ遷移し、HTMLではデフォルトで <a> タグとしてレンダリングされます。また、現在のルートと一致する場合にアクティブクラスが自動的に付与されるため、ナビゲーションメニューなどで現在位置を視覚的に示すのに便利です。

プログラムによるナビゲーションを行いたい場合は、this.$router.push('/path/to/page')this.$router.replace('/path/to/page') メソッドを使用します。

3. Vuexを使った状態管理

アプリケーションの状態が複数のコンポーネントで共有されたり、コンポーネント階層の深いところでデータの受け渡しが必要になったりする場合、Vuexのストアが非常に役立ちます。

コンポーネントからストアの状態にアクセスするには this.$store.state.someValue のようにします。算出プロパティやVuexのヘルパー関数 (mapState, mapGetters) を使うと、より効率的にストアの状態をコンポーネントにマッピングできます。

ストアの状態を変更するには、必ずミューテーションをコミットするか、アクションをディスパッチします。

“`vue

“`

4. ESLintとPrettierを使ったコード品質の維持

ESLintとPrettierを連携させることで、コードの文法エラーを検知し、チーム全体のコードスタイルを統一できます。プロジェクト作成時に「Lint on save」を選択した場合、コードを保存するたびにLintが実行されます。

開発効率をさらに高めるために、使用しているコードエディタ(VS Codeなど)にESLintとPrettierの拡張機能をインストールし、保存時に自動的にコードをフォーマットする設定を有効にすることをお勧めします。これにより、手動でフォーマットする手間が省け、常にきれいなコードを保てます。

5. 開発者ツール (Vue Devtools) の活用

Vue.js公式の開発者ツール「Vue Devtools」は、Vue.jsアプリケーションの開発・デバッグに不可欠です。ブラウザの拡張機能として提供されており、インストールするとブラウザの開発者ツール内にVueタブが追加されます。

Vue Devtoolsを使うと、以下のことができます。

  • コンポーネントツリー: アプリケーションのコンポーネント階層を確認できます。各コンポーネントを選択すると、そのコンポーネントのデータ、Props、算出プロパティ、Vuexの状態などをインスペクトしたり、リアルタイムに変更したりできます。
  • Vuex: ストアの状態、ゲッター、ミューテーション、アクションの履歴を確認できます。ミューテーションのタイムトラベルデバッグ(状態の巻き戻し、再生)も可能です。
  • Router: 現在のルート情報や、利用可能なルート一覧を確認できます。
  • イベント: コンポーネントが発火したカスタムイベントをログで確認できます。
  • パフォーマンス: コンポーネントの描画パフォーマンスなどを測定できます。

Vue Devtoolsは、開発中のアプリケーションの状態を深く理解し、問題の原因を特定するのに役立ちます。

6. Webpackエイリアスの設定

Vue CLIのデフォルト設定では、@ というエイリアスが src ディレクトリを指すように設定されています。これにより、例えば src/components/MyComponent.vue をインポートする際に、相対パスの ../components/MyComponent.vue ではなく、絶対パスのように @/components/MyComponent.vue と記述できます。

javascript
import MyComponent from '@/components/MyComponent.vue'

このエイリアスは、特に深いディレクトリ階層にあるファイルをインポートする際に、パスが短くなり、可読性が向上するため非常に便利です。

独自のエイリアスを追加したい場合は、前述の vue.config.jsconfigureWebpack オプションで Webpack の resolve.alias を設定します。

7. 環境変数 (.env ファイル) の利用

APIエンドポイントのURLやAPIキーなど、環境(開発、ステージング、本番)によって異なる設定値は、環境変数として管理するのがベストプラクティスです。Vue CLIは、dotenv ライブラリを使用して .env ファイルによる環境変数の管理をサポートしています。

  • .env: 全ての環境で読み込まれるデフォルトの環境変数。
  • .env.development: 開発環境 (npm run serve) で読み込まれる環境変数。
  • .env.production: 本番環境 (npm run build) で読み込まれる環境変数。
  • .env.test: テスト環境 (npm run test:unit, npm run test:e2e) で読み込まれる環境変数。

これらのファイルに VUE_APP_ というプレフィックスを付けた変数を定義すると、アプリケーションコード内で process.env.VUE_APP_VARIABLE_NAME としてアクセスできるようになります。

例: .env.development ファイルに以下を記述

VUE_APP_API_URL=http://localhost:3000/api
VUE_APP_DEBUG=true

アプリケーションコード内でのアクセス:

“`javascript
console.log(process.env.VUE_APP_API_URL); // 開発環境では http://localhost:3000/api
console.log(process.env.VUE_APP_DEBUG); // 開発環境では ‘true’ (環境変数は文字列として扱われる)

if (process.env.NODE_ENV === ‘development’) {
// 開発環境でのみ実行されるコード
}
“`

process.env.NODE_ENVprocess.env.BASE_URL といった Vue CLI によってデフォルトで提供される環境変数もあります。環境変数を適切に利用することで、設定値をコードから分離し、環境ごとの設定管理が容易になります。

移行とVue 3

Vue CLI v4.5 以降は、Vue 3 を完全にサポートしています。プロジェクト作成時にデフォルトの選択肢として Vue 3 が表示されるようになりました。

もし既存のVue CLI v4プロジェクトをVue 3にアップグレードしたい場合は、Vue CLI v4.5+ がインストールされている状態で @vue/cli-plugin-vue-next プラグインを使用するか、Vue 3 への移行ガイドを参考に手動で依存関係を更新する必要があります。最も簡単な方法は、Vue CLI v5 以降で提供される @vue/cli-service migrate コマンドや、@vue/compat を利用することですが、これはこの記事の範囲を超えるため、公式ドキュメントを参照してください。

Vue 3で新しく導入された Composition API は、特に大規模なコンポーネントにおけるロジックの整理に非常に強力です。Vue CLIでVue 3プロジェクトを作成すると、Composition APIを使った記述スタイルをすぐに始めることができます。

まとめ

この記事では、Vue CLIを使ってモダンなVue.js開発環境を構築するプロセスを詳細に解説しました。

  • まず、なぜVue CLIが必要なのか、それが解決するモダンフロントエンド開発における複雑性について説明しました。
  • Node.jsとnpm/yarnが前提条件であることを確認し、Vue CLI自体のインストール方法を学びました。
  • vue create コマンドを使って新しいプロジェクトを作成し、特に手動選択 (Manually select features) オプションで選択できる様々な機能(Babel, TypeScript, Router, Vuex, Linterなど)がプロジェクトに何をもたらすのかを詳しく見ていきました。
  • 生成されたプロジェクトのディレクトリ構造とその中核となるファイル(main.js, public/index.html, App.vue, .vue SFC, router/index.js, store/index.js)の役割を理解しました。
  • npm run serve コマンドで開発サーバーを起動し、ホットモジュールリプレースメントの利点を体験しました。
  • Vue CLIの強力な機能であるプラグインシステム (vue add)、プリセット、設定のカスタマイズ (vue.config.js)、プロダクションビルド (npm run build)、そしてGUI (vue ui) について掘り下げて解説しました。
  • 開発を効率化するためのヒントやベストプラクティス(コンポーネント設計、Router/Vuexの利用、ESLint/Prettier、Vue Devtools、環境変数)についても触れました。

Vue CLIは、モダンなVue.js開発に必要な複雑なビルドツールや設定をカプセル化し、開発者がアプリケーションロジックに集中できる環境を提供してくれます。この記事で学んだ知識を活用することで、あなたはVue CLIを使いこなし、効率的でスケーラブルなVue.jsアプリケーション開発を自信を持って始めることができるでしょう。

次のステップとして、実際にコンポーネントを作成・組み合わせてアプリケーションを構築したり、Vue RouterやVuexを本格的に活用したり、単体テストやE2Eテストを導入したり、CI/CDパイプラインを構築したりすることに挑戦してみてください。Vue.jsのエコシステムは非常に豊かであり、学ぶべきことはたくさんあります。

Vue CLIはあなたのVue.js開発の強力な味方となるはずです。モダンな開発環境の恩恵を最大限に活用し、素晴らしいアプリケーションを構築してください!


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール