以vue3+vite项目为例

项目地址

1.使用npm 创建(npm只是以个创建工具,你也可以使用yarn、pnpm、cnpm去创建)

  1. npm create vite@latest

image.png

清除App.vue中的文件,新建自己的模板,
清除components里面的文件,创建自己所需文件
清除main.ts里面的style样式文件,如图所示
main.png

在src下创建以下文档

image.png

api 用于存放发请求的接口 components 存放全局公共组件 layout 布局页面的左侧菜单栏、右侧的头部tabbar和主内容区,菜单的实现可以通过递归组件来实现 routes 存放路由相关的信息,如配置路由、设置页面的滚动行为等 store 用于存放公共数据,例如用户登录的唯一标识、用户信息等 styles 存放全局样式 utils 用于设置发请求的工具,如axios的二次封装,获取本地存储函数的封装 views 用于存放路由相关的文件和组件 空文件里面必须创建一个.gitkeep文件,防止代码提交到远程仓库显示此文件,(git提交到远程仓库,默认会忽略空文件,别人在拉去项目是会获取不到这些空文件,对后期开发很不友好)

重置样式表

地址https://www.npmjs.com/package/reset.scss?activeTab=code
可以去npm官网搜索reset.scss样式文件,在styles文件中引入即可,新建一个index.scss文件,用于汇总
配置scss的运行环境,在vite.config.ts文件中

  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. // https://vitejs.dev/config/
  4. export default defineConfig( {
  5. plugins: [vue()],
  6. // 样式全局变量的配置
  7. css: {
  8. preprocessorOptions: {
  9. scss: {
  10. javascriptEnabled: true,
  11. additionalData: '@import "./src/styles/variable.scss";',
  12. },
  13. },
  14. },
  15. }
  16. })

给文件夹起别名

  1. import path from 'path'
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. // https://vitejs.dev/config/
  5. export default defineConfig( {
  6. plugins: [vue()],
  7. resolve: {
  8. alias: {
  9. '@': path.resolve(__dirname, 'src'), // 相对路径别名配置,使用 @ 代替 src
  10. },
  11. },
  12. }
  13. })

在tsconfig.json文件中输入以下代码

  1. "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
  2. "paths": {
  3. //路径映射,相对于baseUrl
  4. "@/*": ["src/*"]
  5. }

配置路由

安装路由

  1. npm i vue-router

在router文件中进行使用
新建两个文件router.ts和index.ts

  1. // index.ts文件
  2. // 通过vue-router插件实现模板路由配置
  3. import { createRouter, createWebHashHistory } from 'vue-router'
  4. import { constantRoute } from './router'
  5. // 创建路由器
  6. const router = createRouter({
  7. // 设置路由模式
  8. history: createWebHashHistory(),
  9. routes: constantRoute,
  10. // 滚动行为
  11. scrollBehavior() {
  12. return {
  13. left: 0,
  14. top: 0,
  15. }
  16. },
  17. })
  18. export default router
  19. // router.ts文件的配置
  20. 主要的路由为首页、登录页、404页面、任意路由页面四个
  21. // 对外暴露配置路由(常量路由)
  22. export const constantRoute = [
  23. {
  24. // 登录
  25. path: '/login',
  26. component: () => import('@/views/login/index.vue'),
  27. name: 'Login',
  28. meta: {
  29. title: '登录',
  30. hidden: true, // true为隐藏,false为不隐藏
  31. },
  32. },
  33. {
  34. // 首页
  35. path: '/',
  36. component: () => import('@/layout/index.vue'),
  37. name: 'Home',
  38. meta: {
  39. title: '用户首页',
  40. hidden: false,
  41. },
  42. children: [
  43. {
  44. path: '/home',
  45. component: () => import('@/views/home/index.vue'),
  46. meta: {
  47. title: '首页',
  48. hidden: false,
  49. },
  50. }
  51. ],
  52. },
  53. {
  54. // 404页面
  55. path: '/404',
  56. component: () => import('@/views/404/index.vue'),
  57. name: '404',
  58. meta: {
  59. title: '404',
  60. hidden: true,
  61. },
  62. },
  63. {
  64. // 任意路由
  65. path: '/:pathMatch(.*)*',
  66. redirect: '/404',
  67. name: 'Any',
  68. meta: {
  69. title: '任意路由',
  70. hidden: true,
  71. },
  72. },
  73. ]
  74. // 在main.ts中注册路由
  75. // 引入路由
  76. import router from '@/router/index.ts'
  77. app.use(router)
  78. // 在app.vue文件中使用
  79. <template>
  80. <div>
  81. <router-view></router-view>
  82. </div>
  83. </template>

安装仓库

  1. npm i pinia

在store中新建一个index.ts文件,给文件为总store

  1. // 整个项目的大仓库
  2. import { createPinia } from 'pinia'
  3. // 创建大仓库
  4. const pinia = createPinia()
  5. // 对外暴漏,入口文件需要安装仓库
  6. export default pinia
  7. // 在mian.ts中进行注册
  8. // 引入pinia仓库
  9. import pinia from './store'
  10. app.use(pinia)

其他小store仓库

  1. // 创建用户相关的小仓库
  2. import { defineStore } from 'pinia'
  3. // 创建用户小仓库
  4. const useUserStore = defineStore('User', {
  5. // 存储数据的
  6. state: () => {
  7. return {}
  8. },
  9. // 异步逻辑
  10. actions: {
  11. },
  12. getters: {},
  13. })
  14. // 对外暴漏获取小仓库的方法
  15. export default useUserStore
  16. // 在其他组件使用
  17. // 引入用户相关的小仓库
  18. import useUserStore from '@/store/user'
  19. const userStore = useUserStore()

