【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.mzph.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…