{"_id":"@creekjs/taro-adapter","_rev":"3-05e7774a015a8cfae06287ae5aebf9ce","name":"@creekjs/taro-adapter","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@creekjs/taro-adapter","version":"1.0.0","keywords":[],"author":"","license":"ISC","_id":"@creekjs/taro-adapter@1.0.0","maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"dist":{"shasum":"e22926a8045d6df55795be7751d1f720140e4068","tarball":"https://registry.npmjs.org/@creekjs/taro-adapter/-/taro-adapter-1.0.0.tgz","fileCount":19,"integrity":"sha512-kqOHmF4fkbHPbuel3vr8ltG9HCRXHjlf3jNzUIdDNfeiTj7yDTXa9O4pceoio7q0sYU0keffz4B11FN2ME9x9Q==","signatures":[{"sig":"MEUCIHlCAoIzGYHNpzu2Zq+IQLordAQqrMtVVeRN99uJsxj+AiEAsIgskxQAzZCKPLnU4WTgE8onRpDW+ysY8IiATvRfcq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37599},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"8bd8af006add4c11f4b262a57486a3768df1f76e","scripts":{"father:dev":"father dev","father:build":"father build"},"_npmUser":{"name":"creekjs","email":"997402405@qq.com"},"_npmVersion":"10.2.3","description":"Taro 小程序开发的 Axios 适配器，让你在 Taro 项目中无缝使用 Axios。","directories":{},"_nodeVersion":"20.10.0","dependencies":{"axios":"^1.7.9","@tarojs/taro":"^4.0.9"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/taro-adapter_1.0.0_1756180869159_0.11513402418612917","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@creekjs/taro-adapter","version":"1.0.1","keywords":[],"author":"","license":"ISC","_id":"@creekjs/taro-adapter@1.0.1","maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"dist":{"shasum":"f5ee112954c0ec1b70e904a0631b4fa305fb3bdd","tarball":"https://registry.npmjs.org/@creekjs/taro-adapter/-/taro-adapter-1.0.1.tgz","fileCount":19,"integrity":"sha512-VKLJ+5xFJRTkY7geynFMSSh1ttiRrFDdNs+V39iTnPF84RXYoUFYsMM4isGKkW988Q80wW6hXqyPdzpVaKzM0g==","signatures":[{"sig":"MEYCIQDidEFCWp6Nm+XqlA7y2B0uWnQOli7GMdUPKg/7NbWy/gIhAL8Jt/ti3JbXA8FOJi6UCCVgh/bosccok4pDFsEUkRG2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37600},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"5a79603da129aa2d93865bc28e2b80af122a1e12","scripts":{"father:dev":"father dev","father:build":"father build"},"_npmUser":{"name":"creekjs","email":"997402405@qq.com"},"_npmVersion":"10.2.3","description":"Taro 小程序开发的 Axios 适配器，让你在 Taro 项目中无缝使用 Axios。","directories":{},"_nodeVersion":"20.10.0","dependencies":{"axios":"^1.7.9","@tarojs/taro":"^4.0.9"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/taro-adapter_1.0.1_1756181993972_0.2905130985476083","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@creekjs/taro-adapter","version":"1.0.2","description":"Taro 小程序开发的 Axios 适配器，让你在 Taro 项目中无缝使用 Axios。","main":"dist/index.js","scripts":{"father:build":"father build","father:dev":"father dev --no-clean"},"keywords":[],"author":"","license":"ISC","dependencies":{"@tarojs/taro":"^4.0.9","axios":"^1.7.9"},"_id":"@creekjs/taro-adapter@1.0.2","gitHead":"03b481538454c91aed8dde06f1d905fb86463e00","types":"./dist/index.d.ts","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-Ktelezl46xVnVa+mZgPeOfnkERFbVgBj0zNvHdhT/44GDlHFQx5ms3kl29dFOV+q7QaKFPcJ/eke791IzapZnw==","shasum":"dca2d7523e451548b403adc7591e87d4588c6137","tarball":"https://registry.npmjs.org/@creekjs/taro-adapter/-/taro-adapter-1.0.2.tgz","fileCount":21,"unpackedSize":38481,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQClpSNC3CiaQb5SVkABOic60gILJSSvGVrpnn1ARBT4NwIgVQay3GGEzdlrnFJFNKJGy9jQ85R6C5BSH0w/FzFs2zg="}]},"_npmUser":{"name":"creekjs","email":"997402405@qq.com"},"directories":{},"maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/taro-adapter_1.0.2_1769138313599_0.4827739798946411"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-26T04:01:09.017Z","modified":"2026-01-23T03:18:33.882Z","1.0.0":"2025-08-26T04:01:09.355Z","1.0.1":"2025-08-26T04:19:54.159Z","1.0.2":"2026-01-23T03:18:33.755Z"},"license":"ISC","keywords":[],"description":"Taro 小程序开发的 Axios 适配器，让你在 Taro 项目中无缝使用 Axios。","maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"readme":"# @creekjs/taro-adapter\n\nTaro 小程序开发的 Axios 适配器，让你在 Taro 项目中无缝使用 Axios。\n\n## 特性\n\n- 🚀 完全兼容 Axios API\n- 📱 支持所有 Taro 支持的小程序平台\n- 📁 支持文件上传\n- 📊 支持上传进度监听\n- ⚡ 支持请求中断\n- 🛠️ TypeScript 支持\n\n## 安装\n\n```bash\nnpm install @creekjs/taro-adapter\n# 或\nyarn add @creekjs/taro-adapter\n```\n\n## 基础用法\n\n```typescript\nimport axios from 'axios';\nimport { taroAdapter } from '@creekjs/taro-adapter';\n\n// 配置 Taro 适配器\naxios.defaults.adapter = taroAdapter;\n\n// 现在可以正常使用 Axios\nconst response = await axios.get('https://api.example.com/users');\nconsole.log(response.data);\n```\n\n## 与 @creekjs/request 集成\n\n```typescript\nimport { request } from '@creekjs/request';\nimport { taroAdapter } from '@creekjs/taro-adapter';\n\n// 为 request 实例配置适配器\nrequest.instance.defaults.adapter = taroAdapter;\n\n// 或者创建专用的 Taro 实例\nconst taroRequest = request.createInstance({\n  adapter: taroAdapter,\n  baseURL: 'https://api.example.com'\n});\n\n// 正常使用\nconst users = await taroRequest.get('/users');\n```\n\n## 文件上传\n\n### 基础文件上传\n\n```typescript\nimport Taro from '@tarojs/taro';\nimport { FileData } from '@creekjs/taro-adapter';\n\n// 选择文件\nconst chooseResult = await Taro.chooseImage({\n  count: 1,\n  sizeType: ['original', 'compressed'],\n  sourceType: ['album', 'camera']\n});\n\n// 创建文件数据\nconst fileData = new FileData({\n  path: chooseResult.tempFilePaths[0],\n  name: 'avatar.jpg',\n  type: 'image/jpeg'\n});\n\n// 上传文件\nconst response = await axios.post('/api/upload', {\n  file: fileData,\n  userId: 123\n});\n```\n\n### 多文件上传\n\n```typescript\nconst chooseResult = await Taro.chooseImage({\n  count: 9,\n  sizeType: ['compressed'],\n  sourceType: ['album']\n});\n\nconst files = chooseResult.tempFilePaths.map((path, index) => \n  new FileData({\n    path,\n    name: `image_${index}.jpg`,\n    type: 'image/jpeg'\n  })\n);\n\nconst response = await axios.post('/api/upload/multiple', {\n  files,\n  albumId: 456\n});\n```\n\n### 上传进度监听\n\n```typescript\nconst response = await axios.post('/api/upload', \n  { file: fileData },\n  {\n    onUploadProgress: (progressEvent) => {\n      const progress = Math.round(\n        (progressEvent.loaded * 100) / progressEvent.total\n      );\n      console.log(`上传进度: ${progress}%`);\n      \n      // 更新 UI\n      Taro.showToast({\n        title: `上传中 ${progress}%`,\n        icon: 'loading',\n        duration: 100\n      });\n    }\n  }\n);\n```\n\n## 请求中断\n\n```typescript\nimport axios from 'axios';\n\n// 创建取消令牌\nconst source = axios.CancelToken.source();\n\n// 发起请求\nconst requestPromise = axios.get('/api/data', {\n  cancelToken: source.token\n});\n\n// 5秒后取消请求\nsetTimeout(() => {\n  source.cancel('请求超时');\n}, 5000);\n\ntry {\n  const response = await requestPromise;\n  console.log(response.data);\n} catch (error) {\n  if (axios.isCancel(error)) {\n    console.log('请求被取消:', error.message);\n  } else {\n    console.error('请求失败:', error);\n  }\n}\n```\n\n## API 参考\n\n### taroAdapter\n\n主要的适配器函数，将 Axios 请求转换为 Taro 请求。\n\n```typescript\nfunction taroAdapter(config: AxiosRequestConfig): Promise<AxiosResponse>\n```\n\n### FileData 类\n\n用于封装文件数据的工具类。\n\n```typescript\nclass FileData {\n  constructor(options: {\n    path: string;      // 文件路径\n    name?: string;     // 文件名\n    type?: string;     // MIME 类型\n  })\n  \n  getFileContent(): {\n    filePath: string;\n    name: string;\n    type?: string;\n  }\n}\n```\n\n### PostData 类\n\n用于处理包含文件的表单数据。\n\n```typescript\nclass PostData<T> {\n  constructor(data: T)\n  \n  getParsedPostData(): {\n    normalData: T;     // 普通数据\n    fileData: T;       // 文件数据\n  }\n}\n```\n\n## 工具函数\n\n### 对象合并\n\n```typescript\nimport { merge } from '@creekjs/taro-adapter/utils';\n\nconst result = merge(\n  { a: 1, b: { c: 2 } },\n  { b: { d: 3 }, e: 4 }\n);\n// 结果: { a: 1, b: { c: 2, d: 3 }, e: 4 }\n```\n\n### URL 构建\n\n```typescript\nimport { buildUrl, buildFullPath } from '@creekjs/taro-adapter/utils';\n\n// 构建带参数的 URL\nconst url = buildUrl('/api/users', { page: 1, size: 10 });\n// 结果: '/api/users?page=1&size=10'\n\n// 构建完整路径\nconst fullPath = buildFullPath('https://api.example.com', '/users');\n// 结果: 'https://api.example.com/users'\n```\n\n### 类型检查\n\n```typescript\nimport { isString, isObject } from '@creekjs/taro-adapter/utils';\n\nif (isString(value)) {\n  // value 是 string 类型\n}\n\nif (isObject(value)) {\n  // value 是 object 类型\n}\n```\n\n## 在不同平台使用\n\n### 微信小程序\n\n```typescript\n// app.config.ts\nexport default {\n  pages: ['pages/index/index'],\n  window: {\n    backgroundTextStyle: 'light',\n    navigationBarBackgroundColor: '#fff',\n    navigationBarTitleText: 'WeChat',\n    navigationBarTextStyle: 'black'\n  },\n  // 配置网络请求域名\n  permission: {\n    'scope.writePhotosAlbum': {\n      desc: '保存图片到相册'\n    }\n  }\n}\n```\n\n### 支付宝小程序\n\n```typescript\n// 支付宝小程序中的使用方式相同\nimport { taroAdapter } from '@creekjs/taro-adapter';\nimport axios from 'axios';\n\naxios.defaults.adapter = taroAdapter;\n\n// 正常使用 Axios API\nconst response = await axios.get('/api/data');\n```\n\n### H5 环境\n\n```typescript\n// 在 H5 环境中，适配器会自动降级到标准的 Axios 行为\n// 无需特殊配置\n```\n\n## 错误处理\n\n```typescript\ntry {\n  const response = await axios.get('/api/data');\n  console.log(response.data);\n} catch (error) {\n  if (error.response) {\n    // 服务器响应错误\n    console.error('响应错误:', error.response.status, error.response.data);\n  } else if (error.request) {\n    // 网络错误\n    console.error('网络错误:', error.message);\n  } else {\n    // 其他错误\n    console.error('请求配置错误:', error.message);\n  }\n}\n```\n\n## 最佳实践\n\n### 1. 统一配置\n\n```typescript\n// utils/request.ts\nimport axios from 'axios';\nimport Taro from '@tarojs/taro';\nimport { taroAdapter } from '@creekjs/taro-adapter';\n\n// 创建实例\nconst instance = axios.create({\n  adapter: taroAdapter,\n  baseURL: 'https://api.example.com',\n  timeout: 10000\n});\n\n// 请求拦截器\ninstance.interceptors.request.use(\n  (config) => {\n    // 显示加载提示\n    Taro.showLoading({ title: '加载中...' });\n    \n    // 添加认证头\n    const token = Taro.getStorageSync('token');\n    if (token) {\n      config.headers.Authorization = `Bearer ${token}`;\n    }\n    \n    return config;\n  },\n  (error) => {\n    Taro.hideLoading();\n    return Promise.reject(error);\n  }\n);\n\n// 响应拦截器\ninstance.interceptors.response.use(\n  (response) => {\n    Taro.hideLoading();\n    return response;\n  },\n  (error) => {\n    Taro.hideLoading();\n    \n    // 统一错误处理\n    Taro.showToast({\n      title: error.message || '请求失败',\n      icon: 'none'\n    });\n    \n    return Promise.reject(error);\n  }\n);\n\nexport default instance;\n```\n\n### 2. 文件上传封装\n\n```typescript\n// utils/upload.ts\nimport Taro from '@tarojs/taro';\nimport { FileData } from '@creekjs/taro-adapter';\nimport request from './request';\n\nexport interface UploadOptions {\n  count?: number;\n  sizeType?: ('original' | 'compressed')[];\n  sourceType?: ('album' | 'camera')[];\n  onProgress?: (progress: number) => void;\n}\n\nexport async function uploadImages(options: UploadOptions = {}) {\n  const {\n    count = 1,\n    sizeType = ['compressed'],\n    sourceType = ['album', 'camera'],\n    onProgress\n  } = options;\n  \n  try {\n    // 选择图片\n    const chooseResult = await Taro.chooseImage({\n      count,\n      sizeType,\n      sourceType\n    });\n    \n    // 创建文件数据\n    const files = chooseResult.tempFilePaths.map((path, index) => \n      new FileData({\n        path,\n        name: `image_${Date.now()}_${index}.jpg`,\n        type: 'image/jpeg'\n      })\n    );\n    \n    // 上传文件\n    const response = await request.post('/api/upload', \n      { files },\n      {\n        onUploadProgress: (progressEvent) => {\n          const progress = Math.round(\n            (progressEvent.loaded * 100) / progressEvent.total\n          );\n          onProgress?.(progress);\n        }\n      }\n    );\n    \n    return response.data;\n  } catch (error) {\n    console.error('上传失败:', error);\n    throw error;\n  }\n}\n```\n\n### 3. 请求缓存\n\n```typescript\n// utils/cache.ts\nclass RequestCache {\n  private cache = new Map();\n  private readonly TTL = 5 * 60 * 1000; // 5分钟\n  \n  get(key: string) {\n    const item = this.cache.get(key);\n    if (item && Date.now() - item.timestamp < this.TTL) {\n      return item.data;\n    }\n    this.cache.delete(key);\n    return null;\n  }\n  \n  set(key: string, data: any) {\n    this.cache.set(key, {\n      data,\n      timestamp: Date.now()\n    });\n  }\n  \n  clear() {\n    this.cache.clear();\n  }\n}\n\nexport const requestCache = new RequestCache();\n```\n\n## 注意事项\n\n1. **平台限制**: 不同小程序平台对网络请求有不同的限制，请查阅对应平台文档\n2. **域名配置**: 小程序需要在后台配置合法域名\n3. **文件大小**: 注意文件上传的大小限制\n4. **并发限制**: 小程序对并发请求数量有限制\n5. **HTTPS**: 小程序要求使用 HTTPS 协议\n\n## 许可证\n\nISC","readmeFilename":"README.md"}