axios的二次封装

安装axios

  1. npm i axios

使用:

  1. // 引入axios
  2. import axios from 'axios'
  3. import { ElMessage } from 'element-plus'
  4. // 第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时时间)
  5. const request = axios.create({
  6. // 基础路径
  7. // baseURL: 'https://zzdj.zunzhongdj.cn/',
  8. baseURL: import.meta.env.VITE_APP_BASE_API,
  9. // 设置超时时间
  10. timeout: 5000,
  11. })
  12. // // 第二步:给request实例添加请求拦截器
  13. request.interceptors.request.use((config) => {
  14. // 返回配置对象
  15. return config
  16. })
  17. // 第三步:给request实例添加响应拦截器
  18. request.interceptors.response.use(
  19. (response) => {
  20. // 成功的回调
  21. // 简化数据
  22. return response.data
  23. },
  24. (error) => {
  25. // 失败的回调:处理http网络错误
  26. // 定义一个变量,存储网络错误信息
  27. let message = ''
  28. // http状态码
  29. const status = error.response.status
  30. switch (status) {
  31. case 401:
  32. message = 'TOKEN过期'
  33. break
  34. case 403:
  35. message = '无权访问'
  36. break
  37. case 404:
  38. message = '请求地址错误'
  39. break
  40. case 500:
  41. message = '服务器出现问题'
  42. break
  43. default:
  44. message = '网络出现错误'
  45. break
  46. }
  47. // 提示错误信息
  48. ElMessage({
  49. type: 'error',
  50. message,
  51. })
  52. return Promise.reject(error)
  53. },
  54. )
  55. // 对外暴露
  56. export default request

安装element-plus组件库

  1. npm install element-plus --save
  2. // 安装图标
  3. npm install @element-plus/icons-vue
  4. // 国际化处理,显示中文
  5. import ElementPlus from 'element-plus'
  6. import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
  7. app.use(ElementPlus, {
  8. locale: zhCn,
  9. })

vite.config.ts文件的配置

  1. import { defineConfig, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. //引入svg需要用到插件
  5. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  6. //mock插件提供方法
  7. import { viteMockServe } from 'vite-plugin-mock'
  8. // https://vitejs.dev/config/
  9. export default defineConfig(({ command, mode }) => {
  10. //获取各种环境下的对应的变量
  11. let env = loadEnv(mode, process.cwd())
  12. return {
  13. plugins: [
  14. vue(),
  15. // 配置svg图标
  16. createSvgIconsPlugin({
  17. iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
  18. symbolId: 'icon-[dir]-[name]',
  19. }),
  20. viteMockServe({
  21. // @ts-expect-error
  22. localEnabled: (command === 'build') | 'serve', //保证开发阶段可以使用mock接口
  23. }),
  24. ],
  25. resolve: {
  26. alias: {
  27. '@': path.resolve(__dirname, 'src'), // 相对路径别名配置,使用 @ 代替 src
  28. },
  29. },
  30. // 样式全局变量的配置
  31. css: {
  32. preprocessorOptions: {
  33. scss: {
  34. javascriptEnabled: true,
  35. additionalData: '@import "./src/styles/variable.scss";',
  36. },
  37. },
  38. },
  39. // 配置代理服务器
  40. //代理跨域
  41. server: {
  42. proxy: {
  43. [env.VITE_APP_BASE_API]: {
  44. //获取数据的服务器地址设置
  45. target: env.VITE_SERVE,
  46. //需要代理跨域
  47. changeOrigin: true,
  48. //路径重写
  49. rewrite: (path) => path.replace(/^\/api/, ''),
  50. },
  51. },
  52. },
  53. }
  54. })

环境的配置

在项目的更目录创建以下三个文件

  1. .env.development 开发环境
  2. .env.production 生产环境
  3. .env.test 测试环境

.env.development 开发环境

  1. # 变量必须以 VITE_ 为前缀才能暴露给外部读取
  2. NODE_ENV = 'development'
  3. VITE_APP_TITLE = 'Vue3 + Ts + Vite 后台管理'
  4. VITE_APP_BASE_API = '/api' //接口api前缀
  5. VITE_SERVE = "http://xxxxx"

.env.production 生产环境

  1. NODE_ENV = 'production'
  2. VITE_APP_TITLE = 'Vue3 + Ts + Vite 后台管理'
  3. VITE_APP_BASE_API = 'http://XXXX'
  4. VITE_SERVE="http://xxxxx"

.env.test 测试环境

  1. NODE_ENV = 'test'
  2. VITE_APP_TITLE = 'Vue3 + Ts + Vite 后台管理'
  3. VITE_APP_BASE_API = '/test-api'
  4. VITE_SERVE="http://xxxx"

集成svg图标

安装svg依赖

  1. npm install vite-plugin-svg-icons -D

在assets文件中新建一个icons文件夹,用来存放svg图标,使用方式:在组件中写入以下代码

  1. <!--图标的大小可以在svg上写style来控制 -->
  2. <svg>
  3. <use xlink:href="#icon-图标名称" fill="颜色名字"></use>
  4. </svg>

安装mock

  1. npm install -D vite-plugin-mock mockjs