Vue 3 + Vite + Pinia 前端開發完整指南


前言

在現代前端開發中,Vue 3、Vite 和 Pinia 已成為台灣及全球開發者的標準選擇。這三個工具組成了高效的開發工作流,從本地開發到生產部署。然而,許多新手對於這些工具的用途、開發流程,以及最後的部署方式存有誤解。本文將深入介紹這些工具的核心概念、實際應用流程,並詳細解答新手常見問題。


第一部分:核心工具介紹

什麼是 Vite?

Vite 是由 Vue 創造者尤雨溪開發的下一代前端構建工具。與傳統的 Webpack 相比,Vite 具有以下優勢:

核心特性

Vite 的開發伺服器在編譯時間上表現卓越,通常可在 260 毫秒內完成編譯。這是因為 Vite 採用了 ES 模組(ESM)的原生支持,無需預先打包所有代碼,而是在瀏覽器請求時即時編譯。相比之下,Webpack 需要預先構建整個應用,導致開發效率較低。

在生產環節中,Vite 使用 Rollup 作為底層打包器,生成高度優化的產物,包括最小化的 JavaScript、CSS,以及自動進行 Tree-shaking 以移除未使用的代碼。

Vite 支持的插件系統

Vite 提供了多個官方插件來增強開發體驗:

  • @vitejs/plugin-vue:解析 Vue 單文件組件(.vue 文件)
  • @vitejs/plugin-vue-jsx:支持 JSX 語法開發複雜組件
  • vite-plugin-vue-devtools:集成 Vue DevTools 調試工具
  • unplugin-auto-import:自動導入常用 API,減少重複代碼

什麼是 Vue 3?

Vue 3 是現代前端框架,具備以下核心優勢:

  • 響應式系統重寫:性能提升顯著
  • Composition API:相比傳統 Options API,提供更靈活的代碼組織方式
  • TypeScript 支持:完整的類型定義和 IDE 自動補全
  • Fragment 特性:允許組件返回多個根元素
  • Tree-shaking 友好:在構建時自動移除未使用代碼

什麼是 Pinia?

Pinia 是 Vue 3 的官方狀態管理庫,是 Vuex 的現代替代品。在 2022 年 2 月,Pinia 正式成為 Vue 生態系統的一部分,並成為 Vue 3 的推薦狀態管理方案。

Pinia 核心特點

Pinia 相比 Vuex 有多項改進:

特性PiniaVuex
設計模式模塊化(多個獨立 store)中央化(單一 store + 子模塊)
代碼風格簡潔直觀冗長,需要更多樣板代碼
API 易用性函數式 API,無需記憶 “commit” 或 “dispatch”需要記住不同的操作名稱
文件大小僅 1KB相對較大
TypeScript 支持完整支持,具備自動補全​支持但不如 Pinia

Pinia 的模塊化設計意味著每個功能模塊可以擁有獨立的 store,而不是全部放在一個中央 store 中。這使得代碼更容易維護和擴展。

Pinia 的三個核心概念

  1. State:應用的共享數據狀態
  2. Getters:類似計算屬性,用於派生狀態
  3. Actions:用於修改狀態的異步或同步操作

第二部分:開發工作流程

開發流程圖

text項目初始化 → 開發環境搭建 → 本地開發 → 測試 → 生產構建 → 部署
   ↓             ↓           ↓        ↓        ↓           ↓
npm create   npm install   npm run  單元測試  npm run    上傳至
 vue@latest              dev      測試        build      web 伺服器

第一步:項目初始化

建立新的 Vue 3 + Vite 項目的最簡單方法是使用官方的 create-vue 工具:​

bashnpm create vue@latest my-vue-app

在交互式提示中,你可以選擇所需的功能:

text✔ Add TypeScript? … Yes
✔ Add JSX Support? … Yes  
✔ Add Vue Router for Single Page Application development? … Yes
✔ Add Pinia for state management? … Yes
✔ Add Vitest for Unit Testing? … Yes
✔ Add an End-to-End Testing Solution? › Playwright
✔ Add ESLint for code quality? … Yes
✔ Add Prettier for code formatting? … Yes

這將自動生成完整的項目結構,包括所有必要的配置文件和依賴。

第二步:安裝依賴並啟動開發伺服器

bashcd my-vue-app
npm install
npm run dev

