【taro3 + vue3 + webpack4】在微信小程序中的請求封裝及使用

前言

正在寫一個 以taro3 + vue3 + webpack4為基礎框架的微信小程序,之前一直沒有記咋寫的,現在總結記錄一下。uniapp + vite 的后面出。

文章目錄

  • 前言
    • 一、創建環境配置文件
    • 二、 配置 Taro 環境變量
    • 三、 創建請求封裝
    • 四、如何上傳到微信小程序體驗版
      • 1.第二點的時候,咱們已經配置好了運行每個環境的命令了,這個之后,只需要執行命令,例如:
      • 2.打開 微信開發者工具,打開 dist 文件夾
      • 3. 檢查上傳的版本

一、創建環境配置文件

在 Taro3 框架中,區分環境并配置不同的請求域名(baseURL)可以結合 Taro 提供的環境變量和配置文件來實現。

詳細配置,參考官網: 編譯配置

在這里插入圖片描述
在項目根目錄下創建 config 文件夾,并添加不同環境的配置文件:
在這里插入圖片描述

二、 配置 Taro 環境變量

package.json 中添加環境變量配置:

一般我們是用命令行創建的項目,都會寫好的,這個自己校對一下就好咯

{"scripts": {"dev:weapp": "taro build --type weapp --watch","build:weapp:dev": "cross-env NODE_ENV=development taro build --type weapp","build:weapp:test": "cross-env NODE_ENV=test taro build --type weapp","build:weapp:prod": "cross-env NODE_ENV=production taro build --type weapp"}
}

三、 創建請求封裝

src/utils src/server目錄下創建 request.ts 文件,使用 Taro 的 request 方法:
在這里插入圖片描述

這里是基于 Taro.request api哈, 官網直通道:https://docs.taro.zone/docs/apis/network/request/

