当前位置:   article > 正文

2024最新版Vue3+Ts+Vite初始化项目框架(保姆级)

vite

一,什么是vite

Vite (法语意为 "快速的",发音 /vit/),新型前端构建工具。

官网地址:Vite | 下一代的前端工具链

二,为什么用vite

一句话总结:使用vite构建项目,启动的速度要比使用webpack构建更快。

  • 之前浏览器是不支持ES Modules的,为了在让浏览器能够运行我们写的代码(es6语法、.jsx/.vue文件),我们需要使用打包工具,例如webpack,来实现代码的转换和优化的过程;
  • 在浏览器支持ES Modules后,import、export、<script type='modules'>等成为vite出现的条件;
  • vite 主要对应的场景是开发模式,它只启动一台静态页面的服务器,对文件代码不打包,服务器会根据客户端的请求加载不同的模块处理;
  • 底层实现上,Vite 是基于 esbuild 预构建依赖的。当声明一个script标签类型为module时,浏览器将对其内部的import引用发起HTTP请求获取模块内容;
  • Vite 劫持了这些请求,并在后端进行相应的处理(如处理.ts文件为.js文件),然后再返回给浏览器;
  • 由于浏览器只会对用到的模块发起 HTTP 请求,所以 Vite 没必要对项目里所有的文件先打包后返回,而是只编译浏览器发起 HTTP 请求的模块即可。也就实现了所谓的按需加载。

三,安装vite

使用 npm 或 yarn 全局安装vite

  1. 使用 npm

  2. npm install -g create-vite

四,创建项目

准备一个空文件夹,执行以下命令

create-vite 项目名称 --template vue-ts

安装项目依赖

进入到项目目录

cd your-project-name

安装项目依赖

npm install

启动项目
npm run dev

五,配置路径别名

安装path的依赖

  1. 使用npm管理
  2. npm install --save-dev @types/node

在vite.config.ts中添加如下配置

  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. export default defineConfig({
  5. plugins: [vue()],
  6. resolve:{
  7. // 导入以下文件可以不用后缀名
  8. extensions:['.vue','.ts'],
  9. // 配置路径别名
  10. alias:{
  11. "@":path.resolve(__dirname,"src")
  12. }
  13. },
  14. })

在src目录下新建view文件夹,存放后续相关页面文件

将 home 在 App.vue页面引入

此时出现如下红线,但是,运行项目可以正常显示,我们接着需要修改tsconfig.json文件

修改tsconfig.json 文件,添加我们前面修改的映射

  1. // 基准 URL,用于解析非相对模块名
  2. "baseUrl": ".",
  3. // 配置@
  4. "paths": {
  5. "@/*":["src/*"]
  6. }

完整代码如下:

  1. {
  2. "compilerOptions": {
  3. // 目标ECMAScript版本
  4. "target": "ES2020",
  5. // 启动类字段定义
  6. "useDefineForClassFields": true,
  7. // 模版类型
  8. "module": "ESNext",
  9. // 编译时可用的库
  10. "lib": ["ES2020", "DOM", "DOM.Iterable"],
  11. // 跳过声明文件的类型检查
  12. "skipLibCheck": true,
  13. /* Bundler mode 打包器模式*/
  14. // 模块解析策略(在 bundler 模式下使用)
  15. "moduleResolution": "bundler",
  16. // 允许导入 TypeScript 文件时省略后缀
  17. "allowImportingTsExtensions": true,
  18. // 允许导入 JSON 文件作为模块
  19. "resolveJsonModule": true,
  20. // 将每个文件视为独立的模块
  21. "isolatedModules": true,
  22. // 不生成输出文件
  23. "noEmit": true,
  24. // 保留 JSX 代码
  25. "jsx": "preserve",
  26. /* Linting */
  27. // 开启所有严格类型检查选项
  28. "strict": true,
  29. // 报告未使用的局部变量
  30. "noUnusedLocals": true,
  31. // 报告未使用的函数参数
  32. "noUnusedParameters": true,
  33. // 报告在 switch 语句中的 case 语句贯穿
  34. "noFallthroughCasesInSwitch": true,
  35. // 基准 URL,用于解析非相对模块名
  36. "baseUrl": ".",
  37. // 配置@
  38. "paths": {
  39. "@/*":["src/*"]
  40. }
  41. },
  42. // 需要进行编译的文件路径模式
  43. "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
  44. // 引用其他 TypeScript 配置文件的路径
  45. "references": [{ "path": "./tsconfig.node.json" }]
  46. }

