news 2026/7/2 8:26:21

Vue3 + Vite项目实战:从零搭建企业级前端架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3 + Vite项目实战:从零搭建企业级前端架构

一、环境准备

# Node.js >= 16 node -v # 创建项目 npm create vite@latest my-vue3-app -- --template vue cd my-vue3-app npm install npm run dev

回到顶部

二、项目目录结构

src/ ├── api/ # API接口 ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── composables/ # 组合式函数 ├── layouts/ # 布局组件 ├── router/ # 路由配置 ├── stores/ # Pinia状态管理 ├── utils/ # 工具函数 ├── views/ # 页面组件 ├── App.vue └── main.js

回到顶部

三、安装必要依赖

npm install vue-router@4 pinia axios element-plus npm install -D unplugin-auto-import unplugin-vue-components

回到顶部

四、配置路由

// router/index.js import { createRouter, createWebHistory } from 'vue-router' const routes = [ { path: '/', component: () => import('@/layouts/MainLayout.vue'), children: [ { path: '', name: 'Home', component: () => import('@/views/Home.vue') }, { path: '/about', name: 'About', component: () => import('@/views/About.vue') }, ] }, { path: '/login', name: 'Login', component: () => import('@/views/Login.vue') } ] const router = createRouter({ history: createWebHistory(), routes }) export default router

回到顶部

五、状态管理(Pinia)

// stores/user.js import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const useUserStore = defineStore('user', () => { const token = ref(localStorage.getItem('token') || '') const userInfo = ref(null) const isLoggedIn = computed(() => !!token.value) function login(credentials) { // 登录逻辑 token.value = 'mock-token' localStorage.setItem('token', token.value) } function logout() { token.value = '' userInfo.value = null localStorage.removeItem('token') } return { token, userInfo, isLoggedIn, login, logout } })

回到顶部

六、API封装

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

回到顶部

七、Setup语法糖使用

<script setup> import { ref, computed, onMounted } from 'vue' import { useUserStore } from '@/stores/user' const userStore = useUserStore() const count = ref(0) const doubled = computed(() => count.value * 2) function increment() { count.value++ } onMounted(() => { console.log('组件挂载完成') }) </script> <template> <div> <p>Count: {{ count }}, Doubled: {{ doubled }}</p> <button @click="increment">增加</button> </div> </template>

回到顶部

八、常用组件示例

<!-- TableList.vue --> <script setup> defineProps({ data: { type: Array, default: () => [] }, loading: { type: Boolean, default: false } }) defineEmits(['row-click', 'delete']) </script> <template> <el-table :data="data" v-loading="loading" @row-click="$emit('row-click', $event)"> <slot /> </el-table> </template>

回到顶部

九、性能优化技巧

  • 路由懒加载:使用`() => import()`按需加载
  • 组件懒加载:`defineAsyncComponent`
  • KeepAlive:缓存组件状态
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 8:25:34

TextureSize节点]原理解析与实际应用

输出为着色器程序员提供了对纹理尺寸的完整控制能力&#xff0c;使得基于纹理像素精度的计算成为可能。在技术实现上&#xff0c;Texture Size 节点利用了 Unity 的内置变量系统&#xff0c;特别是 {texturename}_TexelSize 这一特殊属性。这个内置变量是 Unity 为每个纹理自动…

作者头像 李华
网站建设 2026/7/2 8:24:48

英雄联盟智能助手League Akari:提升游戏体验的终极工具包

英雄联盟智能助手League Akari&#xff1a;提升游戏体验的终极工具包 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于官…

作者头像 李华
网站建设 2026/7/2 8:23:44

终极崩坏星穹铁道自动化脚本:解放双手的完整指南

终极崩坏星穹铁道自动化脚本&#xff1a;解放双手的完整指南 【免费下载链接】StarRailCopilot 崩坏&#xff1a;星穹铁道脚本 | Honkai: Star Rail auto bot (简体中文/繁體中文/English/Espaol) 项目地址: https://gitcode.com/gh_mirrors/st/StarRailCopilot 你是否厌…

作者头像 李华