Vite4、Vue3、Axios 針對請求模塊化封裝搭配自動化導入(簡單易用)

針對請求模塊化封裝搭配自動化導入(簡單易用)

  • 目標目錄
  • 目標代碼
  • 前提
  • 步入正題
    • src / utils / index.js
    • src /api / index.js
    • src /api / request.js
    • src /api / service.js
    • src /api / utils.js
    • src /api / modules / demo.js
  • 自動化配置
    • vite.config.js
    • eslint 校驗問題

1

作者GitHub:https://github.com/gitboyzcf 有興趣可關注!!!

目標目錄

1

目標代碼

<script setup>// 在js中直接調用useRequest() 函數就可以獲取到配置的接口const { API_DEMO_POST, API_DEMO_GET } = useRequest()// 使用非常簡單API_DEMO_GET({page: 1, pageSize: 10}).then(res => {  // 請求返回結果})
</script>

接下來看下面配置👇

前提

這里用到的相關npm包

  • element-plus 在這里用到了消息提示
  • axios 網絡請求庫
  • vueuse Vue hooks庫
  • nprogress 加載進度條
  • consola 好看的日志打印

以上包根據自己需求修改即可、可有可無

步入正題

src / utils / index.js

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
/*** 獲取資源路徑* @param {相對路徑} relativePath*    如果要動態獲取assets的文件文件夾下的images中的圖片*      relativePath 傳入 assets/images/name.png* @returns 文件所在路徑*/
const getStaticResource = (relativePath) => {return new URL(`../${relativePath}`, import.meta.url)
}/*** 消息提示* @param {彈出消息類型=》 info error warning success loading } type* @param {彈出消息文本} message* @param {彈出時間} duration* @param {彈出消息偏移} offset*/
const msg = (type, message, duration = 2000, offset = 90) => {ElMessage({message,type,duration,offset})
}/*** 模塊化方式處理 默認處理 modules文件夾下的所有js文件 內容以export default導出的文件* @param { 模塊內容集合 } moduleContext* @returns modules集合*/
const modulesHandle = (moduleContext = {}) => {if (!Object.keys(moduleContext).length) returnconst modules = {}Object.keys(moduleContext).forEach((v) => {for (let key in moduleContext[v].default) {modules[key] = moduleContext[v].default[key]}})return modules
}export { getStaticResource, modulesHandle, NProgress, msg }

src /api / index.js

import { modulesHandle } from '@/utils'const apis = modulesHandle(import.meta.glob('./modules/**/*.js', { eager: true }))
export const useRequest = () => apis

mport.meta.glob函數從文件系統導入多個模塊,詳情請看官網 https://cn.vitejs.dev/guide/features#glob-import

src /api / request.js

import { service } from './service'
function createRequest(service) {function request(config) {// config 自定義配置// axios默認配置const configDefault = {baseURL: import.meta.env.VITE_APP_API_BASEURL, // 所有通過此配置的基礎地址 在.env文件配置timeout: 15000, // 請求超時時間responseType: 'json', // 響應類型headers: {// 請求頭配置...}}const requestConfig = Object.assign(configDefault, config)return service(requestConfig)}return request
}export const request = createRequest(service)

src /api / service.js

import axios from 'axios'
import { httpLogError, requestError, throttleToLogin } from './utils'
import { msg, NProgress } from '@/utils'
import consola from 'consola'export function createService() {const request = axios.create()request.interceptors.request.use((request) => {NProgress.start()return request},(err) => {NProgress.done()return Promise.reject(err)})request.interceptors.response.use((response) => {NProgress.done()const dataAxios = response.data// 這個狀態碼是和后端約定的const { code, data } = dataAxios// 根據 code 進行判斷if (code === undefined) {return dataAxios} else {// 目前和公司后端口頭約定是字符串,以防萬一強制轉字符串switch (`${code}`) {// code === 200 | 2 代表沒有錯誤case '200':consola.withTag(`${response.config.url}`).success()return data// code === 400001004 代表token 過期打回登錄頁case '400001004':throttleToLogin()breakcase '400':// 不是正確的 codereturn requestError(response)case '401':// 錯誤登錄return throttleToLogin()default:// 不是正確的 codereturn requestError(response)}}}, (error) => {NProgress.done()console.log(error)const status = error.response?.statusswitch (status) {// TODO 再考慮下怎么判斷是跨域問題case undefined:case null:httpLogError(error, '網路錯誤或請求跨域')breakcase 400:httpLogError(error, '請求錯誤')breakcase 401:httpLogError(error, '未授權,請登錄')breakcase 403:httpLogError(error, '拒絕訪問')breakcase 404:httpLogError(error, `請求地址出錯: ${error.response.config.url}`)breakcase 408:httpLogError(error, '請求超時')breakcase 500:httpLogError(error, '服務器內部錯誤')breakcase 501:httpLogError(error, '服務未實現')breakcase 502:httpLogError(error, '網關錯誤')breakcase 503:httpLogError(error, '服務不可用')breakcase 504:httpLogError(error, '網關超時')breakcase 505:httpLogError(error, 'HTTP版本不受支持')breakdefault:httpLogError(error, '請求錯誤')break}msg('error', error.message)return Promise.reject(error)})return request
}export const service = createService()

src /api / utils.js

import { msg as nMsg } from '@/utils'
import consola from 'consola'export const httpLogError = (error, msg) => {error.message = msgconsola.error(new Error(msg))
}export const requestError = (response) => {return new Promise((_, reject) => {const { data } = responseconst msg = `api請求出錯 ${response.config.url}${data.message}`nMsg('error', msg)consola.error(new Error(msg))reject(data)})
}

src /api / modules / demo.js

import { request } from '@/api/request.js'
export default {API_DEMO_POST(data = {}) {return request({baseURL: '/mock/login',url: 'api/mock',method: 'post',data})},API_DEMO_GET(params = {}) {return request({url: '/demo/get',method: 'get',params})}
}

自動化配置

安裝 unplugin-auto-import/vite插件 https://github.com/unplugin/unplugin-auto-import#readme

npm install unplugin-auto-import -D 
or
pnpm install unplugin-auto-import -D
or
yarn add unplugin-auto-import -D

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'export default defineConfig({plugins: [vue(),AutoImport({imports: ['vue','vue-router','pinia',{'@/api': ['useRequest']}],// eslintrc: {// enabled: true, // Default `false`// filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`// globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')}})]
})

