当前位置: 首页 > news >正文

【VUE3】搭建项目准备工作

0 目录

1 项目初始化

2 代码风格配置

3 提交代码检查配置

4 项目目录调整

5 安装ElementUI组件库

6 Pinia持久化

7 配置仓库统一管理

8 数据请求工具封装

9 路由设计

10 其他


1 项目初始化

1.1 使用脚手架创建项目

pnpm create vue

1.2 安装依赖

pnpm i

2 代码风格配置

见 【VUE3】Eslint 与 Prettier 的配置_eslint-plugin-prettier-CSDN博客 中的 8总结

注意:改完操作后记得重启,让最新的规则生效!


3 提交代码检查配置

3.1 初始化git

git init

3.2  安装husky

pnpm dlx husky-init && pnpm install

 3.3 安装lint-staged(只检查修改的文件)

pnpm i lint-staged -D

 3.4 配置packaged.json

{// ..."lint-staged": {"*.{js,ts,vue}": ["eslint --fix"]}
}{"scripts": {// ..."lint-staged": "lint-staged"}
}

3.5  修改 .husky/pre-commit 文件

pnpm lint-staged

4 项目目录调整

删除src文件夹中assets、components、stores、views目录下所有文件

删除router/index.js文件中的默认路由

清除App.vue、main.js中多余代码

在src中新建api、utils文件夹

创建assets/main.scss,可以在里面写全局样式

安装sass依赖

pnpm add sass -D

5 安装ElementUI组件库

5.1 安装命令

pnpm install element-plus

5.2 配置按需导入

5.2.1 安装依赖

pnpm install -D unplugin-vue-components unplugin-auto-import

5.2.2 插入代码

import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({// ...plugins: [// ...AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],
})

注意:在使用ElMessage组件时,不要手动导入,否则会与自动导入冲突,从而导致样式失效

示例:

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
// 配置按需导入
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueDevTools(),// 配置按需导入AutoImport({imports: ['vue', 'vue-router', 'pinia'],resolvers: [ElementPlusResolver()]}),Components({resolvers: [ElementPlusResolver()]})],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})

 注意:imports: ['vue', 'vue-router', 'pinia'],可以让与其相关的方法无需导入,本篇为未配置时的代码


6 Pinia持久化

6.1 安装依赖

pnpm add pinia-plugin-persistedstate -D

6.2 在main.js中使用

import persist from 'pinia-plugin-persistedstate'
...
app.use(createPinia().use(persist))

6.3 使用实例(先创建/stores/modules/user.js)

import { defineStore } from 'pinia'
export const useUserStore = defineStore('user',() => {const token = ref()return { token }},{ persist: true }
)

7 配置仓库统一管理

7.1 创建文件stores/index.js

将main.js中的pinia配置统一移到此处,并在main.js中导入(此处不演示)

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'// 导出pinia配置
export default createPinia().use(persist)
// 导出仓库模块(调用其他仓库时统一走该文件)
export * from '@/stores/modules/user.js'

7.2 在main.js中导入

// ...
import pinia from './stores/index.js'
//...
app.use(pinia)

8 数据请求工具封装

8.1 安装axios

pnpm add axios

8.2 新建utils/request.js文件,并创建实例与拦截器

文档:axois创建实例        axios拦截器

示例:

import axios from 'axios'
import { useUserStore } from '@/stores'const apiServer = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 100000 // 超时时间(ms)
})// 添加请求拦截器
apiServer.interceptors.request.use((config) => {// 请求发送前const userStore = useUserStore()// 挂载tokenif (userStore.token) config.headers.Authorization = userStore.tokenreturn config},(error) => {// 请求出错return Promise.reject(error)}
)// 添加响应拦截器
apiServer.interceptors.response.use((response) => {// 响应数据前// 业务处理成功if (response.data.status === 0) return response// 业务处理失败ElMessage({ message: response.data.message || '服务异常', type: 'error' })return Promise.reject(response.data)},(error) => {// 响应出错ElMessage({ message: response.data.message || '服务异常', type: 'error' })return Promise.reject(error)}
)export default apiServer

注意:

1. 可以无需安装dotenv类似的插件,直接创建.env文件配置环境变量

2. 给客户端使用的变量要加VITE_前缀

3. 通过import.meta.env.xxx直接使用,无需导入


9 路由设计

9.1 在App.vue中配置路由出口

<script setup></script><template><div><router-view></router-view></div>
</template><style scoped></style>

9.2 配置基础路由

示例:router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores'// createRouter 创建路由实例
// 配置 history 模式
// 1. history模式:createWebHistory     地址栏不带 #
// 2. hash模式:   createWebHashHistory 地址栏带 #
// console.log(import.meta.env.DEV)// vite 中的环境变量 import.meta.env.BASE_URL  就是 vite.config.js 中的 base 配置项
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{ path: '/login', component: () => import('@/views/login/LoginPage.vue') }, // 登录页{path: '/',component: () => import('@/views/layout/LayoutContainer.vue'),redirect: '/article/manage',children: [{path: '/article/manage',component: () => import('@/views/article/ArticleManage.vue')},{path: '/article/channel',component: () => import('@/views/article/ArticleChannel.vue')},{path: '/user/profile',component: () => import('@/views/user/UserProfile.vue')},{path: '/user/avatar',component: () => import('@/views/user/UserAvatar.vue')},{path: '/user/password',component: () => import('@/views/user/UserPassword.vue')}]}]
})export default router

