Преглед на файлове

feat(utils): 添加查询字符串序列化工具函数替代qs库

实现一个轻量级的查询字符串序列化工具,支持基本类型和数组,用于替代第三方qs库以减少打包体积
feige996 преди 10 месеца
родител
ревизия
02d8fb1268
променени са 4 файла, в които са добавени 31 реда и са изтрити 12 реда
  1. 0 1
      package.json
  2. 0 9
      pnpm-lock.yaml
  3. 2 2
      src/interceptors/request.ts
  4. 29 0
      src/utils/queryString.ts

+ 0 - 1
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"

+ 0 - 9
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: {}

+ 2 - 2
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<string, any>
@@ -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}`
       }

+ 29 - 0
src/utils/queryString.ts

@@ -0,0 +1,29 @@
+/**
+ * 将对象序列化为URL查询字符串,用于替代第三方的 qs 库,节省宝贵的体积
+ * 支持基本类型值和数组,不支持嵌套对象
+ * @param obj 要序列化的对象
+ * @returns 序列化后的查询字符串
+ */
+export function stringifyQuery(obj: Record<string, any>): 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('&')
+}