執行 npm run dev 後,Vite 會啟動開發伺服器,通常在 http://localhost:5173 上運行。此時你可以在瀏覽器中看到你的應用,並進行實時開發。開發伺服器會自動監聽文件變化,實現熱更新(Hot Module Replacement, HMR),無需手動刷新瀏覽器。

第三步:開發應用

項目結構

標準的 Vue 3 + Vite 項目結構如下:

textsrc/
  ├── components/        # 可復用組件
  ├── views/            # 頁面級組件
  ├── stores/           # Pinia store 文件
  ├── router/           # Vue Router 配置
  ├── App.vue           # 根組件
  └── main.js           # 應用入口
public/                # 靜態資源
dist/                  # 生產構建輸出(構建後生成)
package.json
vite.config.js

使用 Pinia 進行狀態管理

創建一個 Pinia store:

javascript// src/stores/counter.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubled = computed(() => count.value * 2)
  
  function increment() {
    count.value++
  }
  
  return { count, doubled, increment }
})

在組件中使用:

text<template>
  <div>
    <p>Count: {{ store.count }}</p>
    <p>Doubled: {{ store.doubled }}</p>
    <button @click="store.increment">Increment</button>
  </div>
</template>

<script setup>
import { useCounterStore } from '@/stores/counter'

const store = useCounterStore()
</script>

使用 Vue Router 構建 SPA

設置路由實現單頁應用:

javascript// src/router/index.js
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
})

export default router

在模板中使用導航:

text<template>
  <nav>
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
  </nav>
  <router-view />
</template>

第三部分:生產構建

什麼是生產構建?

當完成開發後,你需要為生產環境創建優化版本。運行以下命令:

bashnpm run build

此命令將執行以下步驟:

  1. 代碼最小化(Minification):移除所有不必要的字符,減小文件體積
  2. Tree-shaking:移除未使用的代碼
  3. 資源優化:壓縮圖片、CSS、JavaScript
  4. 產生最終產物:輸出到 /dist 文件夾

生產構建後的輸出示例:

textdist/
  ├── index.html           # 應用入口
  ├── assets/
  │   ├── main-abc123.js   # 最小化的 JavaScript
  │   ├── style-def456.css # 最小化的 CSS
  │   └── images/          # 優化後的圖片
  └── favicon.ico

重要區別:開發 vs 生產

方面開發環境生產環境
命令npm run devnpm run build
文件大小較大(含調試信息)最小化
性能強調快速重編譯強調運行效率
輸出位置內存中(開發伺服器)/dist 文件夾
用途本地開發調試生產部署

第四部分:部署 – 新手常見誤區

誤區一:直接在瀏覽器打開 index.html

錯誤做法

許多新手在構建完成後,會嘗試直接在瀏覽器中打開 dist/index.html 文件:

text文件位置:C:\Users\YourName\project\dist\index.html
在瀏覽器中打開 → 結果:白屏或 CORS 錯誤

為什麼會失敗?

當直接打開 HTML 文件時,瀏覽器使用 file:// 協議而非 http://https:// 協議。這會導致多個問題:

  1. CORS 限制瀏覽器的同源策略阻止跨域請求
  2. 路由失敗:Vue Router 依賴服務器配置來正確處理 SPA 路由,當用戶刷新頁面時,瀏覽器會直接向文件系統請求資源而不是向服務器請求
  3. 模塊加載失敗:JavaScript 模塊無法正確加載

正確做法

必須通過 web 伺服器以 http://https:// 協議提供文件。有多種方式可實現:

方式一:本地測試(快速驗證)

使用 Node.js 的 serve 工具:

bashnpm install -g serve
serve -s dist

此命令將在 http://localhost:3000 上啟動本地伺服器。

方式二:使用 Vite 預覽(快速檢查)

bashnpm run preview

此命令使用 Vite 內置的預覽伺服器,但仅用於本地測試,不適用於生產環境。

誤區二:不理解 SPA 路由配置

什麼是 SPA 路由問題?

單頁應用(SPA)使用 HTML5 History API 在客戶端處理路由。例如,用戶訪問:

texthttps://example.com/about
https://example.com/products/123

這些 URL 實際上都由同一個 index.html 處理,所有的路由邏輯發生在瀏覽器中。然而,當用戶直接訪問這些 URL 或刷新頁面時,瀏覽器會向伺服器發送請求。如果伺服器没有正確配置,它會返回 404 錯誤,因為伺服器上不存在 /about/products/123 這樣的物理文件。