eslint 校驗問題

在vue文件中直接使用時 vscode 報紅 說未定義
err

  1. 上面 vite.config.js中注釋部分放開,運行項目根據這個./.eslintrc-auto-import.json相對路徑會生成該 js 文件 。 注:生成后 把 enabled屬性改為 false 以免再次生成
  2. .在根目錄的 eslintrc.cjseslint配置文件中添加下面代碼👇
    module.exports = {// ...'extends': [// ...'./.eslintrc-auto-import.json']
    }
    






到這里就結束了,后續還會更新 前端 系列相關,還請持續關注!
感謝閱讀,若有錯誤可以在下方評論區留言哦!!!

111



推薦文章👇

Vue3-Composition API 快速上手(簡單易懂)

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

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

相關文章

QEMU環境調試方法

本文從調試的角度出發&#xff0c;分享QEMU調試過程中的常見調試方法。 1.如何查看makefile構建過程執行的命令&#xff1f; 為了深入理解ucore操作系統實驗的編譯鏈接細節&#xff0c;需要知道makefile在執行的過程中一步一步的指令執行情況。然而大部分的工程中&#xff0c;…

CopyClip 2:提升Mac開發效率的利器

在Mac開發的日常工作中&#xff0c;高效地處理剪貼板內容是一個至關重要的任務。幸運的是&#xff0c;有一款強大的工具可以極大地提升你的開發效率——CopyClip 2。本文將介紹CopyClip 2的功能和優勢&#xff0c;以及它是如何成為Mac開發者們不可或缺的利器的。 CopyClip 2 簡…

【Docker】進階之路:(二)Docker簡介

【Docker】進階之路&#xff1a;&#xff08;二&#xff09;Docker簡介 什么是 DockerDocker 由來與發展歷程Docker的架構與組成Docker容器生態容器核心技術容器規范容器平臺技術 為什么使用DockerDocker的應用場景 什么是 Docker 簡單地講&#xff0c;Docker就是一個應用容器…

正則表達式(9):擴展正則表達式

正則表達式&#xff08;9&#xff09;&#xff1a;擴展正則表達式 小結 本博文轉載自 前文中一直在說&#xff0c;在Linux中&#xff0c;正則表達式可以分為”基本正則表達式”和”擴展正則表達式”。 我們已經認識了”基本正則表達式”&#xff0c;現在&#xff0c;我們來認…

T天池SQL訓練營(五)-窗口函數等

–天池龍珠計劃SQL訓練營 5.1窗口函數 5.1.1窗口函數概念及基本的使用方法 窗口函數也稱為OLAP函數。OLAP 是OnLine AnalyticalProcessing 的簡稱&#xff0c;意思是對數據庫數據進行實時分析處理。 為了便于理解&#xff0c;稱之為窗口函數。常規的SELECT語句都是對整張表進…

Unity由“鼠標點不準物體”引發的Camera的相關思考

問題 前段一個同事在使用Unity開發時遇到一個奇怪的問題&#xff0c;使用左鍵點擊發射射線的方式選擇物體&#xff0c;總是選不準&#xff0c;尤其是小的物體&#xff0c;鼠標點擊到物體上&#xff0c;有時能選上&#xff0c;有時選不上&#xff0c;偶爾點擊到物體旁邊…

Tensorflow.js 入門學習指南