六,封装Axios

第一步:我们先安装axios

npm install axios @types/axios --save

第二步:在vite.config.ts文件配置代理

  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. // https://vitejs.dev/config/
  5. export default defineConfig({
  6. plugins: [vue()],
  7. resolve:{
  8. // 导入以下文件可以不用后缀名
  9. extensions:['.vue','.ts'],
  10. // 配置路径别名
  11. alias:{
  12. "@":path.resolve(__dirname,"src")
  13. }
  14. },
  15. server:{
  16. // 配置代理
  17. proxy:{
  18. "/api":{
  19. target:'http://localhost:3000',//设置代理目标
  20. changeOrigin:true,//是否改变请求源地址
  21. rewrite: (path) => path.replace(/^\/api/,''),//将/api 替换成空字符串
  22. }
  23. }
  24. },
  25. })

第三步:新建utils文件夹,在文件夹中添加http.ts文件用于配置axios

http.ts代码如下

  1. // 配置axios
  2. import axios from 'axios'
  3. import type { AxiosRequestConfig,AxiosResponse,AxiosError } from 'axios'
  4. // 创建axios实例
  5. const instance = axios.create({
  6. baseURL:'/api',//设置API的基础URL
  7. timeout:3000,
  8. })
  9. // 请求拦截器
  10. instance.interceptors.request.use(
  11. (config:AxiosRequestConfig):any => {
  12. // 获取请求头
  13. const headers = config.headers || {};
  14. // 向请求头添加token
  15. headers['Authorization'] = 'token'
  16. config.headers = headers
  17. return config;
  18. },
  19. (error:AxiosError) => {
  20. // 处理请求错误
  21. return Promise.reject(error)
  22. }
  23. )
  24. // 响应拦截器
  25. instance.interceptors.response.use(
  26. (response: AxiosResponse) => {
  27. // 对响应数据进行处理
  28. return response;
  29. },
  30. (error: AxiosError) => {
  31. // 处理响应错误
  32. return Promise.reject(error);
  33. }
  34. );
  35. // 导出axios请求方法
  36. // GET
  37. export function GET<T>(url: string, params?: any) {
  38. return instance.get<T>(url, { params })
  39. }
  40. // POST
  41. export function POST<T>(url: string, data?: any) {
  42. return instance.post<T>(url, data)
  43. }
  44. // PUT
  45. export function PUT<T>(url: string, data?: any) {
  46. return instance.put<T>(url, data)
  47. }
  48. //Delete
  49. export function Delete<T>(url: string) {
  50. return instance.delete<T>(url)
  51. }

第四步:新建api文件夹,用于存放接口 结构如下:

api/user.ts 用户相关接口

  1. import { POST } from '@/utils/http'
  2. import type { UserRequest } from '../types/user.d'
  3. // 测试使用
  4. export function userRequest(data: UserRequest) {
  5. return POST('/users', data); //测试接口
  6. }

types/user.d.ts定义接口ts类型

  1. export interface UserRequest{
  2. pageNum?:number,
  3. pageSize?:number,
  4. }

第五步:在页面中使用

  1. import {onMounted} from 'vue'
  2. import { userRequest } from '@/apis/api/user'
  3. // 测试请求
  4. const GetUser = () => {
  5. userRequest({pageNum:1,pageSize:10}).then(res => {
  6. console.log(res)
  7. }).catch(err => {
  8. console.log(err)
  9. })
  10. }
  11. onMounted(() => {
  12. GetUser()
  13. })

七,在项目中使用pinia

下载pinia

npm install pinia

pinia持久化插件

npm i pinia-plugin-persistedstate -S

在src文件夹下面新建stores文件夹,然后在stores新建index.ts和modules文件夹

