Vue3實戰三、Axios封裝結合mock數據、Vite跨域及環境變量配置

目錄

  • Axios封裝、調用mock接口、Vite跨域及環境變量配置
    • 封裝Axios對象調用mock接口數據
      • 第一步、安裝axios,處理一部請求
      • 第二步、創建`request.ts`文件
      • 第三步、本地模擬mock數據接口
      • 第四步、測試axios+mock接口是否可以調用
      • 第五步、自行擴展 axios 返回的數據類型 axios.d.ts
    • 跨域解決
      • 什么是跨域
      • 跨域示例
      • 跨域解決
      • 跨域實操
    • Vite配置環境變量及模式
      • Vite 配置環境變量
      • Vite配置環境模式
    • 重構代理配置
    • 完結~

Axios封裝、調用mock接口、Vite跨域及環境變量配置

封裝Axios對象調用mock接口數據

因為項目中有很多接口要通過Axios發送異步請求,所以需要封裝一個axios對象,自己封裝的Axios后面可以時候axios中提供的攔截器,參考官方文檔

第一步、安裝axios,處理一部請求

npm install axios

Axios封裝、Vite跨域及環境變量配置

第二步、創建request.ts文件

src 目錄下創建utils目錄,然后 utils 目錄下創建 request.ts 文件

import axios from 'axios';
import type { AxiosInstance } from 'axios';
import { ElMessage } from 'element-plus';
// 手動創建一個 axios 對象, 參考: https://github.com/axios/axios#creating-an-instance
const request: AxiosInstance = axios.create({//baseURL: 'https://mock.xxx.com/mock/64fa8039e70b8004a69ea036/hsk-admin',// 根據不同環境設置 baseURL, 最終發送請求時的URL為: baseURL + 發送請求時寫URL ,// 比如: `baseURL: '/dev-api'` ,當請求 get('/test'), 最終發送請求是: /dev-api/test// baseURL: '/dev-api',// 獲取項目根目錄下 .env.xxxx 文件中的環境變量值baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 20000, // 請求超時的毫秒數,請求時間超過指定值,則請求會被中斷
});
// 請求攔截器
request.interceptors.request.use(config => {// 在此處可向請求頭加上認證tokenreturn config;
}, error => {// 出現異常, catch可捕獲到return Promise.reject(error);
})
// 響應攔截器
request.interceptors.response.use(response => {// console.log('響應攔截器', response);const res = response.data;// 20000 正常響應,返回響應結果給調用方if (res.code === 20000) {return res;}// 非正常響應彈出錯誤信息,ElMessage.error(res.message);return Promise.reject(res);
}, error => {// 處理響應錯誤const { message, response } = error;if (message.indexOf('timeout') != -1) {ElMessage.error('網絡超時!');} else if (message == 'Network Error') {ElMessage.error('網絡連接錯誤!');} else {if (response.data) ElMessage.error(response.statusText);else ElMessage.error('接口路徑找不到');}return Promise.reject(error);
});
export default request; // 導出 axios 對象

第三步、本地模擬mock數據接口

前后端分離開發過程中,后端數據接口還沒有寫出來,前端可以使用mock模擬假數據進行先一步頁面的開發,使用mockjs模擬后端接口,可隨機生成所需要的數據,模擬對數據的增刪查改,mock支持豐富的數據類型,支持生成隨機的文本數字布爾值日期郵箱鏈接圖片顏色等,攔截Ajax請求不需要修改既有代碼可以攔截,返回模擬的響應數據。

項目中使用mockjs的時候,首先確保安裝了axiosmock,上面第一步的時候已經安裝了axios數據,現在開始進行安裝mock

npm install -D mockjs

Axios封裝、Vite跨域及環境變量配置
在項目的src文件夾下新建一個文件夾用來存放mock模擬的數據,一般我們放在將mock模擬的數據( /src/mock/index.js)這個文件中,這里以此為例。

