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

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.mzph.cn/pingmian/67397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习图像算法中的网络架构:Backbone、Neck 和 Head 详解

深度学习已经成为图像识别领域的核心技术&#xff0c;特别是在目标检测、图像分割等任务中&#xff0c;深度神经网络的应用取得了显著进展。在这些任务的网络架构中&#xff0c;通常可以分为三个主要部分&#xff1a;Backbone、Neck 和 Head。这些部分在整个网络中扮演着至关重…

iOS - 内存对齐

1. 基本的内存对齐 // 对象内存对齐 struct objc_object {// isa 指针 8 字节对齐isa_t isa __attribute__((aligned(8))); };// 定义对齐常量 #define WORD_MASK 7UL // 字对齐掩码 #define WORD_SHIFT 3UL // 字对齐位移 #define WORD_SIZE 8 …

信安大赛单机取证

22年国赛单机取证 Evidence4 先搜索Evidence 找到一个 Evidence4nsOh2.pngf5b9ce3e485314c23c40a89d994b2dc8 Evidence2 之后再一个个找 这个是压缩包格式的 导出来 伪加密 修复一下 Evidence2ZQOo2.jpg9e69763ec7dac69e2c5b07a5955a5868 Evidence3 png的文件 改个宽高 E…

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…

AOF日志:宕机了Redis如何避免数据丢失?

文章目录 AOF 日志是如何实现的&#xff1f;三种写回策略日志文件太大了怎么办&#xff1f;AOF 重写会阻塞吗?小结每课一问 更多redis相关知识 如果有人问你&#xff1a;“你会把 Redis 用在什么业务场景下&#xff1f;”我想你大概率会说&#xff1a;“我会把它当作缓存使用&…

个人vue3-学习笔记

声明:这只是我个人的学习笔记(黑马),供以后复习用 。一天学一点,随时学随时更新。明天会更好的! 这里只给代码,不给运行结果,看不出来代码的作用我也该进厂了。。。。。 Day1 使用create-vue创建项目。 1.检查版本。 node -v 2.创建项目 npm init vue@latest 可…

react 与 vue 的比较,以及如何选择?

区别 Vue 和 React 都是流行的前端 JavaScript 框架&#xff0c;用于构建用户界面和单页应用&#xff08;SPA&#xff09;&#xff0c;但它们在设计理念、API 设计、生态系统等方面存在一些区别&#xff1a; 核心理念 Vue&#xff1a; 渐进式框架&#xff1a;Vue 被设计为一…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

“飞的”点外卖,科技新潮流来袭

一、开篇引入 上个周末&#xff0c;阳光正好&#xff0c;我带着孩子去公园游玩。公园里绿草如茵&#xff0c;花朵绽放&#xff0c;孩子们在草地上嬉笑奔跑&#xff0c;好不快活。玩累了&#xff0c;我们便在草坪上的帐篷里休息。 就在这时&#xff0c;天空中突然传来一阵嗡嗡…

Linux 服务器挖矿木马防护实战:快速切断、清理与加固20250114

Linux 服务器挖矿木马防护实战&#xff1a;快速切断、清理与加固 引言 挖矿木马作为一种常见的恶意软件&#xff0c;对服务器资源和安全构成严重威胁。据安全机构统计&#xff0c;2023 年全球约 45%的 Linux 服务器遭受过挖矿木马攻击&#xff0c;平均每台被感染服务器每月造…

OpenAI推出首个AI Agent!日常事项自动化处理!

2025 年1月15日&#xff0c;OpenAI 正式宣布推出一项名为Tasks的测试版功能 。 该功能可以根据你的需求内容和时间实现自动化处理。比方说&#xff0c;你可以设置每天早晨 7 点获取天气预报&#xff0c;或定时提醒遛狗等日常事项。 看到这里&#xff0c;有没有一种熟悉的感觉&a…

解决vue列表页跳转到详情页,返回列表页时不刷新、保持原来的状态的方法(二)

场景描述&#xff1a; 1、列表页进入详情页&#xff0c;再从详情页返回时&#xff0c;列表页不刷新&#xff0c;比如列表当前分页为第二页&#xff0c;点击进入详情页&#xff0c;再从点击返回按钮&#xff0c;返回到列表页时&#xff0c;列表页保持在第二页。 2、列表页进入编…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

salesforce在opportunity的opportunity products页面增加一个按钮,可以批量删除products

在 Salesforce 中&#xff0c;如果想在「Opportunity > Opportunity Products」列表页面上增加一个“批量删除产品”的按钮&#xff0c;并实现勾选多条产品后统一删除&#xff0c;大体可以考虑以下几种实现思路。由于环境和版本&#xff08;Classic / Lightning&#xff09;…

卷积神经网络的底层是傅里叶变换

1 卷积神经网络的底层是傅里叶变换&#xff0c;傅里叶变换的底层是希尔伯特空间坐标变换_哔哩哔哩_bilibili 卷积神经网络的底层是傅里叶变换&#xff0c;傅里叶变换的底层是希尔伯特空间坐标变换_哔哩哔哩_bilibili从“卷积”、到“图像卷积操作”、再到“卷积神经网络”&…

攻防世界_SQL注入

inget 尝试万能钥匙。 输入?id1or11# supersqli 1.找注入点 输入框 2.判断字符型&#xff0c;数字型 输入1 and 11 和1 and 12&#xff0c;发现两次提交后页面一样&#xff0c;判断出为字符型注入 3.判断闭合符号 输入1&#xff0c;回显正常 输入1&#xff0c;报错 加上…

idea 如何安装 github copilot

idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot&#xff0c;可以按照以下步骤操作&#xff1a; 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings&#xff08;Windows/Linux&#xff09;或 Prefere…

怎么把文章发表到网上?在平台上投稿文章会有哪些常见问题?

怎么把文章发表到网上&#xff1f;在发表文章的过程中&#xff0c;我们可能会碰到各种各样的问题。这些问题要么导致发表时间被拖长&#xff0c;要么可能导致文章被拒稿。 就让我们来了解下文章发表过程中需要注意的一些细节&#xff0c;知晓怎么顺利地把文章发表到网上。 一、…

检验统计量与p值笔记

一、背景 以雨量数据为例&#xff0c;当获得一个站点一年的日雨量数据后&#xff0c;我们需要估计该站点的雨量的概率分布情况&#xff0c;因此我们利用有参估计的方式如极大似然法估计得到了假定该随机变量服从某一分布的参数&#xff0c;从而得到该站点的概率密度函数&#x…

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 所谓的“窗口”&#xff…