- Vue.js
Vue環境構築|create-vueでプロジェクト作成とディレクトリ構成
Vueの環境構築は、Node.jsを入れたうえで npm create vue@latest を実行し、npm install と npm run dev を続けるだけで完了します。 create-vueはVue公式のプロジェクト作成ツールで、Vite(開発サーバーとビルドを担当するツール)を土台に、TypeScript・ルーター・状態管理・テスト・リンターを質問に答える形で組み込めます。
この記事では、create-vue 3.24.0 を実際に実行して得た画面と出力をもとに、対話項目とコマンドラインフラグの対応、質問なしで一発生成するコマンド、生成される全ファイルの役割、npm scripts、そしてつまずきやすい3つの場面(Nodeのバージョン不足・ポートの競合・ほかの端末からつながらない)のエラー文と対処を順に説明します。
確認環境:Ubuntu 24.04 / Node.js 22.22.2 / npm 10.9.7(一部 npm 11.21.0) / create-vue 3.24.0 / Vite 8.3.2 / Vue 3.5.43 / TypeScript 6.0.3 / Chromium 141(Playwright 1.56.0)。バージョン不足の再現には Node.js 18.20.8 と 20.18.3 を使いました。開発サーバーのポートは、この環境で使える 8951 番を --port で指定しています(既定の 5173 番を使う場合は数字を読み替えてください)。出力中のパスとプロジェクト名は、/home/taro/ と my-app に置き換えています。
Vue環境構築の早見表
| やりたいこと | コマンド |
|---|---|
| Nodeのバージョンを確かめる | node -v(22.18以上、または24.12以上) |
| 質問に答えながら作る | npm create vue@latest |
| 質問なしで最小構成を作る | npm create vue@latest my-app -- --default |
| ルーター・状態管理・テスト・リンターつきで一発生成 | npm create vue@latest my-app -- --ts --router --pinia --vitest --eslint --prettier |
| サンプルコードなしで作る | npm create vue@latest my-app -- --ts --bare |
| 依存パッケージを入れる | cd my-app && npm install |
| 開発サーバーを起動する | npm run dev |
| ポートを変えて起動する | npm run dev -- --port 8951 |
| ほかの端末からつながるようにする | npm run dev -- --host |
| 公開用にビルドする | npm run build(dist フォルダに出力) |
| ビルド結果を手元で確かめる | npm run preview |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Vue環境構築|create-vueでプロジェクト作成とディレクトリ構成」
準備:Node.jsのバージョンを確かめる
最初に確かめるのはNode.jsのバージョンです。Vue公式のクイックスタートには、前提として Node.js ^22.18.0 || >=24.12.0 と書かれています。create-vue 3.24.0 のパッケージ情報(engines)と、生成される package.json の engines も同じ値でした。
node -v
npm -v
v22.22.2
10.9.7
| ツール | 求めるNode.js | 調べた場所 |
|---|---|---|
| create-vue 3.24.0 | 22.18以上の22系、または24.12以上 | npm view create-vue engines |
| 生成されるプロジェクト | 同上 | package.json の engines |
| Vite 8.3.2 | 20.19以上、または22.12以上 | Vite起動時のメッセージ |
22.18以上(または24.12以上)にしておけば、3つとも満たせます。 満たしていないときに何が起きるかは、後半の「エラー文と対処」で実際の出力を載せています。
create-vueでプロジェクトを作る(対話形式)
npm create vue@latest
初回は create-vue 本体が npm から取得されます。その後、次の順に質問が出ます。create-vue 3.24.0 の画面をそのまま写したものです。
┌ Vue.js - The Progressive JavaScript Framework
│
◆ Project name (target directory):
│ vue-project
└
◆ Use TypeScript?
│ ● Yes / ○ No
◆ Select features to include in your project: (↑/↓ to navigate, space to select, a to toggle all,
│ enter to confirm)
│ ◻ JSX Support
│ ◻ Router (SPA development)
│ ◻ Pinia (state management)
│ ◻ Vitest (unit testing)
│ ◻ End-to-End Testing
│ ◻ Linter (error prevention)
│ ◻ Prettier (code formatting)
◆ Select experimental features to include in your project: (↑/↓ to navigate, space to select, a to
│ toggle all, enter to confirm)
│ ◻ Replace Prettier with Oxfmt
│ ◻ Vue 3.6 (Release Candidate)
│ ◻ Replace TypeScript with typescript-native-bridge (tsgo)
◆ Skip all example code and start with a blank Vue project?
│ ○ Yes / ● No
機能の一覧で End-to-End Testing を選ぶと、続けてツールを選ぶ質問が出ます。
◆ Select an End-to-End testing framework: (↑/↓ to navigate, enter to confirm)
│ ● Playwright (https://playwright.dev/)
│ ○ Cypress
最後まで答えると、次の案内が出て完了です。
└ Done. Now run:
cd my-app
npm install
npm run dev
| Optional: Initialize Git in your project directory with:
git init && git add -A && git commit -m "initial commit"
操作キー
| キー | 動き |
|---|---|
| ↑ / ↓ | 項目を移動 |
| スペース | 選択・解除 |
| a | すべて選択・解除 |
| Enter | 確定して次へ |
迷ったら、TypeScriptはYes、機能はRouter・Pinia・Linter・Prettierを選んでおくと、あとから足す手間が減ります。学習用に最小で始めたい場合は、何も選ばずEnterで進めて構いません。
対話項目とコマンドラインフラグの対応表
対話の質問は、すべてコマンドラインのフラグでも指定できます。npm create vue@latest -- --help の出力と、実際の対話画面を突き合わせた対応表です。
| 対話の項目 | 既定 | フラグ | 追加されるもの |
|---|---|---|---|
| Project name | vue-project | 引数にフォルダ名を書く | フォルダ名と package.json の name |
| Use TypeScript? | Yes | --ts(--typescript) |
tsconfig 一式、env.d.ts、vue-tsc |
| JSX Support | 選択なし | --jsx |
JSXで書くためのプラグイン |
| Router (SPA development) | 選択なし | --router(--vue-router) |
Vue Router、src/router、src/views |
| Pinia (state management) | 選択なし | --pinia |
Pinia、src/stores |
| Vitest (unit testing) | 選択なし | --vitest |
Vitest、vitest.config.ts、テストの例 |
| End-to-End Testing → Playwright | 選択なし | --playwright |
PlaywrightによるE2Eテスト |
| End-to-End Testing → Cypress | 選択なし | --cypress |
CypressによるE2Eテスト(--vitest なしならコンポーネントテストも) |
| Linter (error prevention) | 選択なし | --eslint |
ESLint と Oxlint の設定 |
| Prettier (code formatting) | 選択なし | --prettier |
Prettier の設定 |
| Replace Prettier with Oxfmt | 選択なし | --oxfmt |
Oxfmt(試験的な機能) |
| Vue 3.6 (Release Candidate) | 選択なし | --vue-rc |
Vue 3.6 RC(試験的な機能) |
| Replace TypeScript with tsgo | 選択なし | --tsgo |
typescript-native-bridge(試験的な機能) |
| Skip all example code | No | --bare |
サンプルコードなしの最小構成 |
質問とは別に使えるオプションもあります。
| フラグ | 働き |
|---|---|
--default |
追加機能なしの既定の構成で作る |
--force |
フォルダが空でなくても作る(既存のファイルは削除して作り直す) |
--help |
フラグの一覧を表示 |
--version |
create-vue のバージョンを表示 |
ヘルプには、「機能フラグを1つでも付けると対話なしで進む。フォルダ名が無い、またはパッケージ名として使えない場合は対話になる」という説明があります。また、--eslint を付けると Oxlint も一緒に入ります(ヘルプには、以前の --oxlint は ESLint 選択時に常に含まれるようになったと書かれています)。
質問なしで一発生成するコマンド
よく使う構成をまとめて作る
npm create vue@latest my-app -- --ts --router --pinia --vitest --eslint --prettier
-- は「ここから後ろは create-vue に渡す」という区切りです。npm 経由で実行するときに必要になります。実行すると質問は出ず、次の案内で終わりました。
— Done. Now run:
cd my-app
npm install
npm run format
npm run dev
Prettier を入れたので、案内に npm run format が1行増えています。
目的別のコマンド
| 目的 | コマンド |
|---|---|
| 最小構成(TypeScriptあり) | npm create vue@latest my-app -- --default |
| TypeScript だけ | npm create vue@latest my-app -- --ts |
| サンプルコードなし | npm create vue@latest my-app -- --ts --bare |
| 画面遷移のあるアプリ | npm create vue@latest my-app -- --ts --router --pinia |
| テストと整形まで含める | npm create vue@latest my-app -- --ts --router --pinia --vitest --eslint --prettier |
| E2Eテストも入れる | 上のコマンドに --playwright を足す |
create-vue 3.24.0 では、--default で作ったプロジェクトも TypeScript 構成(main.ts と tsconfig 一式)でした。 --default と --ts で生成されるファイルは同じ25個です。
--bare を付けると、サンプルのコンポーネントやCSSが省かれ、App.vue は次の内容だけになります。
<script setup lang="ts"></script>
<template>
<h1>You did it!</h1>
<p>
Visit <a href="https://vuejs.org/" target="_blank" rel="noopener">vuejs.org</a> to read the
documentation
</p>
</template>
<style scoped></style>
同じ名前のフォルダがあるとき
すでに中身のあるフォルダ名を指定すると、フラグ付きでも確認の質問が出ます。
* Target directory "my-app" is not empty. Remove all existing files and
| continue?
| Yes / > No
--force を付けると、この確認なしで作り直します。実際に試すと、もとのフォルダにあった node_modules やルーターのファイルは残らず、新しく生成されたファイルだけになりました。大事なファイルがあるフォルダには使わないようにします。
インストールして起動する
cd my-app
npm install
npm run dev
VITE v8.3.2 ready in 569 ms
➜ Local: http://localhost:8951/
➜ Network: use --host to expose
➜ Vue DevTools: Open http://localhost:8951/__devtools__/ as a separate window
➜ Vue DevTools: Press Alt(⌥)+Shift(⇧)+D in App to toggle the Vue DevTools
(この出力は npm run dev -- --port 8951 で起動したものです。ポートを指定しない場合、Viteの既定のポートは 5173 です。)
Local に表示されたURLをブラウザで開けば、Vueの画面が表示されます。 Chromium で開いて、ページのタイトルと見出しを取得した結果です。
http://localhost:8951/ | title = Vite App | h1 = ['You did it!']
http://localhost:8951/about | title = Vite App | h1 = ['You did it!', 'This is an about page']
ルーターを入れた構成なので、/about でも見出しが表示されています。止めるときは、ターミナルで Ctrl + C を押します。
ディレクトリ構成と全ファイルの役割
ここからは、生成されたファイルを1つずつ見ていきます。
最小構成(--ts)の25ファイル
my-app/
├── .gitignore
├── .vscode/
│ ├── extensions.json
│ └── settings.json
├── README.md
├── env.d.ts
├── index.html
├── package.json
├── public/
│ └── favicon.ico
├── src/
│ ├── App.vue
│ ├── main.ts
│ ├── assets/
│ │ ├── base.css
│ │ ├── logo.svg
│ │ └── main.css
│ └── components/
│ ├── HelloWorld.vue
│ ├── TheWelcome.vue
│ ├── WelcomeItem.vue
│ └── icons/(Icon〜.vue が5個)
├── tsconfig.json
├── tsconfig.app.json
├── tsconfig.node.json
└── vite.config.ts
| ファイル | 役割 | 触る頻度 |
|---|---|---|
index.html |
アプリの入口になるHTML。id="app" の要素と、main.ts を読み込む script タグがある |
タイトルや lang を変えるとき |
src/main.ts |
最初に実行されるスクリプト。createApp でアプリを作り、#app に取り付ける |
プラグインを足すとき |
src/App.vue |
いちばん外側のコンポーネント | よく触る |
src/components/ |
部品(コンポーネント)の置き場。サンプルが8個入っている | よく触る |
src/assets/ |
CSSや画像の置き場。import して使い、ビルド時にファイル名へハッシュが付く | ときどき |
public/ |
そのままの名前で配信したいファイルの置き場(favicon.ico など) | まれ |
vite.config.ts |
Viteの設定。Vueプラグイン、Vue DevTools、@ を src に向ける別名 |
ポートや別名を変えるとき |
package.json |
依存パッケージと npm scripts、engines(Nodeの条件) | パッケージを足すとき |
tsconfig.json |
下の2つ(テストを入れた場合は3つ)を参照するだけの親設定 | ほぼ触らない |
tsconfig.app.json |
src 配下(ブラウザで動くコード)向けの型設定。@/* の別名もここ |
型の厳しさを変えるとき |
tsconfig.node.json |
vite.config.ts など Node.js で動く設定ファイル向けの型設定 | ほぼ触らない |
env.d.ts |
vite/client の型を読み込む1行。import.meta.env などの型が効く |
環境変数の型を足すとき |
.gitignore |
Gitに含めないもの(node_modules、dist、*.local など) |
まれ |
.vscode/extensions.json |
VS Code に勧める拡張機能の一覧(Vue.volar など) | まれ |
.vscode/settings.json |
エクスプローラーで関連ファイルをまとめて表示する設定 | まれ |
README.md |
推奨エディタと、各コマンドの説明 | 自分のアプリ用に書き換える |
生成された index.html と main.ts、vite.config.ts は次のとおりです。
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
// vite.config.ts
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
vueDevTools(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
})
生成直後の index.html は lang が空、title が Vite App です。日本語のアプリなら lang="ja" と自分のタイトルに書き換えておくと、検索エンジンや読み上げソフトに正しく伝わります。
画面が表示されるまでの流れ
flowchart LR
A[index.html] -->|script type=module| B[src/main.ts]
B -->|createApp| C[src/App.vue]
C --> D[src/components の部品]
B -->|app.use| E[router と pinia]
E --> F[src/views の画面]
フラグで増えるファイル
--ts --router --pinia --vitest --eslint --prettier で作ると、ファイルは37個になりました。増えた12個の役割です。
| 増えたファイル | きっかけのフラグ | 役割 |
|---|---|---|
src/router/index.ts |
--router |
URLと画面の対応(ルート定義) |
src/views/HomeView.vue、AboutView.vue |
--router |
URLごとに表示する画面。components と分けて置く |
src/stores/counter.ts |
--pinia |
状態管理(ストア)のサンプル |
vitest.config.ts |
--vitest |
vite.config.ts を引き継ぎ、テスト環境を jsdom にする設定 |
tsconfig.vitest.json |
--vitest |
テストファイル向けの型設定 |
src/components/__tests__/HelloWorld.spec.ts |
--vitest |
テストのサンプル |
eslint.config.ts |
--eslint |
ESLint の設定(Vue・TypeScript・Vitest 向けのルール) |
.oxlintrc.json |
--eslint |
Oxlint(高速なリンター)の設定 |
.prettierrc.json |
--prettier |
整形ルール(セミコロンなし・シングルクォート・1行100字) |
.editorconfig |
--eslint と --prettier を付けた構成で生成 |
エディタ共通の設定(インデント2、改行 LF など) |
.gitattributes |
同上 | 改行コードを LF にそろえる指定 |
main.ts も、ルーターと Pinia を登録する形に変わります。
import './assets/main.css'
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')
置き場所に迷ったときの目安
| 置きたいもの | 置き場所 |
|---|---|
| ボタンやカードなど、使い回す部品 | src/components/ |
| URLに対応する1画面 | src/views/ |
| 複数の画面で共有する状態 | src/stores/ |
| import して使う画像・CSS | src/assets/ |
| robots.txt など、名前を変えずに配信したいもの | public/ |
| 部品のテスト | 対象の近くの __tests__/ |
npm scripts早見表
package.json の scripts に入っているコマンドの一覧です。上の5つは最小構成にもあり、下の5つはフラグで増えます。
| コマンド | 中身 | 何をするか |
|---|---|---|
npm run dev |
vite |
開発サーバーを起動。保存するとすぐ画面に反映される |
npm run build |
run-p type-check "build-only {@}" -- |
型チェックとビルドを並行して実行 |
npm run build-only |
vite build |
型チェックなしでビルドだけ行う |
npm run type-check |
vue-tsc --build |
.vue ファイルも含めて型チェック |
npm run preview |
vite preview |
dist の中身を手元で配信して確かめる |
npm run test:unit |
vitest |
単体テストを実行(--vitest) |
npm run lint |
run-s "lint:*" |
lint:oxlint → lint:eslint の順に実行(--eslint) |
npm run lint:oxlint |
oxlint . --fix |
Oxlint で検査して直せるものは直す |
npm run lint:eslint |
eslint . --fix --cache |
ESLint で検査して直せるものは直す |
npm run format |
prettier --write --experimental-cli src/ |
src 配下を整形(--prettier) |
build の実行結果
> my-app@0.0.0 build
> run-p type-check "build-only {@}" --
> my-app@0.0.0 type-check
> vue-tsc --build
> my-app@0.0.0 build-only
> vite build
vite v8.3.2 building client environment for production...
transforming...
✓ 44 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.42 kB │ gzip: 0.28 kB
dist/assets/AboutView-CXtZgaLf.css 0.08 kB │ gzip: 0.10 kB
dist/assets/index-DEm2-gV0.css 4.05 kB │ gzip: 1.27 kB
dist/assets/AboutView--eSdL59e.js 0.22 kB │ gzip: 0.19 kB
dist/assets/index-C-ponb03.js 100.41 kB │ gzip: 38.83 kB
✓ built in 316ms
dist フォルダに index.html・assets・favicon.ico が出力されます。 AboutView が別ファイルになっているのは、サンプルのルーターが /about の画面を必要になった時点で読み込む書き方になっているためです。
テストと preview の実行結果
Test Files 1 passed (1)
Tests 1 passed (1)
Duration 981ms (transform 63ms, setup 0ms, import 187ms, tests 16ms, environment 628ms)
(npx vitest run の出力です。npm run test:unit は変更を監視し続けるモードで起動するので、1回だけ実行したいときは npx vitest run が便利です。)
➜ Local: http://localhost:8953/
➜ Network: use --host to expose
(npm run preview -- --port 8953 の出力です。Chromium で開くと、開発サーバーと同じ見出し You did it! が表示されました。)
scripts に引数を渡す書き方
npm run dev -- --port 8951 のように、-- のあとに書いたものが vite に渡ります。
| やりたいこと | コマンド |
|---|---|
| ポートを指定する | npm run dev -- --port 8951 |
| 使用中なら止まるようにする | npm run dev -- --port 8951 --strictPort |
| ほかの端末からつなぐ | npm run dev -- --host |
エラー文と対処:Nodeのバージョンが足りないとき
ここからは、つまずきやすい場面を実際に再現した結果です。
Node.js 18 で create-vue を実行した場合
file:///home/taro/.npm/_npx/2f7e7bff16d1c534/node_modules/create-vue/bundle.js:8
import { parseArgs, styleText } from "node:util";
^^^^^^^^^
SyntaxError: The requested module 'node:util' does not provide an export named 'styleText'
Node.js v18.20.8
「styleText が無い」という構文エラーで止まります。 バージョン不足とは書かれていませんが、最後の行の Node.js v18.20.8 が手がかりです。Node.js を上げると解消します。
Node.js 18 で Vite を実行した場合
すでにあるプロジェクトで vite build を実行したときも、同じ形のエラーになりました。
file:///home/taro/my-app/node_modules/rolldown/dist/shared/create-bundler-option-DLv8UpsD.mjs:8
import { formatWithOptions, styleText } from "node:util";
^^^^^^^^^
SyntaxError: The requested module 'node:util' does not provide an export named 'styleText'
Node.js v18.20.8
Node.js 20.18 の場合:動くが案内が出る
20.18.3 では、create-vue もビルドも最後まで進みました。ただし、Vite は最初に次の案内を出します。
You are using Node.js 20.18.3. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.
npm install では、条件に合わないパッケージごとに EBADENGINE の警告が出ます。
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: 'my-app@0.0.0',
npm warn EBADENGINE required: { node: '^22.18.0 || >=24.12.0' },
npm warn EBADENGINE current: { node: 'v20.18.3', npm: '10.9.7' }
npm warn EBADENGINE }
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: '@vitejs/plugin-vue@6.0.9',
npm warn EBADENGINE required: { node: '^20.19.0 || >=22.12.0' },
npm warn EBADENGINE current: { node: 'v20.18.3', npm: '10.9.7' }
npm warn EBADENGINE }
| Node.js | create-vue | vite build | 出るメッセージ |
|---|---|---|---|
| 18.20.8 | 止まる | 止まる | SyntaxError: ... does not provide an export named 'styleText' |
| 20.18.3 | 完了する | 完了する | Vite requires Node.js version 20.19+ or 22.12+、npm warn EBADENGINE |
| 22.22.2 | 完了する | 完了する | なし |
required と current を見比べれば、どこまで上げればよいかがわかります。 警告のうちに 22.18 以上(または 24.12 以上)へ上げておくと、あとの作業が安定します。
npm install が edgesOut のエラーで止まる場合
確認環境の npm 10.9.7 では、フラグを多く付けた構成(--ts --router --pinia --vitest --eslint --prettier)の npm install が次のエラーで止まりました。最小構成(--ts)は同じ npm で問題なく入りました。
npm error Cannot read properties of null (reading 'edgesOut')
npm 11.21.0 で実行し直すと、同じプロジェクトがそのままインストールできました。
npx npm@11 install
同じエラーに出会ったら、npm -v で npm のバージョンを確かめ、新しい npm で試してみてください。
エラー文と対処:ポートが競合するとき
開発サーバーを起動したまま、別のターミナルでもう一度同じポートで起動した結果です。
Port 8951 is in use, trying another one...
VITE v8.3.2 ready in 1741 ms
➜ Local: http://localhost:8952/
➜ Network: use --host to expose
Viteは、使用中なら自動で次の番号(8952)に移って起動します。 エラーにはならないので、「いつものURLを開いたのに別のアプリが表示される」ときは、起動時の Local の行を見直します。既定の 5173 番でも同じ動きで、Viteの公式ドキュメント(サーバーオプション)にも「ポートがすでに使われている場合、次に使えるポートを自動的に試す」と書かれています。
必ず同じポートで起動したい場合(--strictPort)
npm run dev -- --port 8951 --strictPort
error when starting dev server:
Error: Port 8951 is already in use
at httpServerStart (file:///home/taro/my-app/node_modules/vite/dist/node/chunks/node.js:14540:10)
--strictPort を付けると、別の番号に移らずエラーで止まります。ほかのツールがそのポート番号を前提にしている場合に向いています。
どのプロセスがポートを使っているか調べる
ss -ltnp | grep :8951
LISTEN 0 511 127.0.0.1:8951 0.0.0.0:* users:(("node",pid=12357,fd=21))
pid= の数字がプロセス番号です。止め忘れた開発サーバーなら、その番号を指定して止めます。
kill 12357
| 状況 | 対処 |
|---|---|
| 止め忘れた開発サーバーが残っている | ss -ltnp で pid を調べて kill |
| 別のアプリがそのポートを使っている | --port で別の番号にする |
| 番号が勝手に変わると困る | --strictPort を付けて、競合に気付けるようにする |
エラー文と対処:ほかの端末からつながらないとき(--host)
スマートフォンでの表示確認や、仮想マシン・コンテナの外からのアクセスで出会う場面です。
既定の状態
起動時の表示に Network: use --host to expose とあります。この状態では、開発サーバーは自分自身(127.0.0.1)からの接続だけを受け付けます。
ss -ltn | grep 8951
curl -o /dev/null -w "%{http_code}\n" http://localhost:8951/
curl -o /dev/null -w "%{http_code}\n" http://192.0.2.2:8951/
LISTEN 0 511 127.0.0.1:8951 0.0.0.0:*
200
curl: (7) Failed to connect to 192.0.2.2 port 8951 after 0 ms: Couldn't connect to server
localhost では 200 が返り、マシンのIPアドレス(この環境では 192.0.2.2)を指定すると接続できません。ほかの端末から開けないときは、まずこの待ち受けアドレスを確かめます。
--host を付けた場合
npm run dev -- --host
VITE v8.3.2 ready in 842 ms
➜ Local: http://localhost:8951/
➜ Network: http://192.0.2.2:8951/ eth0
LISTEN 0 511 0.0.0.0:8951 0.0.0.0:*
200
待ち受けが 127.0.0.1 から 0.0.0.0(すべてのアドレス)に変わり、Network の行にURLが表示されます。 同じIPアドレスへの curl も 200 になりました。ほかの端末からは、この Network のURLを開きます。
| 項目 | 既定 | --host あり |
|---|---|---|
| 待ち受けアドレス | 127.0.0.1 | 0.0.0.0 |
| Network の表示 | use --host to expose | http://192.0.2.2:8951/ |
| localhost から | 200 | 200 |
| マシンのIPアドレスから | 接続できない | 200 |
設定ファイルに書いておく
毎回フラグを付ける代わりに、vite.config.ts の server に書いておけます。
// vite.config.ts
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
export default defineConfig({
plugins: [vue(), vueDevTools()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
server: {
port: 8951, // 開発サーバーのポート(既定は 5173)
strictPort: true, // 使用中なら別のポートに移らず、エラーで止まる
host: true, // ほかの端末からもつながるようにする(--host と同じ)
},
})
この設定で npm run dev を実行すると、フラグなしで Network の行が表示され、2つ目を起動すると Error: Port 8951 is already in use で止まることを確かめました。
--host は、同じネットワークにいるほかの端末からも開発中の画面が見える状態です。作業が終わったら外す、信頼できるネットワークで使う、という使い方が安心です。
環境構築のチェック表
| 順番 | 確かめること | コマンド・見る場所 |
|---|---|---|
| 1 | Node.js が 22.18 以上(または 24.12 以上) | node -v |
| 2 | プロジェクトが生成された | Done. Now run: の表示 |
| 3 | 依存パッケージが入った | npm install が警告なしで終わる |
| 4 | 開発サーバーが起動した | Local: http://localhost:〜/ の表示 |
| 5 | ブラウザに You did it! が表示された | Local のURLを開く |
| 6 | ビルドできる | npm run build で dist ができる |
| 7 | Git で管理を始める | git init && git add -A && git commit -m "initial commit" |
よくある質問
Q. Vue CLI(vue create)との違いは何ですか?
A. Vue公式のクイックスタートが案内しているのは create-vue(npm create vue@latest)で、土台に Vite を使います。これから新しく作る場合は、この記事の手順で始めるのが素直です。
Q. あとからルーターや Pinia を足せますか?
A. 足せます。手本として、同じフラグを付けた別のフォルダを生成して見比べる方法がわかりやすいです。増えるのは package.json の依存パッケージ、main.ts の app.use(createPinia()) と app.use(router)、src/router・src/views・src/stores の3フォルダなので、この差分を自分のプロジェクトに写します。
Q. --default と --ts は何が違いますか?
A. create-vue 3.24.0 で試した範囲では、どちらも同じ25ファイルの TypeScript 構成になりました。ルーターなどを足したい場合は、--ts --router のように必要なフラグを並べます。
Q. npm 以外のパッケージマネージャーでも作れますか?
A. Vue公式のクイックスタートには、pnpm create vue@latest、yarn create vue@latest、bun create vue@latest も載っています。この記事の出力はすべて npm で実行したものです。
まとめ
- Vueの環境構築は
npm create vue@latest→npm install→npm run devの3手順。Node.js は 22.18 以上(または 24.12 以上)を用意する - 対話の質問はすべてフラグで指定できる。
npm create vue@latest my-app -- --ts --router --pinia --vitest --eslint --prettierで、質問なしの一発生成ができる - 最小構成は25ファイル、フラグを付けた構成は37ファイル。index.html → main.ts → App.vue の順に読み込まれ、部品は components、画面は views、状態は stores に置く
- npm scripts は dev・build・preview が基本。build は型チェックとビルドを並行して行い、dist に出力する
- Nodeが足りないと、18 では styleText の構文エラーで止まり、20.18 では Vite の案内と EBADENGINE の警告が出る
- ポートが使用中なら Vite は自動で次の番号に移る。固定したいときは
--strictPort、使っているプロセスはss -ltnpで調べる - ほかの端末からつなぐには
--host。待ち受けが 127.0.0.1 から 0.0.0.0 に変わり、Network のURLが表示される
参考
- Vue.js 公式ドキュメント「クイックスタート」 https://ja.vuejs.org/guide/quick-start
- Vite 公式ドキュメント「サーバーオプション」 https://ja.vite.dev/config/server-options.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Vue環境構築|create-vueでプロジェクト作成とディレクトリ構成」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。