// src/utils/request.js
import Taro from '@tarojs/taro';
import { baseUrlMap } from '@/config'; // 環境配置映射表// 請求配置
const defaultConfig = {baseURL: baseUrlMap[process.env.NODE_ENV || 'development'],timeout: 10000,header: {'content-type': 'application/json','X-Requested-With': 'XMLHttpRequest'}
};// 請求隊列,用于取消重復請求
const requestQueue = new Map();// 生成請求唯一標識
function generateRequestKey(config) {const { method, url, data } = config;return [method, url, JSON.stringify(data)].join('&');
}// 添加請求到隊列
function addRequestToQueue(config) {const requestKey = generateRequestKey(config);const abortController = new AbortController();requestQueue.set(requestKey, abortController);return abortController;
}// 從隊列中移除請求
function removeRequestFromQueue(config) {const requestKey = generateRequestKey(config);requestQueue.delete(requestKey);
}// 取消指定請求
function cancelRequest(config) {const requestKey = generateRequestKey(config);const abortController = requestQueue.get(requestKey);if (abortController) {abortController.abort();removeRequestFromQueue(config);}
}// 取消所有請求
function cancelAllRequests() {requestQueue.forEach(abortController => {abortController.abort();});requestQueue.clear();
}class Request {constructor(config) {this.config = config;this.interceptors = {request: [],response: []};}// 添加請求攔截器useRequestInterceptor(fulfilled, rejected) {this.interceptors.request.push({ fulfilled, rejected });return this;}// 添加響應攔截器useResponseInterceptor(fulfilled, rejected) {this.interceptors.response.unshift({ fulfilled, rejected });return this;}// 執行請求攔截器鏈async runRequestInterceptors(config) {let interceptedConfig = { ...config };for (const interceptor of this.interceptors.request) {try {if (interceptor.fulfilled) {interceptedConfig = await interceptor.fulfilled(interceptedConfig);}} catch (error) {if (interceptor.rejected) {await interceptor.rejected(error);}throw error;}}return interceptedConfig;}// 執行響應攔截器鏈async runResponseInterceptors(response) {let interceptedResponse = { ...response };for (const interceptor of this.interceptors.response) {try {if (interceptor.fulfilled) {interceptedResponse = await interceptor.fulfilled(interceptedResponse);}} catch (error) {if (interceptor.rejected) {await interceptor.rejected(error);}throw error;}}return interceptedResponse;}// 通用請求方法async request(options) {// 合并默認配置const mergedOptions = {...this.config,...options,url: this.config.baseURL + options.url};try {// 執行請求攔截器const interceptedOptions = await this.runRequestInterceptors(mergedOptions);// 處理取消請求邏輯const abortController = addRequestToQueue(interceptedOptions);interceptedOptions.signal = abortController.signal;// 發送請求const response = await Taro.request(interceptedOptions);// 從隊列中移除請求removeRequestFromQueue(interceptedOptions);// 執行響應攔截器return await this.runResponseInterceptors(response);} catch (error) {// 從隊列中移除請求removeRequestFromQueue(mergedOptions);// 處理取消請求錯誤if (error.name === 'AbortError') {console.log('請求已取消:', mergedOptions.url);return {statusCode: 499,errMsg: '請求已取消'};}// 處理其他錯誤throw error;}}// 快捷方法get(url, params = {}, config = {}) {return this.request({method: 'GET',url,data: params,...config});}post(url, data = {}, config = {}) {return this.request({method: 'POST',url,data,...config});}put(url, data = {}, config = {}) {return this.request({method: 'PUT',url,data,...config});}delete(url, params = {}, config = {}) {return this.request({method: 'DELETE',url,data: params,...config});}
}// 創建請求實例
const request = new Request(defaultConfig);// 添加請求攔截器 - 處理 token
request.useRequestInterceptor((config) => {// 添加 tokenconst token = Taro.getStorageSync('token');if (token) {config.header.Authorization = `Bearer ${token}`;}// 打印請求信息console.log(`[請求] ${config.method} ${config.url}`, config.data);return config;},(error) => {console.error('[請求錯誤]', error);return Promise.reject(error);}
);// 添加響應攔截器 - 處理業務狀態碼
request.useResponseInterceptor((response) => {console.log(`[響應] ${response.config.method} ${response.config.url}`, response.data);const { statusCode, data } = response;// 處理 HTTP 狀態碼if (statusCode < 200 || statusCode >= 300) {throw new Error(`HTTP錯誤 ${statusCode}`);}// 處理業務狀態碼 (根據后端規范調整)if (data.code === 200) {return data.data || true;} else if (data.code === 401) {// 未登錄或 token 過期Taro.showToast({title: '請先登錄',icon: 'none'});// 跳轉到登錄頁setTimeout(() => {Taro.navigateTo({ url: '/pages/login/index' });}, 1000);return Promise.reject(new Error('未登錄'));} else {// 其他業務錯誤Taro.showToast({title: data.message || '請求失敗',icon: 'none'});return Promise.reject(new Error(data.message || '請求失敗'));}},(error) => {console.error('[響應錯誤]', error);// 顯示錯誤信息Taro.showToast({title: error.message || '網絡請求失敗',icon: 'none'});return Promise.reject(error);}
);export default request;
export { cancelRequest, cancelAllRequests };

從上面的代碼可以看出來,我們在封裝request的時候,要注意以下幾點:

  1. 多環境支持:根據 process.env.NODE_ENV 自動切換 API 基礎路徑
  2. 請求攔截器:支持添加多個請求攔截器,可用于添加認證信息、日志記錄等
  3. 響應攔截器:支持添加多個響應攔截器,可用于統一處理業務狀態碼、錯誤提示等
  4. 請求取消:支持取消單個請求或所有請求,防止重復請求
  5. 錯誤處理:統一處理網絡錯誤、業務錯誤,并提供友好提示
  6. 擴展性:可根據需求靈活添加更多功能,如請求重試、緩存等

四、如何上傳到微信小程序體驗版

1.第二點的時候,咱們已經配置好了運行每個環境的命令了,這個之后,只需要執行命令,例如:

# 開發環境打包
npm run build:weapp:dev# 測試環境打包
npm run build:weapp:test# 生產環境打包
npm run build:weapp:prod

打包后的文件會生成在dist目錄下。

2.打開 微信開發者工具,打開 dist 文件夾

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3. 檢查上傳的版本

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

LeetCode:513、找樹左下角的值

//遞歸法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* t…

采用均線策略來跟蹤和投資基金

策略來源#睿思量化#小程序 截圖來源#睿思量化#小程序 在基金投資中&#xff0c;趨勢跟蹤策略是一種備受關注的交易方法。本文將基于兩張關于廣發電子信息傳媒股票 A&#xff08;代碼&#xff1a;005310&#xff09;的圖片資料&#xff0c;詳細闡述這一策略的應用與效果。 從第…

leetcode刷題---二分查找

力扣題目鏈接 二分查找算法使用前提&#xff1a;有序數組&#xff1b;數組內無重復元素 易錯點&#xff1a; 1.while循環的邊界條件&#xff1a;如到底是 while(left < right) 還是 while(left < right) 2.if條件后right&#xff0c;left的取值&#xff1a;到底是 right …

(leetcode) 力扣100 10.和為K的子數組(前綴和+哈希)

題目 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 數據范圍 1 < nums.length < 2 * 104 -1000 < nums[i] < 1000 -107 < k < 107 樣例 示例 1&#xff1a; 輸…

遨游衛星電話與普通手機有什么區別?

在數字化浪潮席卷全球的今天&#xff0c;通信設備的角色早已超越傳統語音工具&#xff0c;成為連接物理世界與數字世界的核心樞紐。然而&#xff0c;當普通手機在都市叢林中游刃有余時&#xff0c;面對偏遠地區、危險作業場景的應急通信需求&#xff0c;其局限性便顯露無遺。遨…

在Linux中如何使用Kill(),向進程發送發送信號

kill()函數 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 函數參數和返回值含義如下: pid:參數 pid 為正數的情況下,用于指定接收此信號的進程 pid;除此之外,參數 pid 也可設置為 0 或-1 以及小于-1 等不同值,稍后給說明。 …

Java SpringMVC 和 MyBatis 整合關鍵配置詳解

目錄 一、數據源配置二、MyBatis 工廠配置三、Mapper 掃描配置四、SpringMVC 配置五、整合示例實體類Mapper 接口Mapper XML 文件Service 類控制器JSP 頁面六、總結在 Java Web 開發中,SpringMVC 和 MyBatis 是兩個常用框架。SpringMVC 負責 Web 層的請求處理和視圖渲染,MyBa…

基于javaweb的SpringBoot高校圖書館座位預約系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

零成本打造專屬AI圖像處理平臺:IOPaint本地部署與遠程訪問指南

文章目錄 前言1.什么是IOPaint&#xff1f;2.本地部署IOPaint3.IOPaint簡單實用4.公網遠程訪問本地IOPaint5.內網穿透工具安裝6.配置公網地址7.使用固定公網地址遠程訪問總結 前言 移動攝影的普及使得記錄生活變得輕而易舉&#xff0c;然而獲得一張高質量的照片往往需要付出不…

子串簡寫(JAVA)一維前綴和, 藍橋杯

這個題用前綴和&#xff0c;開兩個數組&#xff0c;一個存前n個字符數據的c1的數字個數&#xff0c;另一個前n個字符c2的數字個數&#xff0c;然后遍歷一次加起來&#xff0c;有一個測試點沒過去&#xff0c;把那個存最后數的換成long&#xff0c;應該是這題數據范圍給的不對&a…

基于javaweb的SpringBoot自習室預約系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

基于大模型預測的全面驚厥性癲癇持續狀態技術方案大綱

目錄 一、引言二、數據收集與預處理三、大模型構建與訓練四、術前評估與預測五、術中監測與決策支持六、術后護理與康復預測七、統計分析與模型評估八、技術驗證與實驗證據九、健康教育與患者指導十、結論與展望一、引言 研究背景與意義 全面驚厥性癲癇持續狀態(GCSE)的臨床危…

Flink實時統計任務CPU異常排查與解決方案

一、核心原因分析 ?資源配置不合理? ?CPU核數與并行度不匹配?:TaskManager的taskmanager.numberOfTaskSlots設置過高,導致單個節點負載過載(如32核節點設置2個slot被多個任務占用,總需求超過物理CPU核數)。?內存與CPU分配不均?:內存不足引發頻繁GC,間接導致CPU利…

深入剖析 Linux 進程的睡眠與喚醒機制

在 Linux 操作系統的核心運轉體系中&#xff0c;進程的睡眠與喚醒機制如同精密時鐘的齒輪&#xff0c;默默驅動著整個系統的高效運行。理解這一機制不僅是掌握 Linux 內核工作原理的關鍵&#xff0c;更是優化系統性能、排查進程阻塞問題的核心所在。本文將深入剖析 Linux 進程睡…

【操作系統期末速成】①操作系統概述

——————2025.5.14————— 操作系統主要考點&#xff1a;操作系統概述、進程管理、內存管理、文件系統、設備管理&#xff08;前三個重點&#xff0c;第二三個是重中之重&#xff09; 操作系統概念&#xff08;OS&#xff09;&#xff1a;&#xff08;本質上是一個軟件…

【軟件工程】基于頻譜的缺陷定位

基于頻譜的缺陷定位&#xff08;Spectrum-Based Fault Localization, SBFL&#xff09;是一種通過分析程序執行覆蓋信息&#xff08;頻譜數據&#xff09;來定位代碼中缺陷的方法。其核心思想是&#xff1a;通過測試用例的執行結果&#xff08;成功/失敗&#xff09;和代碼覆蓋…

Spring Cloud:構建云原生微服務架構的最佳工具和實踐

&#x1f325;? 1. 引言 一、背景介紹&#xff1a;為什么需要微服務&#xff1f; 隨著互聯網技術的發展&#xff0c;企業級應用的功能日益復雜&#xff0c;傳統的單體架構&#xff08;Monolithic Architecture&#xff09;逐漸暴露出一系列問題&#xff1a; 項目龐大&#…

【Redis 進階】集群

思維導圖&#xff1a; 一、Redis集群概述 &#xff08;一&#xff09;廣義集群與狹義集群的定義 ??廣義集群??&#xff1a;指由多個機器組成的分布式系統&#xff0c;例如前面提到的主從模式和哨兵模式。??狹義集群??&#xff1a;Redis提供的集群模式&#xff0c;主要…

第二十八節:直方圖處理- 直方圖計算與繪制

直方圖是數字圖像處理的基石工具,在計算機視覺領域扮演著關鍵角色。通過本文,您將深入掌握使用OpenCV進行直方圖計算的底層原理,并學會多種專業的直方圖可視化方法。無論您是剛入門的新手還是希望提升技能的開發者,這里都有值得探索的進階技巧。 一、直方圖基礎理論 1.1 什…

傳奇游戲跟奇跡游戲的區別

前言 對傳奇和奇跡游戲背景感興趣的&#xff0c;可以去瀏覽以下相關博客&#xff1a; 傳奇與奇跡的發源 傳奇游戲跟奇跡游戲的區別 區別1&#xff1a;畫面 奇跡游戲畫面更為美觀&#xff08;圖1&#xff1a;奇跡游戲畫面&#xff09; 傳奇游戲畫面相對簡陋&#xff08;圖2&am…