vue3之写一个aichat ----vite.config.js

vite.config.js的CSS配置

在这里插入图片描述

postcss-pxtorem

开发响应式网页的时候需要用到postcss-pxtorem
amfe-flexible
amfe-flexible是由阿里团队开发的一个库,它可以根据设备的屏幕宽度去动态调整HTML根元素()的字体大小,这意味着无论用户使用什么尺寸的设备访问你的网站,页面都能根据设备的实际宽度进行缩放,从而达到响应式设计效果
工作原理:amfe-flexible会检测设备的屏幕宽度,并基于这个宽度设置一个基准字体大小,默认情况下,如果设备宽度为750px,则根字体被设置为100px,如果是375px宽,则根字体大小为50px,以此类推。
引入方式:在main.js中引入amfe-flexible
在这里插入图片描述

什么是postcss-pxtorem
postcss-pxtorem是PostCSS的一个插件,它的主要作用是将CSS中的px(像素)单位自动转换为rem(根em)单位,Rem单位基于HTML文档的根元素的字体大小来计算尺寸,这使得它可以很好的适应不同的屏幕尺寸和分辨率,从而帮助创建响应式设计
为什么选择Rem而不是px
灵活性:使用rem可以让你更容易地调整整个页面或者其他部分的缩放比列,只需要改变根元素的字体大小即可
响应式设计: rem单位非常适合用于响应式设计,因为它允许你根据用户的设备设置基础字体大小,并以此为基础进行相对缩放
postcss-pxtorem的使用
在这里插入图片描述
上面的 postcssPxToRem只能将标签内的css像素单位转换成rem,但是实际的项目开发中,我们需要用到行内样式,所以我们还需要写一个工具函数来转换行内样式的单位,在项目的src目录下创建 >utils文件夹 >创建pxToRem.js
pxToRem.js

const getBaseFontSize = () => {
// 使用 document.documentElement 获取 HTML 文档的根元素(即 <html> 标签)// getComputedStyle 是一个用于获取所有计算样式的接口,它返回一个包含所有计算样式的对象// .fontSize 属性从这个对象中获取根元素的字体大小属性值,该值是一个字符串,如 "16px"const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);// parseFloat 函数将字符串转换为浮点数,这里是为了去掉 'px' 单位,只保留数字部分// 例如,如果 fontSize 返回的是 '16px',那么 parseFloat('16px') 将返回 16// 返回计算后的根字体大小,这是一个纯数字,表示当前页面根元素的字体大小(以像素为单位)return rootFontSize;
}const pxToRem = px => {// 如果传入的是带单位的字符串(比如 '100px')if (typeof px === 'string') {// 如果包含 '%',直接返回if (/%/gi.test(px)) {return px;}// 去掉 'px' 单位px = parseFloat(px.replace('px', ''));}// 如果传入的不是数字,直接返回if (isNaN(px)) {return px;}// 使用 amfe-flexible 设置的根字体大小进行计算const baseFontSize = getBaseFontSize();const remValue = (px / baseFontSize).toFixed(6) + 'rem';return remValue;
}// 导出函数
export default pxToRem;

使用pxToRem.js
在需要使用的组件中引入文件再使用
在这里插入图片描述
preprocessorOptions预处理器选项,配置了预处理器是less
javascriptEnabled: true允许在less文件中使用JavaScript表达式,动态计算颜色值或根据条件生成样式有用
additionalData: '@import “@/assets/styles/variables.less”;'在每个less文件的开头自动导入@/assets/styles/variables.less文件这样,就可以在任何less文件中使用variables.less中定义的变量
在这里插入图片描述

vite.config.js中的server配置

在这里插入图片描述

基础服务配置:
host: 指定服务器监听的IP地址。0.0.0.0表示允许所有网络接口(包括本地和外部)访问服务
port:指定服务器运行的端口号,项目启动后可以通过http://localhost:8888/chatai/Chat或者外部IP访问
代理配置 (proxy):

'/api': {target: 'https://thecatapi.com/',changeOrigin: true,ws: true,timeout: 300000
},

