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.mzph.cn/news/898235.shtml

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

相关文章

宝石PDF,全新 PC 版本,全部免费

宝石PDF已经运行 3 年时间&#xff0c;有客户端&#xff0c;小程序&#xff0c;一直未上 PC 版本&#xff0c;随着客户端功能升级的不及时&#xff0c;很多用户建议上 PC 版本。但是飞哥一直忙&#xff0c;这不终于给上了。 同时系统的名称也从 “PDF云转换”改为“宝石PDF”&…

.NET8使用EF Core连接SQLite

使用框架 .NET8 在nuget中&#xff0c;需要安装包&#xff1a; SQLitePCLRaw.bundle_e_sqlite3&#xff0c;版本 2.1.10 Microsoft.EntityFrameworkCore.Sqlite.Core&#xff0c;版本 9.0.0 using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microso…

HTML课后实践

实验一 【实验原理】 在搜索引擎的文本分析中&#xff0c;标题的信息权重要比正文的大&#xff0c;所以标题的样式非常重要。本实验通过把标题标记和常规文本进行对比输出&#xff0c;掌握标题标签的用法。在网页中&#xff0c;有时需要为文字设置粗体、斜体或下划线效果&#…

【紫光同创FPGA开发常用工具】FPGACPLD的下载与固化

文档内容适配技术问题说明&#xff08;非正文&#xff09;&#xff1a; 1、FPGA&CPLD如何下载位流文件&#xff1b; 2、FPGA外部flash如何固化位流文件&#xff1b; 3、PDS软件烧录界面如何新增用户flash&#xff1b; 4、CPLD内部flash如何固化位流文件&#xff1b; F…

前端传参+后端接参对照

✅ Java 后端参数接收注解 & 前端传参格式对照 后端注解前端 Content-Type前端传参方式说明RequestParamapplication/x-www-form-urlencodedURL参数 / form表单提交 / Postman form-data常用于 keyvalue 形式的参数&#xff1b;适合少量简单参数RequestParamURL拼接/api/t…

计算机网络的框架结构

计算机网络课程知识体系框架 一、计算机网络基础概念 1.1 网络组成要素 端系统&#xff08;主机、服务器&#xff09;通信链路&#xff08;有线/无线介质&#xff09;交换设备&#xff08;路由器、交换机&#xff09;协议体系&#xff08;TCP/IP协议簇&#xff09; 1.2 网络…

塔能智慧物联节能方案:点亮城市,赋能工厂

在全球积极倡导节能减排、绿色发展的时代背景下&#xff0c;塔能&#xff08;江苏&#xff09;科技有限公司凭借其创新的智慧物联节能一体化解决方案&#xff0c;在城市照明和工厂节能领域取得了显著成果。该方案不仅为城市的夜晚带来了明亮且节能的照明&#xff0c;还为工厂的…

Laravel框架下通过DB获取数据并转为数组的方法

在Laravel框架中&#xff0c;获取数据库信息并将其转换为数组是一种常见的操作&#xff0c;特别是在处理数据导出、API响应等场景中。Laravel提供了简洁而强大的数据库抽象层&#xff0c;旨在简化这类操作。接下来&#xff0c;我们将探讨几种在Laravel中通过数据库抽象层&#…

pytorch小记(九):pytorch中创建指定形状的张量: torch.empty

pytorch小记&#xff08;九&#xff09;&#xff1a;pytorch中创建指定形状的张量: torch.empty 详细解释1. 基本功能2. 语法3. 示例代码示例 1&#xff1a;创建一个 5 的未初始化张量示例 2&#xff1a;创建一个 23 的未初始化张量示例 3&#xff1a;指定数据类型和设备 4. 注…

Linux cgroup cpuset

cpuset.c 是 Linux cgroup 的 cpuset 子系统的核心实现&#xff0c;这个文件的主要作用是&#xff1a; 实现 cgroup 的 cpuset 子系统管理进程的 CPU 和内存资源访问权限提供 CPU 和内存节点的独占功能支持层级化的资源管理提供用户空间接口来配置和查看资源限制 关键数据结构…

Tailwind CSS 学习笔记(一)

一、简介 Tailwind CSS是一个工具优先的CSS 框架,只需书写HTML 代码,无需书写CSS,即可快速构建美观的网站。 二、优点 1、简洁、规整,避免了随意取类名 Tailwind CSS 的工具类(Utility classes) 能够为你提供一套约束系统,避免让你的样式表中出现随意的取值。它让颜色、…

Python自动点击器开发教程 - 支持键盘连按和鼠标连点

Python自动点击器开发教程 - 支持键盘连按和鼠标连点 这里写目录标题 Python自动点击器开发教程 - 支持键盘连按和鼠标连点项目介绍开发环境安装依赖核心代码解析1. 键盘模拟实现2. 鼠标点击实现 开发要点使用说明注意事项优化建议打包发布项目源码开发心得参考资料成品工具 项…

Cursor插件市场打不开解决

问题现象&#xff1a; cursor搜索插件的时候提示错误&#xff0c;无法搜索安装插件 error while fetching extensions.failed to fetch 问题原因 cursor默认安装使用的并不是vs code的插件市场&#xff0c;国内网络有时候打不开 解决 修改插件市场地址并重启cursor 打开cur…

【DeepSeek】本地部署DeepSeek的完整教程(Ollama+Docker+Open WebUI)

本地部署DeepSeek的完整教程 文章目录 本地部署DeepSeek的完整教程写在前面技术需求详细步骤一. 安装Ollama软件二. 安装DeepSeek-R1模型三. 安装Docker软件四. 配置Web UI界面问题解决1. 打开`docker desktop`时,一直显示`Docker Engine stopped`2. 用`Docker`拉取`Open WebU…

Java创造型模式之原型模式详解

设计模式是面向对象设计中的一种标准方法&#xff0c;用于解决常见的设计问题。原型设计模式&#xff08;Prototype Pattern&#xff09;是23种经典设计模式之一&#xff0c;属于创建型模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过构造函数或工厂…

python-leetcode 54.全排列

题目&#xff1a; 给定不含重复数字的数组nums,返回其所有可能的全排列&#xff0c;可以按任意顺序返回答案 回溯法 一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解&#xff08;或者至少不是最后一个解&#xff09;&#xff0c;回溯算法会通…

python局部变量和全局变量

文章目录 1.局部变量和全局变量2.局部变量2.1 局部变量的作用2.2 局部变量的生命周期 3. 全局变量3.1 函数不能直接修改全局变量的引用3.2 在函数内部修改全局变量的值3.3 全局变量定义的位置3.4 全局变量命名的建议 1.局部变量和全局变量 &#xff08;1&#xff09;局部变量 …

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…

深度学习-简介

一、几个概念 &#xff08;1&#xff09;what is ai including? 看一张图&#xff1a; 这里注意机器学习和深度学习的关系 &#xff08;2&#xff09;机器学习和模式识别有什么区别&#xff1f; 和机器学习同领域的有一个词叫做模式识别&#xff0c;二者有什么区别呢? 机…

Unity小框架之单例模式基类

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的创建型设计模式&#xff0c;其核心目标是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。它常用于需要控制资源访问、共享配置或管理全局状态的场景&#xff08;如数据库连接池、日志管理器、应用配置…