From 02d8fb12684a8a27f064e088820d749669acd1ef Mon Sep 17 00:00:00 2001 From: feige996 <1020102647@qq.com> Date: Sun, 22 Jun 2025 16:55:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(utils):=20=E6=B7=BB=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0=E6=9B=BF=E4=BB=A3qs?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现一个轻量级的查询字符串序列化工具,支持基本类型和数组,用于替代第三方qs库以减少打包体积 --- package.json | 1 - pnpm-lock.yaml | 9 --------- src/interceptors/request.ts | 4 ++-- src/utils/queryString.ts | 29 +++++++++++++++++++++++++++++ 4 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 src/utils/queryString.ts diff --git a/package.json b/package.json index 6582535..d29e1f8 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ "js-cookie": "^3.0.5", "pinia": "2.0.36", "pinia-plugin-persistedstate": "3.2.1", - "qs": "6.5.3", "vue": "^3.4.21", "wot-design-uni": "^1.9.1", "z-paging": "2.8.7" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4b9e85..940debd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,9 +82,6 @@ importers: pinia-plugin-persistedstate: specifier: 3.2.1 version: 3.2.1(pinia@2.0.36(typescript@5.7.2)(vue@3.5.15(typescript@5.7.2))) - qs: - specifier: 6.5.3 - version: 6.5.3 vue: specifier: ^3.4.21 version: 3.5.15(typescript@5.7.2) @@ -5440,10 +5437,6 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -13257,8 +13250,6 @@ snapshots: dependencies: side-channel: 1.0.6 - qs@6.5.3: {} - quansync@0.2.10: {} querystringify@2.2.0: {} diff --git a/src/interceptors/request.ts b/src/interceptors/request.ts index ad77815..48cbf09 100644 --- a/src/interceptors/request.ts +++ b/src/interceptors/request.ts @@ -1,7 +1,7 @@ -import qs from 'qs' import { useUserStore } from '@/store' import { getEnvBaseUrl } from '@/utils' import { platform } from '@/utils/platform' +import { stringifyQuery } from '@/utils/queryString' export type CustomRequestOptions = UniApp.RequestOptions & { query?: Record @@ -18,7 +18,7 @@ const httpInterceptor = { invoke(options: CustomRequestOptions) { // 接口请求支持通过 query 参数配置 queryString if (options.query) { - const queryStr = qs.stringify(options.query) + const queryStr = stringifyQuery(options.query) if (options.url.includes('?')) { options.url += `&${queryStr}` } diff --git a/src/utils/queryString.ts b/src/utils/queryString.ts new file mode 100644 index 0000000..edf973e --- /dev/null +++ b/src/utils/queryString.ts @@ -0,0 +1,29 @@ +/** + * 将对象序列化为URL查询字符串,用于替代第三方的 qs 库,节省宝贵的体积 + * 支持基本类型值和数组,不支持嵌套对象 + * @param obj 要序列化的对象 + * @returns 序列化后的查询字符串 + */ +export function stringifyQuery(obj: Record): string { + if (!obj || typeof obj !== 'object' || Array.isArray(obj)) + return '' + + return Object.entries(obj) + .filter(([_, value]) => value !== undefined && value !== null) + .map(([key, value]) => { + // 对键进行编码 + const encodedKey = encodeURIComponent(key) + + // 处理数组类型 + if (Array.isArray(value)) { + return value + .filter(item => item !== undefined && item !== null) + .map(item => `${encodedKey}=${encodeURIComponent(item)}`) + .join('&') + } + + // 处理基本类型 + return `${encodedKey}=${encodeURIComponent(value)}` + }) + .join('&') +}