作用:将所有请求代理到https://thecatapi.com/
配置项:
target:代理的目标服务器URL
changeOrigin:修改请求头中的Host为目标URL的主机名(绕过某些服务器的反爬机制)
ws: 启用webSocket代理(用于实时通信)
timeout:设置代理请求超时时间
路径匹配规则
所有以/api开头的请求都会被代理到https://thecatapi.com
例如:/api/cats → https://thecatapi.com/cats(自动去除/api前缀)
允许访问的主机 (allowedHosts):

   allowedHosts: ['8eec-113-106-75-166.ngrok-free.app', // 添加你的ngrok URL// 如果需要,可以添加其他允许的主机'localhost', // 允许本地访问'127.0.0.1' // 允许本地访问
],

作用:定义合法的主机名列表,防止未经授权的主机访问开发服务器
常用于ngrok暴露本地服务到公网时,需要添加生成的域名,一般开发H5移动端,想要手机调试可以使用这个方法,关于ngrok的安装使用可以参考这篇文章

前端请求发起到代理转发的全流程

前端axios实例配置的baseURL为/api,发送请求到vite开发服务器的8888端口,vite的server.proxy配置检测到/api开头的请求,转发到目标服务器,修改请求头,处理路径重写,然后返回响应
在这里插入图片描述
封装的axios,其中baseURL: ‘/api’,表示每个请求都会自动加上"/api"前缀,如:request.get(‘/cats’)实际的请求地址是http://localhost:8888/api/cats