Tensorflow.js 入門學習指南 官方地址TensorFlow.js (google.cn) Tensorflowjs是一個機器學習框架&#xff0c;使用 TensorFlowJS 可以創建生產級機器學習模型 安裝包 瀏覽器設置 您可以通過兩種主要方式在瀏覽器項目中獲取 TensorFlow.js&#xff1a; 使用腳本代碼。從 NPM…

基于MATLAB車輛防碰撞系統仿真

摘要 近年來&#xff0c;汽車行業的飛速發展使得我國的汽車保有量快速增長&#xff0c;但由此引發的交通事故導致的人員傷亡數量仍居高不下。從保護人身安全和降低交通事故發生的可能性的角度出發&#xff0c;車輛防碰撞系統能夠使駕駛員在沒注意到與前方車輛有碰撞危險的情況下…

Python:核心知識點整理大全11-筆記

目錄 ?編輯 6.2.4 修改字典中的值 6.2.5 刪除鍵—值對 注意 刪除的鍵—值對永遠消失了。 6.2.6 由類似對象組成的字典 6.3 遍歷字典 6.3.1 遍歷所有的鍵—值對 6.3.2 遍歷字典中的所有鍵 往期快速傳送門&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端

風力發電對講 IP語音對講終端IP安防一鍵呼叫對講 醫院對講終端SV-6005網絡音頻終端 目 錄 1、產品規格 2、接口使用 2.1、側面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、產品規格 輸入電源&#xff1a; 12V&#xff5e;24V的直流電源 網絡接口&am…

前端知識庫Html5和CSS3

1、常見的水平垂直居中實現方案 最簡單的方案是flex布局 .container{display: flex;align-items: center;justify-content: center; }絕對定位配合margin:auto(一定要給.son寬高) .father {position: relative;height: 300px; } .son {position: absolute;top: 0;right: 0;b…

PID控制參數整定(調節方法)原理+圖示+MATLAB調試

PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試 Chapter1 PID控制參數整定&#xff08;調節方法&#xff09;原理圖示MATLAB調試序一、P參數選取二、I的調節三、D的調節四、總結 Chapter2 PID參數調整&#xff0c;個人經驗&#xff08;配輸出曲線圖&#…

【51單片機系列】獨立按鍵介紹

本文是關于獨立按鍵的介紹及使用。首先介紹了按鍵&#xff0c;包括什么是按鍵及使用按鍵時如何實現軟件消抖。然后使用proteus仿真實現獨立按鍵控制LED指示燈的操作。 之前的LED、蜂鳴器、數碼管中IO口都是作為輸出使用&#xff0c;這里通過獨立按鍵實驗介紹IO口作為輸入的使用…

Edge 中的msedgewebview2總想聯網

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 使用Edge瀏覽器的時候&#xff0c;右下角火絨總會彈出“msedgewebview2”想要聯網的彈窗&#xff0c;如下 點擊發起程序&#xff0c;找到路徑如下&#xff1a; C:\Program Files (x86)\Microsoft\…

zabbix 進階

zabbix的字段發現機制&#xff1a; zabbix客戶端主動和服務端聯系&#xff0c;將自己的地址和端口發送服務端實現字段添加監控主機。 客戶端是主動一方。 缺點&#xff1a;自定義網段中主機數量太多&#xff0c;登記耗時會很久&#xff0c;而且這個自動發現機制不是很穩定。…

centos6.8下載地址

Index of /centos-store/6.8/isos/x86_64/ (liu.se) archive.kernel.org : http - rsynclinuxsoft.cern.ch : http - rsyncmirror.nsc.liu : http - rsync

被遺忘的書籍

C-被遺忘的書籍_牛客小白月賽82 (nowcoder.com) #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unor…

計組中各種透明性總結

虛擬存儲器&#xff0c;對應用程序員不可見。主存- cache層由硬件自動完成&#xff0c;對程序員不可見。cache純硬件&#xff0c;程序員不可見。內存&#xff0c;對程序員可見。知識點來源&#xff1a;王道模擬第六套主存-輔存層由硬件和操作系統共同完成&#xff0c;對應用程序…

【Docker一】Docker架構、鏡像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;開源的應用容器引擎。基于go語言開發的。運行在Linux系統中的開源的輕量級的“虛擬機” docker的容器技術可用在一臺主機上輕松到達為任何應用創建一個輕量級到的&#xff0c;可移植的&#xff0c;自給自足的容器 dock…

免費的數據采集軟件,最新免費的幾款數據采集軟件【2024】

在當今數字化時代&#xff0c;數據是企業決策和業務發展的關鍵。而如何高效獲取數據成為許多企業和研究機構的關注焦點。本文將深入探討數據采集軟件的種類。幫助大家選擇最適合自己需求的數據采集工具。 數據采集軟件種類 在眾多數據采集軟件中&#xff0c;有一類強大而多樣…