Vue3商城架构搭建
创建项目
使用 vite 创建Vue3项目
如果你使用过Webpack,你会发现,在启动开发服务器的时候,会将整个项目编译一遍。当项目的规模越来越大时,这样的编译过程往往十分耗时,光启动开发服务器就要几分钟。如果你修改了文件,可能修改在几秒后才会显示出来。
这极大的影响了开发体验。而且目前,主流的浏览器都已经支持 ES6 模块了。因此,在开发环境下,我们可以直接把模块编译成浏览器支持的ES6模块,然后通过浏览器的ES6模块加载机制来按需加载模块。这样,就无需提前编译整个项目,也无需添加额外的胶水代码,从而提高了开发环境下编译的速度。
Vite 就是使用了这样的方法,使得开发环境的编译速度非常快,开发服务器瞬间启动和更新。但考虑到性能和兼容性,在生产环境下, Vite 则采用 rollup 的方式进行打包。
使用 Vite3 创建Vue3+ts项目的命令:
1 | npm 7+, 需要额外的双横线: |
安装依赖
这里主要安装的依赖有路由、状态管理、网络请求、UI、字体图标、md5处理。
1 | yarn add vue-router@4 vuex@next element-plus axios vue-request @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/vue-fontawesome@prerelease js-md5 |
添加路径别名
默认情况下只支持模块和相对路径,添加 @ 和 ~ 两个路径别名:
1 | // vite.config.js |
页面路由配置
定义路由
- 定义一个普通的路由:path,name,component
- 路由元信息
meta属性,可以在上面定义网页标题、权限等信息 - 嵌套路由(和单纯路径上的嵌套的区别:每个有子节点的路由需要有组件,这个组件里面有
router-view才能保证子路由正常渲染) - 带参数的路由(匹配数字、匹配字符串、有限的字符串匹配)
- 重定向路由:path,name,redirect
- 路由传递 props
- 匹配404页面:
/:matched(.*)* - 嵌套路由规划方法:按照网页的布局来
1 | const routes: RouteRecordRaw[] = [ |
定义路由元信息的类型,以获得更好的IDE提示:
1 | // router.d.ts |
定义一个导航守卫修改网页标题
导航守卫,顾名思义就是一个“守卫”,守卫就是看城门的。在城门门口,守卫可以根据行人的来源和去向,或者其他信息,来决定是否放行。路由守卫,则是根据来源信息和去向信息,来决定是否允许进行路由跳转,或者把路由跳转到其他地方。
1 | router.afterEach((to) => { |
网络请求配置
配置环境变量
- 环境变量:保存程序运行时需要的一些通用的参数,如请求路径、应用名称,可以通过传入
.env文件,也可以使用系统的环境变量。 - 环境变量文件 (
dotenv)
.env.env.local(本地环境变量,不会放入Git地址).env.[环境](特点环境下被识别).env.[环境].local
- 环境变量命名规则:
VITE_开头才会被 vite 识别 - 引入环境变量:
import.meta.env.xxxx - IDE提示:新建
.d.ts文件,定义ImportMetaEnv接口
1 | # .env |
1 | // env.d.ts |
修改之前的路由守卫:
1 | router.afterEach((to) => { |
- 优点:方便使用容器技术构建(传入环境变量);对于像数据库密码等本地敏感数据,无需修改代码,只需放在
.env.local文件,就可以避免通过git提交泄露。 - 缺点:修改环境变量后需要重启服务器,生产环境下需要重新编译
axios 配置
- 创建一个实例
- 响应拦截器的设置,针对错误的响应,使用消息框进行提示
1 | import axios from "axios"; |
vue-request 配置
1 | // request.ts |
vite反向代理配置
Vite 的反向代理使用 node-http-proxy,而 vue-cli 使用的反向代理是 http-proxy-middleware
浏览器默认会阻止跨域(不同域名、端口、协议)请求,如果需要发送,要么在服务器添加响应头,要么在客户端设置代理,这里使用反向代理来将 /api 代理到服务器。
- target:代理目标
- changeOrigin:把
host改成目标网站,而不是代理服务器 - rewrite:路径重写
/api/users/1->/users/1->http://192.168.234.129:9876/users/1 - ws: 是否支持 websocket
1 | { |
增强类型识别
通过定义 defineAPI 函数,针对不同的请求进行重载:
- 对于 get 请求,通常需要
query, - 对于 post 请求,通常需要
body和query(可能)
对于 query、requestBody 和 responseBody ,可以定义三个泛型参数,在调用的时候传入泛型参数,这样返回的函数就有相应的类型提示了。
1 | // 定义通用请求格式 |
UI 配置
引入 element-plus
这里先全局引入 element-plus,后面我们再将其改成按需引入。
1 | import ElementPlus from 'element-plus'; |
引入 font-awesome
编写 font-awesome 插件:
- Vue 中的插件需要暴露一个
install方法,第一个参数是app实例,第二个参数是app.use传入的插件选项。 - 在插件中可以拓展
app实例的原型,定义一些组件或者引入一些混入mixin等。
1 | //plugins/font-awesome/index.ts |
页面布局
布局配置
- 布局方案:(使用 element-plus 布局容器+100vh高度)

1 | <el-container class="container"> |
导航菜单配置
- el-menu组件:
default-active(默认高亮)background-color(背景颜色)text-color(文字颜色)active-text-color(激活文字颜色)router(路由),将index作为path进行跳转collapse(菜单折叠)
- el-submenu组件:
#title存放标题和图标,标题用span标签- 菜单项使用默认插槽
- el-menu-item组件:(注意折叠问题)
- 图标:直接写组件默认插槽
- 文字:
#title插槽、span标签
1 | <el-menu |
导航高亮
el-menu 组件
default-active="$route.path"通过路由元信息定义高亮导航
1 | const {path, meta} = useRoute(); |
导航菜单折叠
- 设置导航区折叠:el-menu 的 collapse 属性
- 修改导航区宽度:el-aside 的 width 属性
- 折叠动画:对el-aside添加
transitionCSS 样式
辅助操作:后退和刷新页面
后退页面:
1 | <a class="header-action" href="javascript:;" @click="$router.go(-1)"> |
刷新页面(只刷新主要部分):
1 | <!--主要部分--> |
1 | const isShow = ref(true); |
由于Vue更新DOM是异步的,所有响应式的变更会保存在队列里,当本轮DOM更新周期结束的时候将队列里面所有的改变合并成一个,再来刷新DOM。而nextTick,则可以将一些状态变更的操作放在下一轮DOM更新周期中。
如果直接这样写:
1 | isShow.value = false; |
那么这两个状态变更将会被合并成一个,最终相当于只执行了:
1 | isShow.value = true; |
这和之前的状态是一样的,DOM不会发生变更,就不能实现刷新的效果了。
用户信息
- el-dropdown: #dropdown 插槽用来渲染菜单项
1 | <el-dropdown> |
管理员登录功能
页面布局
采用 flex+100vh 来实现垂直居中的布局效果。
1 | <div class="login-layout"> |
表单定义
- 定义表单数据
- 定义对表单本身的引用
- 定义表单验证规则
1 | const loginForm = reactive<LoginForm>({ |
表单页面:
1 | <el-form |
表单提交逻辑
- 引入路由跳转钩子
- 引入登录请求钩子
- 登录表单提交函数
1 | // 引入路由跳转钩子 |
路由权限验证
- 为无需用户验证的路由添加一个
allowAnonymous的meta。
1 | { |
- 定义路由守卫:检测
allowAnonymous属性或者token
1 | router.beforeEach((to, from, next) => { |
- 禁止已登录用户访问登录界面
1 | // 已登录绕过登录页面 |
用户登出
- 清空token
- 路由跳转
1 | const userInfo = useStore("mallUserInfo"); |
- 标题: Vue3商城架构搭建
- 作者: ObjectKaz
- 创建于: 2021-07-19 15:11:02
- 更新于: 2021-11-15 14:56:12
- 链接: https://www.objectkaz.cn/1e76e5b4a6b5.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。