vue3基础配置

242 阅读7分钟

文件资源目录 📚

├─ .husky                 # husky 配置文件
├─ .vscode                # VSCode 推荐配置
├─ build                  # Vite 配置项
├─ public                 # 静态资源文件(该文件夹不会被打包)
├─ src
│  ├─ api                 # API 接口管理
│  ├─ assets              # 静态资源文件
│  ├─ components          # 全局组件
│  ├─ config              # 全局配置项
│  ├─ directives          # 全局指令文件
│  ├─ enums               # 项目常用枚举
│  ├─ hooks               # 常用 Hooks 封装
│  ├─ languages           # 语言国际化 i18n
│  ├─ layouts             # 框架布局模块
│  ├─ routers             # 路由管理
│  ├─ stores              # pinia store
│  ├─ styles              # 全局样式文件
│  ├─ typings             # 全局 ts 声明
│  ├─ utils               # 常用工具库
│  ├─ views  或 pages             # 项目所有页面-路由组件
│  ├─ App.vue             # 项目主组件
│  ├─ main.ts             # 项目入口文件
│  └─ vite-env.d.ts       # 指定 ts 识别 vue
├─ .editorconfig          # 统一不同编辑器的编码风格
├─ .env                   # vite 常用配置
├─ .env.development       # 开发环境配置
├─ .env.production        # 生产环境配置
├─ .env.test              # 测试环境配置
├─ .eslintignore          # 忽略 Eslint 校验
├─ .eslintrc.cjs          # Eslint 校验配置文件
├─ .gitignore             # 忽略 git 提交
├─ .prettierignore        # 忽略 Prettier 格式化
├─ .prettierrc.cjs        # Prettier 格式化配置
├─ .stylelintignore       # 忽略 stylelint 格式化
├─ .stylelintrc.cjs       # stylelint 样式格式化配置
├─ CHANGELOG.md           # 项目更新日志
├─ commitlint.config.cjs  # git 提交规范配置
├─ index.html             # 入口 html
├─ LICENSE                # 开源协议文件
├─ lint-staged.config.cjs # lint-staged 配置文件
├─ package-lock.json      # 依赖包包版本锁
├─ package.json           # 依赖包管理
├─ postcss.config.cjs     # postcss 配置
├─ README.md              # README 介绍
├─ tsconfig.json          # typescript 全局配置
└─ vite.config.ts         # vite 全局配置文件

启动项目浏览器自动打开

//package.json
  "dev": "vite --open",

配置@路径

//vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
//引入node
import  path  from 'path'
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
})

使用TS需要安装@types/node,是ts的声明文件包,用于描述Node.js核心模块和常用的第三方库的类型信息

pnpm i @types/node

找到tsconfig.json配置文件,找到配置项compilerOptions,这一步作用是让IDE可以对路径智能提示

   "baseUrl": ".",
    "paths": {
      "@/*":["src/*"]
    },

#vue3导入模块报红解决方案——找不到模块“./XXX.vue”或其相应的类型声明 解决 vue3导入模块报红解决方案——找不到模块“./XXX.vue”或其相应的类型声明_import type { definecomponent } from 'vue'报错怎么解决-CSDN博客

配置Sass

