Vue3 + Vite + Element Plus 项目搭建(全)

1 前言

本文使用 Vue3 + Vite + Element Plus + Vue Router + Pinia + Typescript 搭建项目

2 项目初始化

npm init vue@latest

在这里插入图片描述

推荐使用 pnpm ,未安装 pnpm 可使用 npm

cd vue-project
pnpm i
pnpm dev

在这里插入图片描述

3 代码风格处理

最新版本的脚手架已添加代码风格处理,若无修改可不做此步骤

  • 将 .prettierrc.json 修改文件类型为 .prettierrc.js ,并将文件内容替换为:
module.exports = {
  singleQuote: true, // 使用单引号
  semi: false, // 行尾不需要有分号
  trailingComma: 'none', // 行尾不需要有逗号
  endOfLine: 'auto', // 换行符使用 lf
  printWidth: 100 // 一行最多 100 字符
}
  • .eslintrc.cjs 添加 rules ,解决 eslint 和 prettier 冲突
rules: {
  'prettier/prettier': [
    'warn',
    {
      singleQuote: true,
      trailingComma: false
    }
  ]
}

4 依赖安装

  • 功能相关依赖
pnpm i element-plus axios
  • 自动导入相关依赖
pnpm i unplugin-auto-import unplugin-vue-components unplugin-icons -D

5 自动导入

vite.config.ts 文件添加以下内容:
在这里插入图片描述

tsconfig.json 文件 includes 增加 “types”,避免 ts 报错找不到名称“ref”

"include": ["env.d.ts", "src/**/*", "src/**/*.vue", "types"]

6 路由拦截

router/index.ts 文件添加以下内容:

// 路由拦截
router.beforeEach((to, from, next) => {
  const token: string | null = getUser('token')
  // 已经登录过请求 login 界面会直接回到首页
  if (token) {
    to.path === '/login' ? next('/') : next()
    return
  }
  // 请求需要权限的界面,会转到 login 界面
  if (to.meta.requireAuth) {
    next({
      path: '/login',
      replace: true
    })
    return
  }
  next()
})

7 新增环境变量配置文件

  • 根目录下新增 .env.development 文件
# 开发环境

# 配置文件路径
VITE_PUBLIC_PATH = /

# 接口代理
VITE_PROXY_DOMAIN = /api

# 后端地址
VITE_PROXY_DOMAIN_REAL = http://192.168.60.66:8000
  • 根目录下新增 .env.production 文件
# 生产环境

# 项目打包路径
VITE_PUBLIC_PATH = ./

# 后端地址
VITE_PROXY_DOMAIN_REAL = /api

8 axios 封装

新增 utils/http/index.ts 文件

import axios from 'axios'
import type { AxiosError, AxiosResponse } from 'axios'
import router from '@/router'

enum Msgs {
  '操作成功' = 200,
  '无权操作' = 401,
  '系统内部错误' = 500
}

// 避免多个接口401弹出多个弹框
let isRefreshing = false

const { DEV, VITE_PROXY_DOMAIN, VITE_PROXY_DOMAIN_REAL } = import.meta.env
// 创建http实例
const instance = axios.create({
  baseURL: DEV ? VITE_PROXY_DOMAIN : VITE_PROXY_DOMAIN_REAL,
  timeout: 2000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 添加请求拦截器
instance.interceptors.request.use((config) => {
  config.headers = config.headers || {}
  // const token = getToken()
  // if (token) {
  //   config.headers['User-Token'] = token
  // }
  return config
})

// 添加响应拦截器
instance.interceptors.response.use(
  (res: AxiosResponse) => res,
  (err: AxiosError) => {
    const { response } = err
    if (!response) return Promise.reject(err)
    const errCodes = [401, 403, 500]
    const code = response.status
    if (errCodes.includes(response.status)) {
      // removeUserInfo()
      ElMessageBox({
        message: Msgs[code],
        title: '提示'
      })
        .then(() => {
          router.push('Login')
        })
        .finally(() => (isRefreshing = false))
      return Promise.reject(err)
    }
    ElMessage(Msgs[code] || '请求失败')
    return Promise.reject(err)
  }
)

const http = {
  get: (url = '', params = {}) => instance.get(url, { params }),
  post: (url = '', data = {}, config = {}) => instance.post(url, data, config),
  put: (url = '', data = {}) => instance.put(url, data),
  delete: (url = '', data = {}) => instance.delete(url, data),
  patch: (url = '', data = {}) => instance.patch(url, data)
}

export default http

使用:

import http from '@/utils/http'

http.get('user').then((res) => {
  console.log(res)
})

9 启动及生产打包配置

修改 vite.config.ts 文件

import { fileURLToPath, URL } from 'node:url'
import { loadEnv, ConfigEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite' // 自动导入
import Components from 'unplugin-vue-components/vite' // 组件注册
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' // elementPlus
import Icons from 'unplugin-icons/vite' // icon相关
import IconsResolver from 'unplugin-icons/resolver' // icon相关

export default ({ mode }: ConfigEnv) => {
  const { VITE_PUBLIC_PATH, VITE_PROXY_DOMAIN, VITE_PROXY_DOMAIN_REAL } = loadEnv(
    mode,
    process.cwd()
  )
  return {
    base: VITE_PUBLIC_PATH, //打包路径
    plugins: [
      vue(),
      AutoImport({
        imports: ['vue', 'vue-router'],
        dts: fileURLToPath(new URL('./types/auto-imports.d.ts', import.meta.url)),
        resolvers: [
          ElementPlusResolver(),
          // 自动导入图标组件
          IconsResolver({
            prefix: 'Icon'
          })
        ]
      }),
      Components({
        dirs: ['src/views', 'src/layout', 'src/components'],
        dts: fileURLToPath(new URL('./types/components.d.ts', import.meta.url)),
        resolvers: [
          ElementPlusResolver(),
          IconsResolver({
            enabledCollections: ['ep'] // 重点
          })
        ]
      }),
      Icons({
        autoInstall: true
      })
    ],
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      }
    },
    // 启动服务配置
    server: {
      host: '0.0.0.0',
      port: 8000,
      open: false,
      https: false,
      proxy: {
        [VITE_PROXY_DOMAIN]: {
          target: VITE_PROXY_DOMAIN_REAL,
          changeOrigin: true,
          rewrite: (path: string) => path.replace(/^\/api/, '')
        }
      }
    },
    // 生产环境打包配置
    build: {
      minify: 'terser',
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true
        }
      },
      rollupOptions: {
        output: {
          chunkFileNames: 'js/[name]-[hash].js',
          entryFileNames: 'js/[name]-[hash].js',
          manualChunks(id: string | string[]) {
            if (id.includes('node_modules')) {
              const arr = id.toString().split('node_modules/')
              return arr[arr.length - 1].split('/')[0].toString()
            }
          }
        }
      }
    }
  }
}

