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.pswp.cn/news/898235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898235.shtml
英文地址,請注明出處:http://en.pswp.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;如數據庫連接池、日志管理器、應用配置…