pnpm i sass
pnpm install sass-loader -S`  
pnpm install style-loader -S

Snipaste_2023-11-14_20-07-09.png

在vite中用,配置全局变量,

然后在main.js引入 共享选项 | Vite 官方中文文档 (vitejs.dev)

 css: {
    preprocessorOptions: {
      scss: {
        additionalData: ``,
      },
    },
  },

1.png

清除默认样式npm下载

地址reset.scss - npm (npmjs.com) src/style/reset.scss

//清除默认样式
import '@/style/reset.scss'

配置全局组件

//配置全局组件
//引入
import HospitalTop from '@/components/hospital_top/index.vue'
app.component('HospitalTop', HospitalTop)

配置路由

安装

pnpm i vue-router

准备文件

  • src/pages pages 放路由组件
  • src/router/index.ts 配置路由
import { createRouter, createWebHashHistory } from 'vue-router'
//createRouter创建路由器实例,管理多个路由
export default createRouter({
  //路由模式
  history: createWebHashHistory(),
  //管理路由
  routes: [
    {
      path: '/home',
      component: () => import('@/pages/home/index.vue'),
    },
    {
      path: '/hospital',
      component: () => import('@/pages/hospital/index.vue'),
    },
    //为根,重定向到home
    {
      path: '/',
      redirect: '/home',
    },
  ],
    //滚动行为:控制滚动条位置,切换组件回到顶部
  scrollBehavior() {
    return {
      left: 0,
      top: 0,
    }
  },
})

在main.ts配置

//引入vue-router核心插件并安装
import router from '@/router/index'
//安装vue-router
app.use(router)

APP.vue中展示

//APP.vue文件
<template>
  <div class="container">
    <!-- 顶部全局组件 -->
    <HospitalTop></HospitalTop>
    <!-- 展示路由组件 -->
    <div class="content">
    //展示区域
      <router-view></router-view>
    </div>
    <!-- 底部全局组件 -->
    <HospitalBottom></HospitalBottom>
  </div>
</template>

路由跳转

<script setup lang="ts" >
import { useRouter } from 'vue-router'
//创建路由器实例
let $router = useRouter()
const goDetail = () => {
    $router.push({ path: '/hospital' })
}
</script>

UI组件

配置element-plus

快速开始 | Element Plus (element-plus.org)

pnpm i element-plus

配置main.ts (全局引入)

//引入element-plus插件与样式,及国际化
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
//Element Plus 提供了全局配置国际化的配置(默认英文)
//@ts-ignore忽略当前文件ts类型的检测否则有红色提示(打包会失败); mjs没有ts类型
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'

//安装
// app.use(ElementPlus);
app.use(ElementPlus, {
  locale: zhCn,
})

按需引入

npm install -D unplugin-vue-components unplugin-auto-import
#### Volar

如果您使用 Volar,请在 `tsconfig.json` 中通过 `compilerOptions.type` 指定全局组件类型

如果您使用 Volar,请在 tsconfig.json 中通过 compilerOptions.type 指定全局组件类型。这样在ts里就有输入提示

// tsconfig.json
{
  "compilerOptions": {
    // ...
    "types": ["element-plus/global"]
  }
}

很有可能报错:-------------# 找不到“element-plus/global”的类型定义文件。 程序包含该文件是因为: 在 compilerOptions 中指定的类型库 “element-plus/global“

在src下新建vite-env.d.ts文件 解决方案是修改 vite-env.d.ts,增加:

declare module "*.vue" {
  import { DefineComponent } from "vue"
  const component: DefineComponent<{}, {}, any>
  export default component
}

按需引入element图标

 pnpm install @element-plus/icons-vue

文件中使用

<script setup lang="ts" >
//按需引入
import { Search,Edit } from '@element-plus/icons-vue'
</script>

注册所有图标#

您需要从 @element-plus/icons-vue 中导入所有图标并进行全局注册。

// main.ts

// 如果您正在使用CDN引入,请删除下面一行。
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}

Vant3

快速上手 - Vant 3 (gitee.io)

npm i vant

配置axios

pnpm i axios

二次封装 src/utils/request.ts 工具性文件放到utils中

你工作的时候是否axios进行二次封装?二次封装的目的是什么?

1:利用axios请求、响应拦截器功能

2:请求拦截器,一般可以在请求头中携带公共的参数:token

3:响应拦截器,可以简化服务器返回的数据,处理http网络错误

//进行axios二次封装:使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
//引入用户相关的仓库
import useUserStore from '@/store/modules/user'
//第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间)
const request = axios.create({
  //基础路径
  baseURL: '/api', //基础路径上会携带/api
  timeout: 5000, //超时的时间的设置,超时就失败
})
//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
  //获取用户相关的小仓库:获取仓库内部token,登录成功以后携带给服务器
  const userStore = useUserStore()
  if (userStore.token) {
    config.headers.token = userStore.token

    // console.log(userStore.token)
  }
  //config配置对象,headers属性请求头,经常给服务器端携带公共参数
  //返回配置对象
  //config
  return config
})

//第三步:响应拦截器
request.interceptors.response.use(
  (response) => {
    //成功回调
    //简化数据
    return response.data
  },
  (error) => {
    //失败回调:处理http网络错误的
    //定义一个变量:存储网络错误信息
    let message = ''
    //http状态码
    const status = error.response.status
    switch (status) {
      case 401:
        message = 'TOKEN过期'
        break
      case 403:
        message = '无权访问'
        break
      case 404:
        message = '请求地址错误'
        break
      case 500:
        message = '服务器出现问题'
        break
      default:
        message = '网络出现问题'
        break
    }
    //提示错误信息
    ElMessage({
      type: 'error',
      message,
    })
    return Promise.reject(error)
  },
)
//对外暴露
export default request

配置代理跨域

开发服务器选项 | Vite 官方中文文档 (vitejs.dev)

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import path from 'path'
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
  //代理跨越
  server: {
    port: 8002, //端口号
    host: '0.0.0.0',
    open: true, //自动打开
    proxy: {
      '/api': {
        target: 'http://syt.atguigu.cn', //服务器地址
        changeOrigin: true, // 是否改变请求头中的Origin字段,默认为false  
        rewrite: (path) => path.replace(/^\/api/, '') // 路径重写规则,将所有以/api开头的请求路径去掉/api前缀  
      }  
      },
    },
  },
})

配置pinia

pnpm i pinia

import { createPinia } from 'pinia'
//对外暴露大仓库
export default createPinia()
//引入
import pinia from '@/store/index'
//安装仓库
app.use(pinia)
//定义小仓库  在仓库中发请求获取数据,存储,为其它组件提供数据
import { defineStore } from 'pinia'
//组合式写法
const useDetailStore = defineStore('Detail', {
  state: () => {
    return {}
  },
  actions: {},
  getters: {},
})
export default useDetailStore

组件中使用


import useDetailStore from '@/store/modules/hospitalDetail'
//获取仓库对象
let detailStore = useDetailStore()
detailStore.  //使用仓库中的数据/方法

使用animate.css动画库

pnpm i animate.css -S

<Transition :duration="500" 
    leave-active-class="animate__animated animate__backOutLeft">
</Transition>

<script lang="ts" setup>
//引入   
import 'animate.css'
</script>

使用lodash

pnpm i lodash -S
在Ts在使用还需要装声明文件
pnpm i  @types/lodash -D
使用
// 全量引入
import * as _ from "lodash"
// 实际开发中推荐按需引入,减少打包体积
import join from "lodash/join"

配置echarts

npm install echarts

配置ESLint

1.安装

npm install eslint -D

2.执行

 npx seslint --init

选择要检查的内容(箭头切换)

1.检查语法

2.检查语法并发现问题

3.检查语法并发现问题,并强制执行代码风格

Snipaste_2024-01-17_15-10-41.png

进行配置选项

Snipaste_2024-01-17_15-16-18.png

package.json

Snipaste_2024-01-17_15-16-53.png

配置国际化i18n

element-plus 配置国际化 Snipaste_2024-01-22_18-59-57.png

i18n

安装 |Vue I18n的 (intlify.dev)

npm install vue-i18n@next -s

在 src 目录下新建 lang 文件夹,并包含index.ts , lang / en.ts , lang / zh.ts(做中英文切换)

1.创建实例

Snipaste_2024-01-24_21-59-38.png 2.挂载app上 Snipaste_2024-01-22_18-47-00.png

3.使用

Snipaste_2024-01-24_22-00-07.png

配置Vueuse

起步 | VueUse中文文档 (vueusejs.com)

npm i @vueuse/core