通过前几章的学习,你已经对 Vite 的各种功能和特性有了深入了解。本章将带你进入实战项目,使用 Vite 构建一个完整的任务管理应用(Todo App)。我们将从项目规划开始,一步步实现任务管理的各个功能。

项目规划

功能需求

我们将构建一个简单的任务管理应用,包含以下功能:

  • 任务的添加
  • 任务的删除
  • 任务的标记完成

技术选型

  • 前端框架:Vue.js
  • 状态管理:Vuex
  • 路由管理:Vue Router

项目初始化

创建项目

使用 Vite 快速初始化一个 Vue 项目:

  1. npm init vite@latest todo-app --template vue
  2. cd todo-app
  3. npm install

配置项目

vite.config.js 中配置 Vue 插件:

  1. // vite.config.js
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. export default defineConfig({
  5. plugins: [vue()]
  6. })

开发过程

目录结构

为了更好地组织项目,我们将采用如下目录结构:

  1. todo-app/
  2. ├── public/
  3. ├── src/
  4. ├── assets/
  5. ├── components/
  6. ├── store/
  7. ├── views/
  8. ├── App.vue
  9. ├── main.js
  10. ├── index.html
  11. ├── vite.config.js
  12. └── package.json

安装依赖

我们需要安装 Vuex 和 Vue Router:

  1. npm install vuex@next vue-router@next

配置 Vuex

src/store 目录下创建 index.js 文件,并配置 Vuex:

  1. // src/store/index.js
  2. import { createStore } from 'vuex'
  3. export default createStore({
  4. state: {
  5. tasks: []
  6. },
  7. mutations: {
  8. ADD_TASK(state, task) {
  9. state.tasks.push(task)
  10. },
  11. TOGGLE_TASK(state, taskId) {
  12. const task = state.tasks.find(task => task.id === taskId)
  13. if (task) {
  14. task.completed = !task.completed
  15. }
  16. },
  17. REMOVE_TASK(state, taskId) {
  18. state.tasks = state.tasks.filter(task => task.id !== taskId)
  19. }
  20. },
  21. actions: {
  22. addTask({ commit }, task) {
  23. commit('ADD_TASK', task)
  24. },
  25. toggleTask({ commit }, taskId) {
  26. commit('TOGGLE_TASK', taskId)
  27. },
  28. removeTask({ commit }, taskId) {
  29. commit('REMOVE_TASK', taskId)
  30. }
  31. },
  32. getters: {
  33. allTasks(state) {
  34. return state.tasks
  35. }
  36. }
  37. })

配置 Vue Router

src 目录下创建 router.js 文件,并配置 Vue Router:

  1. // src/router.js
  2. import { createRouter, createWebHistory } from 'vue-router'
  3. import Home from './views/Home.vue'
  4. const routes = [
  5. {
  6. path: '/',
  7. name: 'Home',
  8. component: Home
  9. }
  10. ]
  11. const router = createRouter({
  12. history: createWebHistory(),
  13. routes
  14. })
  15. export default router

创建组件

创建任务列表组件

src/components 目录下创建 TodoList.vue 文件:

  1. <!-- src/components/TodoList.vue -->
  2. <template>
  3. <div>
  4. <h1>Todo List</h1>
  5. <input v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" />
  6. <ul>
  7. <li v-for="task in tasks" :key="task.id">
  8. <span :class="{ done: task.completed }">{{ task.text }}</span>
  9. <button @click="toggleTask(task.id)"></button>
  10. <button @click="removeTask(task.id)"></button>
  11. </li>
  12. </ul>
  13. </div>
  14. </template>
  15. <script>
  16. import { mapState, mapActions } from 'vuex'
  17. export default {
  18. data() {
  19. return {
  20. newTask: ''
  21. }
  22. },
  23. computed: {
  24. ...mapState(['tasks'])
  25. },
  26. methods: {
  27. ...mapActions(['addTask', 'toggleTask', 'removeTask']),
  28. addTask() {
  29. if (this.newTask.trim()) {
  30. this.addTask({ id: Date.now(), text: this.newTask, completed: false });
  31. this.newTask = '';
  32. }
  33. }
  34. }
  35. }
  36. </script>
  37. <style scoped>
  38. .done {
  39. text-decoration: line-through;
  40. }
  41. button {
  42. margin-left: 10px;
  43. }
  44. </style>

创建视图组件

src/views 目录下创建 Home.vue 文件:

  1. <!-- src/views/Home.vue -->
  2. <template>
  3. <div>
  4. <TodoList />
  5. </div>
  6. </template>
  7. <script>
  8. import TodoList from '../components/TodoList.vue'
  9. export default {
  10. components: {
  11. TodoList
  12. }
  13. }
  14. </script>

主入口文件

src 目录下的 main.js 中配置并启动应用:

  1. // src/main.js
  2. import { createApp } from 'vue'
  3. import App from './App.vue'
  4. import store from './store'
  5. import router from './router'
  6. createApp(App)
  7. .use(store)
  8. .use(router)
  9. .mount('#app')

配置主组件

src 目录下的 App.vue 中配置主组件:

  1. <!-- src/App.vue -->
  2. <template>
  3. <router-view />
  4. </template>
  5. <script>
  6. export default {
  7. name: 'App'
  8. }
  9. </script>
  10. <style>
  11. /* 全局样式 */
  12. </style>

项目构建与部署

构建生产版本

开发完成后,你可以使用 Vite 构建生产版本:

  1. npm run build

构建完成后,Vite 会在 dist 目录下生成生产版本的文件。你可以将这些文件部署到静态服务器或 CDN 上。

部署到静态服务器或 CDN

这里以部署到 GitHub Pages 为例:

  1. 安装 gh-pages 包:
  1. npm install gh-pages --save-dev
  1. package.json 中添加部署脚本:
  1. {
  2. "scripts": {
  3. "build": "vite build",
  4. "deploy": "gh-pages -d dist"
  5. }
  6. }
  1. 构建并部署项目:
  1. npm run build
  2. npm run deploy

这样,你的任务管理应用就成功部署到了 GitHub Pages。

结论

通过这一章的实战项目,你应该已经掌握了如何使用 Vite 构建一个完整的任务管理应用。我们从项目规划、安装依赖、配置项目、开发功能到最终部署,全面覆盖了一个完整项目的开发流程。Vite 的高效开发体验和简洁配置无疑为我们的开发工作带来了极大的便利。

至此,我们的 Vite 实战项目章节也告一段落了。如果你对 Vite 还有更多的疑问或需要进一步的信息,欢迎在评论区交流!