import axios from 'axios'
import { useUserStore } from '@/stores/user'// 创建 axios 实例
const request = axios.create({baseURL:'/api',timeout: 100000,withCredentials: true,headers: {'Content-Type': 'application/json;charset=utf-8',Accept: 'text/event-stream'}
})// 创建请求取消控制器Map
const pendingMap = new Map()// 生成取消请求的key
const getPendingKey = config => {const { url, method, params, data } = configreturn [url, method, JSON.stringify(params), JSON.stringify(data)].join('&')
}// 添加请求到pendingMap
const addPending = config => {const pendingKey = getPendingKey(config)if (!pendingMap.has(pendingKey)) {const controller = new AbortController()config.signal = controller.signalpendingMap.set(pendingKey, controller)}
}// 移除请求从pendingMap
const removePending = config => {const pendingKey = getPendingKey(config)if (pendingMap.has(pendingKey)) {const controller = pendingMap.get(pendingKey)controller.abort()pendingMap.delete(pendingKey)}
}// 请求拦截器
request.interceptors.request.use(config => {// removePending(config)addPending(config)// 如果是流式请求if (config.isStream) {config.responseType = 'blob'config.timeout = 0 // 禁用超时}// 判断是否需要转换为FormDataif (config.formData === true && config.data) {let formData = new FormData()for (let key in config.data) {if (Array.isArray(config.data[key])) {config.data[key].forEach(value => {formData.append(`${key}[]`, value)})} else {formData.append(key, config.data[key])}}config.data = formDataconfig.headers['Content-Type'] = 'multipart/form-data'}return config},error => {return Promise.reject(error)}
)// 响应拦截器
request.interceptors.response.use(response => {removePending(response.config)// 如果是流式响应,直接返回responseif (response.config.isStream) {return response}if (response.data.code == 215) {const userStore = useUserStore()userStore.clearUserState() //清除用户状态}return response.data},error => {if (error.name === 'AbortError') {console.log('请求被取消')return Promise.reject(error)}handleHttpError(error)return Promise.reject(error)}
)// 处理 HTTP 错误
const handleHttpError = error => {if (error.response) {switch (error.response.status) {case 404:console.error('请求的资源不存在')breakcase 500:console.error('服务器错误')breakdefault:console.error('网络错误')}} else if (error.request) {console.error('请求超时')} else {console.error('请求错误')}
}export default request

在项目中启动的VConsole,用于调试移动端网页

viteVConsole函数用于初始化和配置VConsole,接收一个配置对象作为参数
entry,配置VConsole的入口文件,path.resolve用于将相对路径转换为绝对路径,指定了入口文件为src/main.js
enabled,设置VConsole的启用状态
config,用于配置VConsole的各种参数,maxLogNumber设置日志的最大数量,当日志超过这个数量,旧的日志就会被自动清除;theme设置VConsole的主题为黑色
在这里插入图片描述
当然在这之前的先安装相应的依赖,vconsole不必说
vite-plugin-vconsole自动集成vconsole,通过插件就可以实现vconsole的自动注入,无需修改代码;可以根据不同的构建环境动态的启动或者禁用vconsole,使用vite插件系统更攘夷进行扩展和维护

npm install vconsole  --save
npm install vite-plugin-vconsole  --save-dev//专门用于开发环境的工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35648.html

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

相关文章

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

C++模版(进阶)

文章目录 一、非类型模版参数二、模版的特化2.1 概念2.2 函数模版特化2.2.1 函数模版特化为指针类型注意事项 2.3 类模版特化2.3.1 全特化2.3.2 偏特化(半特化)2.3.3 类模板特化应用示例 三、模版分离编译3.1 什么是分离编译&#xff1f;3.2 模版的分离编译3.3 解决方法! 四、模…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时&#xff0c;首先第一步就是要考虑软件的版本的问题&#xff01; 2.软件的安装&#xff1a;最安全可靠的方法就是去软件对应的官网上查看安装手册&#xff08;包括的软件的下载&#xff09; 红帽系软件安装的常见的3种方式 &#xff08;1&#x…

布谷直播系统源码开发实战:从架构设计到性能优化

作为山东布谷科技的一名技术研发人员&#xff0c;我参与了多个直播系统平台从0到1的开发和搭建&#xff0c;也见证了直播行业从萌芽到爆发的全过程。今天&#xff0c;我想从研发角度&#xff0c;分享一些直播系统软件开发的经验和心得&#xff0c;希望能对大家有所帮助。 一、 …

实战设计模式之解释器模式

概述 作为一种行为设计模式&#xff0c;解释器模式提供了一种方法来定义语言的文法规则&#xff0c;并通过这些规则解析和处理特定类型的语言句子。简单来说&#xff0c;解释器模式允许我们定义一个代表某种语言中语法规则的对象结构&#xff0c;从而能够根据这些规则理解并处理…

物联网边缘计算网关是什么?

在物联网的浩瀚架构中&#xff0c;边缘计算网关宛如一位坚毅的前沿哨兵&#xff0c;默默守护着数据处理与传输的关键防线&#xff0c;为整个物联网系统的高效运转发挥着不可或缺的作用。 一、边缘计算网关的定义与基本功能 边缘计算网关是一种智能设备&#xff0c;它被部署在…

计算机视觉算法实战——障碍物识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​ ​​​​​​ ​ ​ 1. 引言 计算机视觉是人工智能领域的一个重要分支&#xff0c;旨在通过计算机模拟人类的视觉系统&#xff0c;从…

Win11锁屏后显示“天气、市场、广告”如何取消显示

关闭方法&#xff1a;设置>个性化>锁屏界面>锁屏界面状态>"无"。 方法一&#xff1a;通过“个性化”设置 打开“设置”应用&#xff1a; 点击屏幕左下角的“开始”按钮&#xff08;Windows 图标&#xff09;。点击齿轮状的“设置”图标。或者按下 Win I…

10天速通强化学习-008

TRPO 思考-TRPO-在线策略-给定信任区域防止更新不稳定 Actor-Critic网络随着网络深度的增加&#xff0c;步长太长&#xff0c;梯度更新会变差。改变方法-增加信任区域。(trust region policy optimization)-TRPO算法&#xff1a; 核心思想&#xff1a; 是在每次迭代中&…

整合百款经典街机游戏的模拟器介绍

对于80、90后而言&#xff0c;街机游戏承载着童年的欢乐记忆。今天要给大家介绍一款超棒的软件——「MXui街机厅经典游戏101款」&#xff0c;它能带你重回那段热血沸腾的街机时光。 「MXui街机厅经典游戏101款」是一款绿色免安装的街机模拟器&#xff0c;体积约1.39G。无需繁琐…

springboot第三站(1) web开发引入

目录 1.简介 2.SpringBoot对静态资源的映射规则 3.模版引擎 1.简介 使用SpringBoot&#xff1b; 1&#xff09;、创建SpringBoot应用&#xff0c;选中我们需要的模块&#xff1b; 2&#xff09;、SpringBoot已经默认将这些场景配置好了&#xff0c;只需要在配置文件中指定…

12-二叉树-二叉树高度(给定前序和中序确定二叉树)

题目 来源 23. 二叉树的高度 思路 其实跟09那篇很像&#xff0c;反正核心就是要通过前序和中序来建树&#xff0c;只不过现在多了一个返回值&#xff1b;因为建树的时候&#xff0c;其实左子树和右子树的深度就可以知道。其余详见代码。 代码 /* 前序遍历根左右,中序&…

PSI5接口

文章目录 前言PSI5接口简介操作模式命名规则异步操作模式&#xff08;PSI5-A&#xff09;同步操作模式&#xff08;PSI5-P&#xff09; 传感器->ECU物理层&#xff08;位编码&#xff09;数据链路层数据帧帧格式串行消息帧10bits 传感器帧定义超10bits传感器帧定义 ECU->…

垃圾处理全流程监管平台

在当前城市化进程中&#xff0c;垃圾处理已成为城市管理的重要课题。随着技术的发展&#xff0c;垃圾处理全流程监管平台的建设显得尤为重要。该平台能够实现垃圾从产生、收集、运输到最终处理的全流程监管&#xff0c;提高垃圾处理效率&#xff0c;促进资源回收利用&#xff0…

【Linux编程】IPC之消息队列从踩坑到实战:核心原理、实战案例与C++封装详解(含完整代码)

一、消息队列基础概念 消息队列是Linux系统提供的一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;具有以下特点&#xff1a; 消息以链表形式存放在内核中每个消息包含类型标识&#xff08;mtype&#xff09;支持多生产者/多消费者模式消息总长度受限于系统配置&a…

Unity 项目工程结构目录

1. Unity.VisualScripting.Core 作用: Visual Scripting 的核心模块&#xff0c;提供了可视化编程的基础功能&#xff08;前身为 Bolt&#xff09;。它允许开发者通过节点图创建游戏逻辑&#xff0c;而无需编写代码。 典型用途: 非程序员快速构建原型&#xff0c;或简化…

从pdf提取文本数据的c/cpp库(非OCR)

Aspose.PDF for C 商业付费版&#xff0c;无源码。 功能强大&#xff0c;支持多种PDF操作。 对应的官方示例代码&#xff1a;Aspose.PDF-for-C Spire.PDF for C 商业付费版 对应的官方示例代码&#xff1a;Spire.PDF-for-C- PDFTron SDK 商业付费版 PoDoFo 开源 当前版本…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux&#xff0c;本质上是学习在命令行下熟练使用Linux的各类命令。 命令行&#xff1a;是一种通过输入命令和参数与计算机系统进行交互的方式&#xff0c;可以使用各种字符化命令对系统发出操作指令&#xff0c;打开Linux终端&#xff0c;进入命令行界面。 …

赛逸展2025创新模式,以科技创新奖赋能展位战略价值

CES Asia2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;主办方负责人提出的创新理念&#xff0c;为展会的战略价值注入了新活力&#xff1a;“我们不是在卖展位&#xff0c;而是在分发政策红利入场券——企业每平方米的展位投入&#xff0c;都可能通过科技创…

深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习

一文快速了解 ResNet创新点 在深度学习的历史长河中&#xff0c;2015年或许是最具突破性的一年。这一年&#xff0c;微软亚洲研究院的何恺明团队带着名为ResNet&#xff08;残差网络&#xff09;的模型横空出世&#xff0c;在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…