//這里是我使用本地的服務器商品接口地址模擬的數據
import { mock } from 'mockjs'
let data = mock({"code": 20000,"message": "查詢成功","data": [{ "name": "小夢", "age": 18 },{ "name": "濤姐", "age": 32 },{ "name": "林志玲", "age": 48 }]
})
mock(/test/, 'get', () => {return data
})

Axios封裝結合mock數據、Vite跨域及環境變量配置
模擬完數據后,在入口主文件 main.js 中引入這個模擬數據的文件

import "./mock/index.js"

Axios封裝結合mock數據、Vite跨域及環境變量配置

第四步、測試axios+mock接口是否可以調用

src/ 下創建 /api/test.ts 目錄和文件, 調用接口代碼如下:

import request from "@/utils/request";
export function test1() {// 測試1: 調用 get 方式發送get請求request.get("/test").then(response => {console.log("get1", response);}).catch(error => {console.log('error', error);});
}export function test2() {// 測試2, 使用對象形式傳入請求配置,如 請求url, method,paramrequest({url: `/test`,method: "GET"}).then(response => {console.log("get2", response);}).catch(error => {console.log(error);});
}

Axios封裝結合mock數據、Vite跨域及環境變量配置
app.vue頁面引入接口并調用:

<template><div><el-icon><ele-Search /></el-icon><SvgIcon name="ele-Search"></SvgIcon><el-button type="primary">Primary</el-button></div>
</template>
<script lang="ts" setup>
// 導入 test.ts,
import { test1, test2 } from "../src/api/test.ts";
// 調用方法發送請求
test1();
test2();
</script>
<style lang="scss">
// 編寫 scss 代碼
</style>

效果:
在這里插入圖片描述
測試三、通過 api 方法返回請求的 Promise 對象,然后在調用方通過then 獲取響應數據,api\test.ts 新增如下代碼:

import request from "@/utils/request";
// 返回 Promise
export function getList() {const req = request({url: `/test`,method: "GET"});// console.log(req) // Promisereturn req;
}

App.vue 中導入 test.ts

<script setup lang='ts'>
// 導入 test.ts,調用方法發送請求
import { getList } from "@/api/test";
import { onMounted } from "vue";
onMounted(() => {loadData();loadData2();
});
function loadData() {getList().then((response: any) => {console.log("loadData", response);}).catch((error: Error) => {console.log(error);});
}
// 使用 async+await
async function loadData2() {const response = await getList();console.log("loadData2", response);
}
</script>

Axios封裝結合mock數據、Vite跨域及環境變量配置
后面數據訪問都采用測試三這種方式。

第五步、自行擴展 axios 返回的數據類型 axios.d.ts

  1. 使用axios發送請求接口后,axios生命的響應對象AxiosResponse中的屬性并不是我們想要的,我們需要自行擴展為我們需要相應的數據類型。

    /* eslint-disable */
    import * as axios from 'axios';
    // 自行擴展 axios 返回的數據類型
    declare module 'axios' {export interface AxiosResponse<T = any> {code: number;message: string;data: T;}
    }
    

    Axios封裝結合mock數據、Vite跨域及環境變量配置
    declare 定義的接口類型,在 SFCts 文件中不需要導入,相當于全局接口,直接引用接口類型。但是要告知 ts 文件在哪里

  2. 自動加載 *.d.ts文件,修改 tsconfig.app.json (舊版本在 tsconfig.json 中)文件的 includes 選項值:追加 "src/**/*.d.ts"

{"extends": "@vue/tsconfig/tsconfig.dom.json","include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.d.ts"],"exclude": ["src/**/__tests__/*"],"compilerOptions": {"composite": true,"baseUrl": ".","paths": {"@/*": ["./src/*"]}}
}

Axios封裝結合mock數據、Vite跨域及環境變量配置
注意:添加后,重啟編輯器VsCode,不然可能無法識別到*.d.ts文件