10 极速搭建

使用 yana-cli 脚手架,该脚手架提供了 vue3 模板,已搭建好以上所有内容
在这里插入图片描述

npm i yana-cli
yana-cli create
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vue3 是一种用于构建用户界面的开源JavaScript 框架。它提供了许多功能和工具,使用户能够更轻松地创建可交互、响应式的应用程序。Vue3 采用了一些新的语法和技术,使其在性能和开发效率方面有了明显的改进。 Vite4 是一个基于原生ES模块解析的构建工具。它具有快速冷启动和快速热更新的能力,使开发人员能够更快速地进行开发和调试。与传统的打包工具不同,Vite4 通过在浏览器运行时进行模块解析,避免了不必要的打包和编译步骤,提供了更加流畅的开发体验。 Element Plus 是一个基于Vue3 的组件库,提供了丰富的UI组件和交互式工具,可以帮助开发人员快速构建出现代化的Web界面。Element Plus 是Element UI 的升级版,针对Vue3 进行了优化和改进,提供了更好的性能和更丰富的功能。 TypeScript 是一种强类型的JavaScript 超集,允许开发人员在JavaScript 代码中添加静态类型注解。这样可以在开发过程中提早发现错误并提供更好的代码提示。Vue3 通过与TypeScript 的集成,使开发人员能够使用类、接口、泛型等高级特性来构建更健壮的应用程序。 综上所述,Vue3、Vite4、Element Plus 和 TypeScript 的结合,可以提供一个高效、灵活和强大的开发环境。开发人员可以利用Vite4 的快速构建能力和热更新功能,结合Element Plus 提供的丰富组件,通过TypeScript 的类型检查和提示,更加轻松地构建出现代化的Vue 应用程序。 ### 回答2: Vue 3 是一款非常流行的 JavaScript 框架,用于构建现代化的用户界面。它的核心思想是组件化开发,通过将界面拆分成独立的组件,使开发者能够更好地管理和重用代码。 Vite 4 是 Vue 3 的一个新型构建工具,用于快速构建现代化的前端应用。相比传统的打包工具,Vite 4 支持开箱即用的单文件组件,可以进行更快的热重载和快速启动,从而提高开发效率。 Element Plus 是一套基于 Vue 3 的UI组件库,它提供了大量的高质量的组件,可以用于构建漂亮、响应式的用户界面。Element Plus 的组件易于使用,灵活且高度可定制,适合开发各种类型的应用。它还提供了强大的工具和样式库,使开发者能够更轻松地定制和管理应用的外观和风格。 TypeScript 是一个强类型的 JavaScript 超集,它为开发者提供了更强大的类型检查和代码提示功能。与 JavaScript 不同,TypeScript 在编码过程中能够捕获一些常见的错误,帮助开发者提高代码的质量和可维护性。TypeScript 还支持最新的 JavaScript 特性,并且可以与 Vue 3、Vite 4 和 Element Plus 等工具和库完美集成。 综合上述所述,结合 Vue 3、Vite 4、Element Plus 和 TypeScript 可以实现一种高效、可维护和易于定制的开发方式。开发者可以使用 Vite 4 快速创建 Vue 3 项目,同时借助 Element Plus 的丰富组件库来构建出漂亮的用户界面。而 TypeScript 则提供了更强大的类型检查和代码提示,避免一些潜在的bug,提高开发效率。通过组合使用这些工具和库,可以实现更快速、更可靠的前端开发体验。 ### 回答3: Vue3是一种流行的JavaScript框架,它具有响应式和组件化的特性,使开发者可以轻松构建现代化的Web应用程序。Vite4是Vue3的一个新的构建工具,旨在提供更快的启动和热重载,以及更好的开发体验。 Element Plus是一个基于Vue3的UI库,它提供了一套美观、易用和高性能的组件,用于构建优雅的用户界面。它使用了TypeScript来提供类型检查和智能提示,这使得在使用Element Plus时能更加轻松地进行开发。 TypeScript是一种由微软开发的编程语言,它是JavaScript的超集,添加了静态类型支持。它允许开发者在编写代码时进行类型检查,并提供了更好的代码补和智能感知功能。在Vue3和Element Plus使用TypeScript可以提高代码的可读性和可维护性,并减少错误和调试时间。 综上所述,Vue3、Vite4、Element Plus和TypeScript是一组强大的工具和库,可以帮助开发者更快速、高效地构建现代化的Web应用程序。它们的结合提供了优秀的开发体验,并能够轻松满足各种UI需求。无论是构建大型企业应用还是小型个人项目,它们都是很好的选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值