Vue3搭配Vite已成为现代前端开发的主流组合。Vite提供了极速的开发服务器启动和热模块替换(HMR),Vue3的Composition API则让代码组织更加灵活。本文将手把手带你搭建一个完整的Vue3+Vite项目。

一、环境准备

开始之前,请确保已安装以下工具:

二、创建项目

# 使用npm创建Vue3项目 npm create vue@latest my-project # 或使用pnpm pnpm create vue@latest my-project # 进入项目目录 cd my-project # 安装依赖 npm install # 启动开发服务器 npm run dev

创建过程中会让你选择需要的功能,推荐勾选:

三、项目结构说明

my-project/ ├── public/ # 静态资源(不经过打包处理) ├── src/ │ ├── assets/ # 需要打包的资源(图片、样式等) │ ├── components/ # 可复用组件 │ ├── views/ # 页面级组件 │ ├── router/ # 路由配置 │ ├── stores/ # Pinia状态管理 │ ├── App.vue # 根组件 │ └── main.js # 入口文件 ├── index.html # HTML模板 ├── vite.config.js # Vite配置 └── package.json # 项目依赖

四、配置路由

src/router/index.js 中配置页面路由:

import { createRouter, createWebHistory } from 'vue-router' const routes = [ { path: '/', name: 'Home', component: () => import('../views/Home.vue') }, { path: '/about', name: 'About', component: () => import('../views/About.vue') }, { path: '/user/:id', name: 'User', component: () => import('../views/User.vue'), props: true // 将路由参数作为props传递 } ] const router = createRouter({ history: createWebHistory(), routes }) export default router

五、使用Pinia管理状态

// stores/counter.js import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const useCounterStore = defineStore('counter', () => { // 状态 const count = ref(0) // 计算属性 const doubleCount = computed(() => count.value * 2) // 操作 function increment() { count.value++ } function decrement() { count.value-- } return { count, doubleCount, increment, decrement } })

六、编写组件示例

<template> <div class="card"> <h2>{{ title }}</h2> <p>{{ description }}</p> <button @click="handleClick"> 点击次数:{{ count }} </button> </div> </template> <script setup> import { ref, defineProps, defineEmits } from 'vue' const props = defineProps({ title: String, description: { type: String, default: '' } }) const emit = defineEmits(['click']) const count = ref(0) function handleClick() { count.value++ emit('click', count.value) } </script>
小贴士:Vue3的 <script setup> 语法糖让组件代码更加简洁,是官方推荐的写法。

七、Vite配置详解

vite.config.js 中可以配置代理、路径别名等:

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src') // 配置路径别名 } }, server: { port: 3000, proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } })
小贴士:配置了 @ 别名后,导入组件可以用 import Foo from '@/components/Foo.vue',不用再写一长串 ../../ 了。

八、组件通信进阶

除了 props 和 emit,Vue3 还提供了几种更灵活的组件通信方式:

provide / inject(跨层级传递)

// 父组件提供数据 import { provide, ref } from 'vue' const theme = ref('dark') provide('theme', theme) // 任意子组件注入使用 import { inject } from 'vue' const theme = inject('theme', 'light') // 第二个参数是默认值

封装 API 请求

// utils/request.js import axios from 'axios' const request = axios.create({ baseURL: '/api', timeout: 10000 }) // 请求拦截器 request.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }) // 响应拦截器 request.interceptors.response.use( response => response.data, error => { if (error.response?.status === 401) { // token过期,跳转登录 } return Promise.reject(error) } ) export default request

九、部署上线

# 构建生产版本 npm run build # 预览构建结果 npm run preview

构建后的文件在 dist 目录中。以下是 Nginx 部署配置示例:

server { listen 80; server_name your-domain.com; root /var/www/your-project/dist; index index.html; # SPA路由支持(关键!) location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|ico|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; } }
总结:Vue3 + Vite 的开发体验非常顺滑,Composition API 让代码组织更灵活。建议新手先从官方脚手架开始,边做项目边学,不要一开始就追求所有高级特性。