解決方案:配置 web 伺服器

不同的伺服器需要不同的配置來將所有請求重定向到 index.html

Apache(使用 .htaccess)

dist/ 文件夾中創建 .htaccess 文件:

text<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

Nginx

在 Nginx 配置中添加:

textserver {
  listen 80;
  server_name example.com;
  
  root /var/www/dist;
  
  location / {
    try_files $uri $uri/ /index.html;
  }
}

Vercel(自動配置)

Vercel 會自動檢測 Vue 應用並配置 SPA 路由,無需手動設置。

Netlify(自動配置)

Netlify 也會自動處理 SPA 路由,無需額外配置。

誤區三:誤解什麼應該被部署

正確做法

部署時,應該上傳 dist/ 文件夾的 內容,而不是文件夾本身:

bash# 正確:上傳 dist 文件夾內的所有文件
✓ index.html
✓ assets/main-abc123.js
✓ assets/style-def456.css
✓ favicon.ico

# 錯誤:上傳 dist 文件夾本身
✗ dist/index.html
✗ dist/assets/...

常見的共享主機部署步驟:

bash1. npm run build
2. 使用 FTP 客戶端連接到主機
3. 進入 public_html 或指定目錄
4. 上傳 dist 文件夾內的所有文件
5. 創建子域名指向該目錄(可選)

第五部分:部署選項對比

不同的部署平台提供不同的優勢和複雜度:

平台易用性配置需求自動化成本
Netlify很高最小Git 自動部署免費/付費
Vercel很高最小Git 自動部署免費/付費
Cloudflare Pages最小Git 自動部署免費/付費
GitHub Pages中等中等自動化腳本免費
Firebase Hosting中等中等自動化免費/付費
共享主機需要 .htaccess手動
AWS S3複雜配置手動/自動化按使用量

推薦新手選擇

對於初學者,推薦使用 Netlify 或 Vercel,因為它們提供最簡單的部署流程:

  1. 將代碼推送到 GitHub
  2. 在 Netlify/Vercel 上連接 GitHub 倉庫
  3. 自動部署完成

第六部分:常見問題解答

Q1:為什麼在開發中需要 npm run dev 而不是直接打開 HTML?

開發伺服器提供熱更新功能,讓你在修改代碼時無需手動刷新瀏覽器。它還處理模塊解析、資源加載等複雜任務。

Q2:Pinia 一定要使用嗎?

不一定。對於簡單應用,可以使用 Vue 的 prop drilling 或 provide/inject 機制。但對於中等以上複雜度的應用,Pinia 的集中狀態管理會大大簡化代碼。

Q3:dist 文件夾能不能提交到 Git?

建議不提交。dist/ 文件夾應該被加入 .gitignore,因為它可以從源代碼重新生成。這樣可以保持倉庫精簡,並避免部署時的衝突。

Q4:能否在 dist 文件夾中修改文件而不重新構建?

強烈不建議。dist/ 中的代碼經過了最小化和優化,難以手動編輯。任何修改在重新構建時都會丟失。始終在 src/ 中修改源代碼,然後重新構建。

Q5:開發環境和生產環境的文件大小差異有多大?

通常能減少 60-80% 的文件大小。例如,一個開發版本可能有 500KB,而生產版本可能只有 100KB。

Q6:如何在不同環境中使用不同的 API 地址?

使用環境變量。Vite 支持 .env 文件:

text.env.development
VITE_API_URL=http://localhost:3001

.env.production  
VITE_API_URL=https://api.example.com

在代碼中使用:

javascriptconst apiUrl = import.meta.env.VITE_API_URL

總結

Vue 3 + Vite + Pinia 的組合提供了現代、高效的前端開發體驗。關鍵要點總結如下:

  1. 開發流程npm run dev 啟動開發伺服器,進行本地開發和調試
  2. Pinia 狀態管理:使用官方的、輕量級的狀態管理方案
  3. 生產構建npm run build 生成優化版本到 /dist 文件夾
  4. 部署:必須通過 web 伺服器提供 SPA,配置正確的路由重寫規則
  5. 避免誤區:不能直接打開 index.html,必須使用 http(s) 協議

掌握這些基礎概念後,你就能夠有效地開發和部署現代 Vue 應用。


參考資源