index.ts代码如下:

  1. // pinia配置
  2. import { createPinia } from "pinia"; // 引入pinia
  3. import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' //引入持久化插件
  4. const pinia = createPinia() // 创建pinia实例
  5. pinia.use(piniaPluginPersistedstate) //将插件添加到 pinia 实例上
  6. export default pinia

在main.ts中挂载pinia
 

  1. import { createApp } from 'vue'
  2. // pinia
  3. import pinia from './stores/index'
  4. import App from './App.vue'
  5. const app = createApp(App)
  6. app.use(pinia)
  7. app.mount('#app')

在modules文件夹先新建UserInfo.ts 用于存储用户信息,代码如下:

  1. import {defineStore} from 'pinia'
  2. const useUserInfo = defineStore('UserInfo',{
  3. state:()=>({
  4. // 用户信息
  5. UserInfo:{name:"张三"}
  6. }),
  7. actions:{
  8. // 修改用户详情
  9. UpdataUserInfo(data:any) {
  10. this.UserInfo = data
  11. }
  12. },
  13. getters:{},
  14. // persist: true, 默认将整个UserInfo持久化存储
  15. persist: {
  16. key: 'UserInfo', //存储名称
  17. storage: localStorage, // 存储方式
  18. paths: ['UserInfo'], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
  19. }
  20. })
  21. export default useUserInfo

在页面中使用UserInfo

  1. <template>
  2. <!-- 在页面中使用 -->
  3. <div class="container">{{ UserInfoStore.UserInfo.name }}</div>
  4. </template>
  5. <script setup lang="ts">
  6. // 引入用户信息模块
  7. import useUserInfo from '@/stores/modules/UserInfo'
  8. const UserInfoStore = useUserInfo()
  9. </script>

八,配置vue-router

下载依赖

npm install vue-router -S

在src下新建router文件夹,新建index.ts

index.ts代码如下:

  1. // 路由配置
  2. import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
  3. // 首页
  4. import HomeView from '@/view/Home/index.vue'
  5. const routes: Array<RouteRecordRaw> = [
  6. {
  7. path:'/',
  8. name:'Home',
  9. component:HomeView,
  10. }
  11. ]
  12. const router = createRouter({
  13. history:createWebHistory(),
  14. routes
  15. })
  16. // 路由守卫
  17. router.beforeEach((to,from,next) => {
  18. next()
  19. })
  20. export default router

在main.ts中挂载

  1. import { createApp } from 'vue'
  2. // 路由配置
  3. import router from './router'
  4. // pinia
  5. import pinia from './stores/index'
  6. import App from './App.vue'
  7. const app = createApp(App)
  8. app.use(router)
  9. app.use(pinia)
  10. app.mount('#app')

九,移入Element-plus组件库

官网地址:安装 | Element Plus

安装:

npm install element-plus --save

在项目中完整引入,我这里是完整引入,需要按需引入的小伙伴可以到官网查看

  1. import { createApp } from 'vue'
  2. // Element-plus组件库
  3. import ElementPlus from 'element-plus'
  4. import 'element-plus/dist/index.css'
  5. // 路由配置
  6. import router from './router'
  7. // pinia
  8. import pinia from './stores/index'
  9. import App from './App.vue'
  10. const app = createApp(App)
  11. app.use(ElementPlus)
  12. app.use(router)
  13. app.use(pinia)
  14. app.mount('#app')

在页面使用

  1. <template>
  2. <!-- 在页面中使用 -->
  3. <div class="container">
  4. {{ UserInfoStore.UserInfo.name }}
  5. <el-button type="primary">Primary</el-button>
  6. <el-button type="success">Success</el-button>
  7. <el-button type="info">Info</el-button>
  8. <el-button type="warning">Warning</el-button>
  9. <el-button type="danger">Danger</el-button></div>
  10. </template>
  11. <script setup lang="ts">
  12. // 引入用户信息模块
  13. import useUserInfo from '@/stores/modules/UserInfo'
  14. const UserInfoStore = useUserInfo()
  15. </script>

效果:

十,总结

项目已经构建完成,包含所有的需要的基本的插件

有任何问题都可以在评论区评论!我们一起讨论解决

最后:

在项目中集成scss

npm i sass sass-loader

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/991135
推荐阅读
相关标签
  

闽ICP备14008679号