vue3+vite+ts+router4+Pinia+Axios+sass 从0到1搭建

news/2025/1/20 13:12:58/

1、使用vite构建项目

npm create vite@latest

填写项目名的时候不能大写

2、跑起来之后配置下@

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
// https://vite.dev/config/
export default defineConfig({plugins: [vue()],resolve: {alias: {'@': resolve(__dirname, 'src') // 设置 `@` 指向 `src` 目录}},
})

 配置之后会跑一个类型没有声明的错误,path 模块是 Node.js 的一部分,因此如果你使用 TypeScript,需要安装 Node.js 的类型声明文件

npm install --save-dev @types/node

 下载这个就能解决爆红的问题了

3、建立标准目录

├── publish/
└── src/
    ├── assets/                    // 静态资源目录
    ├── common/                    // 通用类库目录
    ├── components/                // 公共组件目录
    ├── router/                    // 路由配置目录
    ├── store/                     // 状态管理目录
    ├── style/                     // 通用 CSS 目录
    ├── utils/                     // 工具函数目录
    ├── views/                     // 页面组件目录
    ├── App.vue
    ├── main.ts
    ├── shims-vue.d.ts
├── tests/                         // 单元测试目录
├── index.html
├── tsconfig.json                  // TypeScript 配置文件
├── vite.config.ts                 // Vite 配置文件
└── package.json


 4、安装路由vue2使用3的路由vue3使用4的路由

1、下载
npm i vue-router@4
2、在router下创建index.ts
// src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import Home from '@/views/Home.vue'  // 确保有一个 Home.vue 组件
import About from '@/views/Login.vue'  // 确保有一个 About.vue 组件// 定义路由配置
const routes: Array<RouteRecordRaw> = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
]// 创建并导出路由实例
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),  // 使用 Vue 3 中的 history 模式routes
})export default router

第一个注意点import type { RouteRecordRaw } from 'vue-router'这个引入type

第二个注意点找不到模块“@/views/Home.vue”或其相应的类型声明