跨域解決

什么是跨域

前后端分離時,前端和后端API服務器可能不在同一臺主機上面,就存在跨域問題,瀏覽器限制了跨域訪問,違反了同源策略【協議,域名,端口】都要相同,其中一個不同都會產生跨域。

跨域示例

  • 前端部署在http://127.0.0.1:8888/即本地ip端口8888上面
  • 后端API部署在http://127.0.0.1:9999/即本地ip端口999上面

他們的IP一樣,但是端口不一樣就會存在跨域問題。
Axios封裝結合mock數據、Vite跨域及環境變量配置

跨域解決

【跨域解決參考文檔入口】

  • 通過代理請求的方式解決,將 API 請求通過代理服務器請求到 API 服務器。
  • 開發環境中,在 vite.config.ts 文件中使用 server.proxy 選項進行代理配置。
  • 生產環境,可采用 nginx代理 解決跨域問題。

跨域實操

  1. vite.config.ts 文件中使用 server.proxy 選項進行代理配置。
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({// 開發服務器選項,參考:https://cn.vitejs.dev/config/server-options.html#server-hostserver: {open: true, //啟動服務時自動打開瀏覽器訪問port: 8888, //端口號, 如果端口號被占用,會自動提升1proxy: { // ++++++++++++++++++ 解決跨域問題'/dev-api': { // 匹配 /dev-api 開頭的請求,// 目標服務器, 代理訪問到https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPowertarget: 'https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPower',// 開啟代理:在本地會創建一個虛擬服務端,然后發送請求的數據,并同時接收請求的數據,// 這樣服務端和服務端進行數據的交互就不會有跨域問題changeOrigin: true,// 將 /dev-api 替換為 '',也就是 /dev-api 會移除,// 如 /dev-api/test 代理到https://mock.mengxuegu.com/mock/6621e5cbfaa39b4567596484/adminPowerrewrite: (path) => path.replace(/^\/dev-api/, ''),},}},plugins: [vue(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})
  1. src\utils\request.ts 中的 baseURL 修改:
    const request: AxiosInstance = axios.create({baseURL: '/dev-api',timeout: 20000, // 請求超時的毫秒數,請求時間超過指定值,則請求會被中斷
    });
    Axios封裝結合mock數據、Vite跨域及環境變量配置
  2. 測試:訪問http://127.0.0.1:8888/,查看控制臺響應了數據,說明代理成功
    Axios封裝結合mock數據、Vite跨域及環境變量配置

Vite配置環境變量及模式

Vite 配置環境變量

環境分為testprodtest環境,他們請求的后臺接口獲取數據,不同環境的接口的URL不同,所以要為不同環境配置不同的接口URL,通過路徑前綴進行匹配。

  1. 在根目錄下創建.env.development.env.production文件,為了防止意外地講一些環境變量泄漏到客戶端,只有以VITE_為前綴的環境變量才會通過import.meta.env以字符串形式暴露給經過Vite處理的代碼使用。

    如:

    • VITE_DEV_API=/dev-api可以通過 import.meta.env.VITE_DEV_API訪問,返回/dev-api
    • WY_DEV_API=/dev-api不能通過 import.meta.env.WY_DEV_API訪問,返回undefined
  2. .env.development 文件配置(注意開發和生產環境配置不要搞反了)VITE_APP_SERVICE_URL 值更改為你自已配置的 項目后端的 接口服務地址。

    # 使用 VITE_ 開頭的變量會被 vite 暴露出來
    # 定義請求的基礎URL, 方便跨域請求時使用
    VITE_APP_BASE_API=/dev-api
    # 接口服務地址
    VITE_APP_SERVICE_URL= https://www.****.com/
    
  3. .env.production 文件配置

    # 使用 VITE_ 開頭的變量會被 vite 暴露出來
    # 定義請求的基礎URL, 方便跨域請求時使用
    VITE_APP_BASE_API=/pro-api
    # 接口服務地址
    VITE_APP_SERVICE_URL= https://www.****.com/
    
  4. 測試是否配置成功,在 request.ts 中添加以下代碼,看下瀏覽器控制臺是否會輸出,在項目任意模塊文件中,都可以使用 通過 import.meta.env.VITE_APP_BASE_API 獲取值:

    import axios from 'axios';
    import type { AxiosInstance } from 'axios';
    import { ElMessage } from 'element-plus';
    console.log(import.meta.env.VITE_APP_BASE_API)
    const request: AxiosInstance = axios.create({baseURL: '/dev-api',timeout: 20000, // 請求超時的毫秒數,請求時間超過指定值,則請求會被中斷
    });
    

    Axios封裝結合mock數據、Vite跨域及環境變量配置

Vite配置環境模式

默認情況下,開發服務器 ( dev 命令) 運行在 development (開發) 模式,而 build 命令則運行在 production(生產) 模式。
查看package.json ,當執行 vite build 時,它會自動加載 .env.production 中可能存在的環境變量:

VITE_APP_BASE_API=/pro-api

utils/request.ts 中可以使用import.meta.env.VITE_APP_BASE_API 獲取引用。在某些情況下,若想在 vite build 時運行不同的模式來渲染不同的標題,你可以通過傳遞 --mode 選項標志來覆蓋命令使用的默認模式。

例如,如果你想在 production(生產)模式下構建應用:

  1. 項目根目錄下新建一個 .env.production文件:
    Axios封裝結合mock數據、Vite跨域及環境變量配置

  2. package.json 中添加一個prod選項運行 vite --mode production命令
    Axios封裝結合mock數據、Vite跨域及環境變量配置

  3. 啟動prod環境查看console.log(import.meta.env.VITE_APP_BASE_API) 打印結果:
    在這里插入圖片描述
    Axios封裝結合mock數據、Vite跨域及環境變量配置

重構代理配置

重構vite.config中的server.proxy代理配置,在vite.config.ts中無法通過import.meta.env.xxx獲取到VITE_環境變量,解決此問題需要用到vite中提供的loadEnv方法來讀取環境變量。

import { defineConfig, loadEnv } from 'vite'
// mode:獲取 --mode 指定的模式,process.cwd()項目根目錄,下面 `env` 相當于 `import.meta.env`
const env = loadEnv(mode, process.cwd());
  1. 重構vite.config中的server.proxy代理配置
    import { fileURLToPath, URL } from 'node:url'
    // 1. 導入 loadEnv
    import { defineConfig, loadEnv } from 'vite'
    import vue from '@vitejs/plugin-vue'
    // 2. 向 defineConfig 傳遞對象改為傳遞方法,并返回配置對象
    export default defineConfig(({ mode }) => {// mode:獲取 --mode 指定的模式,process.cwd()項目根目錄,下面 `env` 相當于 `import.meta.env`const env = loadEnv(mode, process.cwd());return {// 開發服務器選項server: {open: true, //啟動服務時自動打開瀏覽器訪問port: 8888, //端口號, 如果端口號被占用,會自動提升1proxy: {// '/dev-api': { // 匹配 /dev-api 開頭的請求,[env.VITE_APP_BASE_API]: { // 引用變量作為key時,要加中括號[]// 目標服務器target: env.VITE_APP_SERVICE_URL,// 開啟代理changeOrigin: true,rewrite: path => path.replace(new RegExp(`^${env.VITE_APP_BASE_API}/`), '')},}},plugins: [vue(),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}}
    });
    
  2. 修改 utils/request.ts 文件配置: baseURL: import.meta.env.VITE_APP_BASE_API
    import axios from 'axios';
    import type { AxiosInstance } from 'axios';
    import { ElMessage } from 'element-plus';
    console.log(import.meta.env.VITE_APP_BASE_API)
    const request: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 20000, // 請求超時的毫秒數,請求時間超過指定值,則請求會被中斷
    });
    
    Axios封裝結合mock數據、Vite跨域及環境變量配置
  3. 重啟看一下效果,接口是否調用到
    Axios封裝結合mock數據、Vite跨域及環境變量配置

