Vue3+Vite项目实战介绍了如何使用Vue3和Vite创建高效开发环境,涵盖了从初始化项目到配置开发环境的详细步骤,同时提供了实际项目案例和常见问题的解决方法。
Vue.js 是一种流行的前端框架,Vue3 是 Vue.js 的最新版本,它在性能、API设计和工具支持等方面做了很多改进。以下是 Vue3 的一些核心特性:
Vite 是一个由 Vue.js 作者尤雨溪提出的新型前端构建工具,它提供了极速开发体验。Vite 的核心思想是利用 ES 模块原生支持进行开发,而不是像传统构建工具(如 Webpack)一样,通过打包工具生成的环境来运行代码。
创建一个 Vue3 + Vite 项目的基本步骤如下:
npm install -g @vue/cli
npm create vite@latest my-vue3-vite-project --template vue cd my-vue3-vite-project npm install npm run dev
npm run dev
Vue3+Vite 项目的基本目录结构如下:
my-vue3-vite-project/ │ ├── node_modules/ # 存放所有依赖包 ├── public/ # 存放静态资源文件 │ └── index.html # 主 HTML 文件 ├── src/ # 存放源代码 │ ├── assets/ # 存放静态资源文件(如图片、字体等) │ ├── components/ # 存放全局组件 │ ├── router/ # 路由配置文件 │ ├── store/ # Vuex 状态管理配置文件 │ ├── views/ # 存放视图组件 │ ├── App.vue # 根组件 │ └── main.ts # 入口文件 └── vite.config.ts # Vite 配置文件
node_modules/
:存放所有依赖包。public/
:存放静态资源文件,例如主 HTML 文件 index.html
。src/
:存放源代码,包括组件、路由、状态管理等。assets/
:存放静态资源文件,如图片、字体等。components/
:存放全局组件。router/
:存放路由配置文件。store/
:存放 Vuex 状态管理配置文件。views/
:存放视图组件。App.vue
:根组件文件。main.ts
:项目入口文件。vite.config.ts
:Vite 配置文件。Vite 的配置文件通常位于项目的根目录下,文件名为 vite.config.ts
。下面是一些常用的配置项:
base
):指定部署应用的基础路径。
export default defineConfig({ base: '/my-vue3-vite-project/', });
assetsDir
):指定静态资源文件夹。
export default defineConfig({ assetsDir: 'static/', });
env
):
alias
):配置别名。
export default defineConfig({ alias: { '@': path.resolve(__dirname, 'src'), }, });
server.proxy
):配置代理。
export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), }, }, }, });
build
):配置构建选项。
export default defineConfig({ build: { rollupOptions: { input: 'src/main.ts', output: { entryFileNames: 'js/[name].[hash].js', chunkFileNames: 'js/[name].[hash].js', assetFileNames: 'static/[name].[hash].[ext]', }, }, }, });
Vue3 的配置文件通常位于 src/main.ts
或其他入口文件中。以下是一些常用的配置项:
路由配置 (router
):使用 Vue Router 配置路由。
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;
状态管理 (store
):使用 Vuex 配置状态管理。
import { createStore } from 'vuex'; const store = createStore({ state: { count: 0, }, mutations: { increment(state) { state.count++; }, }, actions: { increment({ commit }) { commit('increment'); }, }, }); export default store;
全局混入 (mixins
):在全局范围内使用混入。
import { createApp } from 'vue'; import App from './App.vue'; import mixins from './mixins'; const app = createApp(App); app.mixin(mixins); app.mount('#app');
Vue3 中的组件是可复用的 Vue 实例。组件可以在不同的地方多次使用。以下是一个简单的组件示例:
// src/components/HelloWorld.vue <template> <div class="hello"> <h1>{{ msg }}</h1> </div> </template> <script setup> import { ref } from 'vue'; const msg = ref('Hello World!'); </script> <style scoped> .hello { text-align: center; } </style>
在其他组件或页面中使用这个组件:
// src/views/Home.vue <template> <div> <HelloWorld /> </div> </template> <script setup> import HelloWorld from '../components/HelloWorld.vue'; </script>
在 Vue3 中,组件之间可以通过多种方式通信。以下是一些常见的通信方法:
Props:父组件可以向子组件传递数据。
// 父组件 <ChildComponent message="Hello from parent" /> // 子组件 <script setup> defineProps<{ message: string }>(); </script>
Event Bus:创建一个全局事件总线来传递事件。
// 创建一个 Event Bus import { createApp } from 'vue'; const eventBus = createApp({}); // 发送事件 eventBus.emit('eventName', 'Hello from eventBus'); // 监听事件 eventBus.on('eventName', (payload) => { console.log(payload); // 输出 "Hello from eventBus" });
3..
.
.
(略去重复内容)
.
.
.
Vue Router 是 Vue.js 官方的路由管理器。它允许你在应用中定义不同的视图,并通过 URL 路径导航到这些视图。
定义路由:在路由配置中定义每个路径对应的组件。
const routes = [ { path: '/', component: Home }, { path: '/about', component: About }, ];
导航守卫:在导航过程中执行一些逻辑,可以用来控制路由切换。
const router = createRouter({ // 路由配置 }); router.beforeEach((to, from, next) => { console.log(`从 ${from.path} 导航到 ${to.path}`); next(); });
安装 Node.js 和 Vue CLI 是开始 Vue3 + Vite 项目的基础。首先确保已经安装了 Node.js,然后安装 Vue CLI。
npm install -g @vue/cli
在命令行中执行以下命令来初始化一个新的 Vue3 + Vite 项目:
npm create vite@latest my-vue3-vite-project --template vue
在创建项目时选择默认的 Vue 3 + Vite 模板。
为了更好地调试和开发,你可能需要配置一些开发环境调试工具。以下是一些常用的工具:
VS Code:一个流行的代码编辑器,支持 Vue 项目。
Vue Language Features (Volar)
和 Vetur
。
// 安装插件命令 npm install --save-dev volar vetur
Chrome DevTools:使用 Chrome DevTools 进行前端调试。
Ctrl+Shift+I
)。我们来实现一个简单的待办事项应用。该应用将包括添加、删除和标记待办事项的功能。
创建应用结构:
// src/views/Todo.vue <template> <div class="todo-app"> <h1>待办事项应用</h1> <TodoForm @add-todo="addTodo" /> <TodoList :todos="todos" @delete-todo="deleteTodo" @complete-todo="completeTodo" /> </div> </template> <script setup> import { ref, reactive } from 'vue'; import TodoForm from '../components/TodoForm.vue'; import TodoList from '../components/TodoList.vue'; const todos = reactive([]); const addTodo = (todoText: string) => { todos.push({ text: todoText, completed: false }); }; const deleteTodo = (index: number) => { todos.splice(index, 1); }; const completeTodo = (index: number) => { todos[index].completed = true; }; </script> <style scoped> .todo-app { text-align: center; margin: 20px; } </style>
添加待办事项:
// src/components/TodoForm.vue <template> <div class="form"> <input v-model="newTodo" placeholder="添加一个新的待办事项..." /> <button @click="addTodo">添加</button> </div> </template> <script setup> import { ref, defineEmits } from 'vue'; const newTodo = ref(''); const emit = defineEmits(['add-todo']); const addTodo = () => { if (newTodo.value.trim()) { emit('add-todo', newTodo.value); newTodo.value = ''; } }; </script> <style scoped> .form { display: flex; justify-content: center; margin: 20px 0; } </style>
展示待办事项列表:
// src/components/TodoList.vue <template> <div class="todo-list"> <div v-for="(todo, index) in todos" :key="index" class="todo-item"> <input type="checkbox" v-model="todo.completed" @change="completeTodo(index)" /> <span :class="{ completed: todo.completed }">{{ todo.text }}</span> <button @click="deleteTodo(index)">删除</button> </div> </div> </template> <script setup> import { defineProps, defineEmits } from 'vue'; const props = defineProps<{ todos: any[] }>(); const emit = defineEmits(['delete-todo', 'complete-todo']); const deleteTodo = (index: number) => { emit('delete-todo', index); }; const completeTodo = (index: number) => { emit('complete-todo', index); }; </script> <style scoped> .todo-item { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .completed { text-decoration: line-through; } </style>
在上面的待办事项应用中,我们可以使用 Vue3 的一些新特性进行优化。例如,使用组合式 API 和响应式系统。
使用组合式 API:
// src/views/Todo.vue <script setup> import { ref, reactive } from 'vue'; import TodoForm from '../components/TodoForm.vue'; import TodoList from '../components/TodoList.vue'; const todos = reactive([]); const addTodo = (todoText: string) => { todos.push({ text: todoText, completed: false }); }; const deleteTodo = (index: number) => { todos.splice(index, 1); }; const completeTodo = (index: number) => { todos[index].completed = true; }; </script>
使用响应式系统:
// src/components/TodoList.vue <script setup> import { defineProps, defineEmits } from 'vue'; const props = defineProps<{ todos: any[] }>(); const emit = defineEmits(['delete-todo', 'complete-todo']); const deleteTodo = (index: number) => { emit('delete-todo', index); }; const completeTodo = (index: number) => { emit('complete-todo', index); }; </script>
部署 Vue3 + Vite 项目到远程服务器的基本步骤如下:
构建项目:
npm run build
这将生成一个 dist
目录,其中包含静态文件。
上传文件到服务器:
使用 FTP 或 SFTP 客户端将 dist
目录中的文件上传到服务器的适当位置。
配置服务器:
确保服务器配置正确,能够托管静态文件。例如,使用 Nginx 或 Apache 配置服务器。
server { listen 80; server_name yourdomain.com; root /path/to/dist; index index.html; location / { try_files $uri $uri/ /index.html; } }
安装依赖失败:
npm install -g npm
更新 npm,或者使用 npx
复制依赖包。开发服务器无法启动:
vite.config.ts
配置文件,确保没有语法错误或配置错误。确保所有依赖已正确安装,并尝试清理 node_modules
目录重新安装。构建时出现错误:
vite.config.ts
和 vue.config.js
,确保配置正确。清理缓存,运行 npm run build
重新构建。devServer
配置是否包含 hot
选项。清理缓存,重启开发服务器。懒加载:
示例代码:
import { defineComponent } from 'vue'; import { lazy } from 'vue'; const Home = lazy(() => import('./views/Home.vue')); const About = lazy(() => import('./views/About.vue'));
代码分割:
const Home = () => import('./views/Home.vue'); const About = () => import('./views/About.vue');
// 无代码示例,使用 Chrome DevTools 的 Performance 标签进行分析
调试工具:
// 无代码示例,使用 Chrome DevTools 的 Console 和 Elements 标签进行调试
单元测试:
示例代码:
import { shallowMount } from '@vue/test-utils'; import HelloWorld from '../components/HelloWorld.vue'; describe('HelloWorld.vue', () => { it('renders props.msg when passed', () => { const wrapper = shallowMount(HelloWorld, { props: { msg: 'Test Message' }, }); expect(wrapper.text()).toMatch('Test Message'); }); });
集成测试:
示例代码:
import { cy } from 'cypress'; describe('Todo App', () => { it('should add a new todo item', () => { cy.visit('/'); cy.get('input').type('New Todo Item'); cy.get('button').click(); cy.get('.todo-item').should('have.length', 1); cy.get('.todo-item').contains('New Todo Item'); }); });
通过以上步骤和技巧,你可以在开发 Vue3 + Vite 项目时更加高效和放心。