在src底下创建shims-vue.d.ts 文件,放置在项目的 src 目录下(通常是 src/shims-vue.d.ts

里面的内容是

// src/shims-vue.d.ts
declare module '*.vue' {import { DefineComponent } from 'vue'const component: DefineComponent<{}, {}, any>export default component}

这样就不会报错了原因如下:

使用 shims-vue.d.ts 的作用

  1. 告诉 TypeScript 识别 .vue 文件:通过这个声明文件,TypeScript 会知道 .vue 文件是一个 Vue 组件,并且可以正确地推断出这些组件的类型。
  2. 避免类型错误:如果没有这个声明,TypeScript 会认为 .vue 文件是无法处理的,导致编译错误。通过这个文件,TypeScript 会认为 .vue 文件导出的对象是一个符合 DefineComponent 类型的 Vue 组件,从而不会报错。
3、挂载main.ts上
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index'createApp(App).use(router).mount('#app')// 使用 .use(router):通过 .use(router) 将路由器插件添加到应用中。
// .mount('#app'):最后挂载应用到页面上的 #app 元素。

 5、状态管理pinia

1、下载pinia
npm install pinia
2、main.ts使用
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index'
import { createPinia } from 'pinia'const app = createApp(App)// 使用 Pinia 和 Router 插件
app.use(createPinia())  // 添加 Pinia 插件
app.use(router)  // 添加 Router 插件// 挂载到 #app 元素
app.mount('#app')
3、/ stores/index.ts
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index'
import { createPinia } from 'pinia'const app = createApp(App)// 使用 Pinia 和 Router 插件
app.use(createPinia())  // 添加 Pinia 插件
app.use(router)  // 添加 Router 插件// 挂载到 #app 元素
app.mount('#app')

6、安装Element Plus

1、下载Element Plus
npm i element-plus
2、全局引入main.ts
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'  // 引入 Element Plus 样式const app = createApp(App)// 使用 Pinia 和 Router 插件
app.use(createPinia())  // 添加 Pinia 插件
app.use(router)  // 添加 Router 插件// 使用 Element Plus
app.use(ElementPlus)  // 添加 Element Plus 插件// 挂载到 #app 元素
app.mount('#app')

7、安装 Axios

1、下载 Axios
npm i axios
2、请求函数:utils/request.ts
import axios from 'axios';
import { ElMessage } from 'element-plus'; // 引入 Element Plus 消息组件
import type { InternalAxiosRequestConfig, AxiosResponse } from 'axios'; // 仅导入类型// 创建 axios 实例
const instance = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL, // 使用 Vite 的环境变量timeout: 5000,
});// 请求拦截器
instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {// 在这里可以添加 Authorization 或其他请求头// config.headers['Authorization'] = localStorage.getItem('token');return config;},(error: any) => {ElMessage.error(`请求错误: ${error.message}`); // 使用 Element Plus 消息提示return Promise.reject(error);}
);// 响应拦截器
instance.interceptors.response.use((response: AxiosResponse) => {const data = response.data;if (data && !data.Status) {ElMessage.error(`错误: ${data.Message || '未知错误'}`); // 使用 Element Plus 消息提示return data; // 如果需要自定义处理逻辑,可以调整} else {return data; // 返回整个响应数据}},(error: any) => {if (error.response) {// 处理服务器返回的错误响应ElMessage.error(`错误码 ${error.response.status}: ${error.response.statusText}`);} else {// 处理网络问题ElMessage.error('服务器无响应');}return Promise.reject(error);}
);export default instance;
3、api.ts
import request from '../utils/request';// 登录接口
interface LoginParams {username: string;password: string;
}export function login(params: LoginParams) {return request({url: '/login', // 替换为实际登录接口的 URLmethod: 'get', // 或者 'post',根据实际需求调整params, // 将参数传递给请求});
}// 获取食谱接口
interface GetCateringScreenCookBookParams {userId: string;
}export function GetCateringScreen_CookBook(params: GetCateringScreenCookBookParams) {return request({url: '/getCookBook', // 替换为实际接口的 URLmethod: 'get', // 或者 'post',根据实际需求调整params, // 将参数传递给请求});
}

8、集成 CSS 预编译器

1、下载sass
npm install -D sass
2、使用
<template><div class="example">Hello, world!</div>
</template><script setup lang="ts">// 这里是你的 TypeScript 代码
</script><style lang="scss">
.example {color: red;.nested {font-size: 20px;}
}
</style>

Sass 使用 scss 语法(后缀 .scss),你也可以使用 sass(后缀 .sass)来编写不使用大括号和分号的语法。


http://www.ppmy.cn/news/1564664.html

相关文章

业务幂等性技术架构体系之服务幂等深入剖析

简单来说&#xff0c;服务幂等是指一个操作&#xff08;或请求&#xff09;无论被执行多少次&#xff0c;其对系统状态的影响都是一样的&#xff0c;就好像这个操作只执行了一次一样。换句话说&#xff0c;对于同一组输入参数&#xff0c;幂等的服务会给出相同的结果&#xff0…

[STM32 HAL库]串口中断编程思路

一、前言 最近在准备蓝桥杯比赛&#xff08;嵌入式赛道&#xff09;&#xff0c;研究了以下串口空闲中断DMA接收不定长的数据&#xff0c;感觉这个方法的接收效率很高&#xff0c;十分好用。方法配置都成功了&#xff0c;但是有一个点需要进行考虑&#xff0c;就是一般我们需要…

WEB渗透技术研究与安全防御

目录 作品简介I IntroductionII 1 网络面临的主要威胁1 1.1 技术安全1 2 分析Web渗透技术2 2.1 Web渗透技术的概念2 2.2 Web漏洞产生的原因2 2.3 注入测试3 2.3.1 注入测试的攻击流程3 2.3.2 进行一次完整的Sql注入测试4 2.3.3 Cookie注入攻击11 3 安全防御方案设计…

MySQL程序之:使用命令选项连接到服务器

本节介绍如何使用命令行选项来指定如何为mysql或mysqldump等客户端建立到MySQL服务器的连接。有关使用类似URI的连接字符串或键值对建立连接的信息&#xff0c;请参阅“使用类似URI的字符串或键值对连接到服务器”。有关无法连接的其他信息&#xff0c;请参阅“解决连接到MySQL…

设置完端口转发后,本机可以ping通公网设备,但公网设备无法ping通本机内网ip

设置端口转发后&#xff0c;本机可以ping通公网设备&#xff0c;但公网设备无法ping通本机内网IP&#xff0c;通常与以下原因有关&#xff1a; 1. 端口转发仅针对特定端口 端口转发的作用&#xff1a;端口转发仅将特定端口的流量&#xff08;如TCP/UDP&#xff09;从公网IP转发…

Redis的安装和配置、基本命令

一、实验目的 本实验旨在帮助学生熟悉Redis的安装、配置和基本使用&#xff0c;包括启动Redis服务、使用命令行客户端进行操作、配置Redis、进行多数据库操作以及掌握键值相关和服务器相关的命令。 二、实验环境准备 1. JAVA环境准备&#xff1a;确保Java Development Kit …

今天你学C++了吗?——C++中的STL

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…