完結~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux如何刪除文件名包含無效編碼字符文件

在Linux中&#xff0c;文件名包含無效編碼字符或特殊不可見字符時&#xff0c;可能導致此文件無法通過常規方式選中或刪除&#xff0c;可以通過下面方法處理 1、確認文件名問題 檢查終端編碼環境 echo $LANG # 默認應為 UTF-8&#xff08;如 en_US.UTF-8&#xff09; 查看…

Completablefuture的底層原理是什么

參考面試回答&#xff1a; 個人理解 CompletableFuture 是 Java 8 引入的一個類、它可以讓我們在多線程環境中更加容易地處理異步任務。CompletableFuture 的底層原理是基于一個名為 FutureTask 的機制、結合了 監聽器模式 和 等待-通知機制 來處理異步計算。 1.首先就是Com…

C/C++ 調用約定:深入理解棧與平棧

前言 在編程中&#xff0c;理解函數調用約定和棧的機制對于編寫高效代碼、調試程序以及進行逆向工程至關重要。本文將深入探討 C 和 C 的調用約定&#xff0c;以及棧與平棧的相關知識。 C 調用約定 在 C 語言中&#xff0c;默認的調用約定是 cdecl。cdecl 調用約定的特點如下&…

xv6-labs-2024 lab1