9.3 配置导航守卫

示例:router/index.js

// 登录访问拦截 => 默认是直接放行的
// 根据返回值决定,是放行还是拦截
// 返回值:
// 1. undefined / true  直接放行
// 2. false 拦回from的地址页面
// 3. 具体路径 或 路径对象  拦截到对应的地址
//    '/login'   { name: 'login' }
router.beforeEach((to) => {// 如果没有token, 且访问的是非登录页,拦截到登录,其他情况正常放行const useStore = useUserStore()if (!useStore.token && to.path !== '/login') return '/login'
})

10 其他

10.1 安装图标库

pnpm i @element-plus/icons-vue

10.2 富文本编辑器

官网:VueQuill | Rich Text Editor Component for Vue 3

http://www.dtcms.com/a/303326.html

相关文章:

  • 艾格文服装软件怎么用?
  • Windows中查看GPU和Cuda信息的DOS命令总结
  • AI产品经理手册(Ch1-2)AI Product Manager‘s Handbook学习笔记
  • uvm sequence Arbitration
  • AI 驱动、设施扩展、验证器强化、上线 EVM 测试网,Injective 近期动态全更新!
  • git stash apply 冲突合并方法解决
  • 希尔排序(缩小增量排序)面试专题解析
  • unisS5800XP-G交换机配置命令之登录篇
  • 洛谷 P10448 组合型枚举-普及-
  • Visual Studio Code使用
  • 25世界职业院校技能大赛国内赛区承办名单确定,各赛区需全力筹备
  • 【Spring Boot 快速入门】二、请求与响应
  • CGA围手术期:全周期保障老年手术安全
  • 基于深度学习的医学图像分析:使用YOLOv5实现细胞检测
  • TI 2025全国电赛猜题
  • 刘润探展科大讯飞WAIC,讯飞医疗AI该咋看?
  • 【重学数据结构】二叉搜索树 Binary Search Tree
  • LINUX 728 SHELL:grep;sort;diff
  • MOE 速览
  • python入门篇12-虚拟环境conda的安装与使用
  • 拷贝漫画网页入口 - Copymanga漫画官方网站及APP下载
  • 接⼝测试⾯试题汇总
  • YOLO目标检测总结
  • EXCEL怎么使用数据透视表批量生成工作表
  • 【深度学习】深入理解交叉熵损失函数 (Cross-Entropy Loss Function)
  • Lambda表达式Stream流-函数式编程-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂
  • React与Rudex的合奏
  • 代码解读:微调Qwen2.5-Omni 实战
  • 从单枪匹马到联盟共生:白钰玮的 IP 破局之路|创客匠人
  • 2025创始人IP如何破局?