lab-1 注&#xff1a;實驗環境在我的匯編隨手記的末尾部分有搭建教程。 0.前置 第零章 xv6為我們提供了多種系統調用&#xff0c;其中&#xff0c;exec將從某個文件里讀取內存鏡像(這確實是一個好的說法)&#xff0c;并且將其替換到調用它的內存空間&#xff0c;也就是這個…

屬性修改器 (AttributeModifier)

主頁面設置組件 import { MyButtonModifier } from ../datastore/MyButtonModifier;Entry ComponentV2 struct MainPage {// 支持用狀態裝飾器修飾&#xff0c;行為和普通的對象一致Local modifier: MyButtonModifier new MyButtonModifier();build() {Column() {Button(&quo…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的監控:使用 Actuator 實現健康檢查

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、引子&…

類和對象(下篇)(詳解)

【本節目標】 1. 再談構造函數 2. Static成員 3. 友元 4. 內部類 5. 再次理解封裝 1. 再談構造函數 1.1 構造函數體賦值 在創建對象時&#xff0c;編譯器通過調用構造函數&#xff0c;給對象中各個成員變量一個合適的初始值。 #include <iostream> using name…

高精度算法

高精度加法 輸入兩個數&#xff0c;輸出他們的和&#xff08;高精度&#xff09; 輸入樣例 111111111111111111111111111111 222222222222222222222222222222 輸出樣例 333333333333333333333333333333 #include <bits/stdc.h> using namespace std;string a,b; in…

Linux開發中注意哪些操作系統安全

在 Linux 開發中&#xff0c;確保操作系統的安全至關重要。以下是一些需要注意的方面&#xff1a; 用戶管理與權限控制 合理設置用戶權限&#xff1a;為不同的用戶和用戶組分配適當的權限&#xff0c;遵循最小權限原則。避免給普通用戶過多的權限&#xff0c;以免他們誤操作或…

x64dbg調試python解釋器

可以先寫個input()這會讓dbg中斷在ntdll模塊中&#xff0c;查看調用堆棧在系統調用結束后的打斷點 然后直接斷到PyObject_Vectorcall函數

? Ultralytics YOLO驗證(Val)時自動輸出COCO指標(AP):2025最新配置與代碼詳解 (小白友好 + B站視頻)

? YOLO獲取COCO指標(3)&#xff1a;驗證(Val) 啟用 COCO API 評估&#xff08;自動輸出AP指標&#xff09;| 發論文必看&#xff01; | Ultralytics | 小白友好 文章目錄 一、問題定位二、原理分析三、解決方案與實踐案例步驟 1: 觸發 COCO JSON 保存步驟 2: 確保 self.is_coc…

【嵌入式學習3】基于python的tcp客戶端、服務器

目錄 1、tcp客戶端 2、tcp服務器 3、服務器多次連接客戶端、多次接收信息 1、tcp客戶端 """ tcp:客戶端 1. 導入socket模塊 2. 創建socket套接字 3. 建立tcp連接(和服務端建立連接) 4. 開始發送數據(到服務端) 5. 關閉套接字 """ import soc…

Linux: network: 兩臺直連的主機業務不通

前提環境,有一個產品的設定是兩個主機之間必須是拿網線直連。但是設備管理者可能誤將設置配錯,不是直連。 最近遇到一個問題,說一個主機發的包,沒有到對端,一開始懷疑設定的bond設備的問題,檢查了bond的設置狀態,發現沒有問題,就感覺非常的奇怪。后來就開始懷疑兩個主機…

COMSOL固體力學接觸

目錄 一、接觸非線性及接觸面積計算 一、接觸非線性及接觸面積計算 COMSOL接觸非線性及接觸面積計算_嗶哩嗶哩_bilibili 形成聯合體&#xff0c;在定義處右鍵選擇“建立接觸對” 位移dz使用參數化掃描。 接觸選擇定義中設置的接觸對&#xff0c;選擇罰函數&#xff0c;摩擦設置…

22.OpenCV輪廓匹配原理介紹與使用

OpenCV輪廓匹配原理介紹與使用 1. 輪廓匹配的基本概念 輪廓匹配&#xff08;Contour Matching&#xff09;是計算機視覺中的一種重要方法&#xff0c;主要用于比較兩個輪廓的相似性。它廣泛應用于目標識別、形狀分析、手勢識別等領域。 在 OpenCV 中&#xff0c;輪廓匹配主要…

oracle 快速創建表結構

在 Oracle 中快速創建表結構&#xff08;僅復制表結構&#xff0c;不復制數據&#xff09;可以通過以下方法實現&#xff0c;適用于需要快速復制表定義或生成空表的場景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 復制源表的全部列和數據類型&#xff0c;但不復制數據 C…

若依原理筆記

代碼生成器 源碼分析 查詢數據庫列表 導入表結構 生成代碼 修改generator.yml配置文件 代碼生成器增強 Velocity模版引擎 基礎語法-變量 Lombok集成 E:\javaProject\dkd-parent\dkd-generator\src\main\resources\vm\java\domain.java.vm package ${packageName}.domain;#fo…

Ansible的使用

##### Ansible使用環境 - 控制節點 - 安裝Ansible軟件 - Python環境支持&#xff1a;Python>2.6 - 必要的模塊&#xff1a;如PyYAML等 - 被控節點 - 啟用SSH服務 - 允許控制節點登錄&#xff0c;通常設置免密登錄 - Python環境支持 http://www.ansible.com/ …

C++ 提高編程:模板與 STL 深度剖析

摘要&#xff1a;本文深入探討 C 提高編程中的模板編程與標準模板庫&#xff08;STL&#xff09;相關內容。詳細闡述模板編程中函數模板和類模板的概念、語法、特性及應用案例&#xff1b;對 STL 的誕生背景、基本概念、六大組件進行剖析&#xff0c;并對常用容器、函數對象、常…

C++(類模板的運用)

使用vector實現一個簡單的本地注冊登錄系統 注冊&#xff1a;將賬號密碼存入vector里面&#xff0c;注意防重復判斷 登錄&#xff1a;判斷登錄的賬號密碼是否正確 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…