ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

uniapp集成腾讯即时通讯im,获取消息,已读消息接口慢,未读的群组会话获取消息接口不稳定有时候几十毫秒,有时候两三秒设为已读接口同理...如何解决?

2026/8/16 21:33:33 拓冰建站 浏览量
uniapp集成腾讯即时通讯im,获取消息,已读消息接口慢,未读的群组会话获取消息接口不稳定有时候几十毫秒,有时候两三秒设为已读接口同理...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

📌特别说明:
文中问题案例来源于真实生产环境与公开技术社区,并结合多位一线资深工程师与架构师的长期实践经验,经过人工筛选与AI系统化智能整理后输出。文中的解决方案并非唯一“标准答案”,而是兼顾可行性、可复现性与思路启发性的实践参考,供你在实际项目中灵活运用与演进。

欢迎订阅本专栏,一次订阅后,专栏内所有文章可永久免费阅读,后续更新内容皆不用再次订阅,持续更新中。

📢 问题描述

详细问题描述如下:uniapp集成腾讯即时通讯im,获取消息,已读消息接口慢,未读的群组会话获取消息接口不稳定有时候几十毫秒,有时候两三秒设为已读接口同理。ios快,安卓慢。不存在未读消息的群组进入也很快。猜测是sdk网络波动或每次都走了云端。

全文目录:

    • 📢 问题描述
    • 📣 请知悉:如下方案不保证一定适配你的问题!
      • ✅️问题理解
      • ✅️问题解决方案
        • 🟢方案 A:先做SDK 版本与架构升级,这是优先级最高的主方案
        • 🟡方案 B:重构“进入会话”的调用顺序,不要把 getMessageList 和 setMessageRead 串行阻塞首屏
        • 🟡方案 C:把“会话列表 / 未读总数”改成事件驱动,不要每次现查
        • 🟢方案 D:做一套Android 专项时序埋点,把“慢”拆成 4 段
        • 🟡方案 E:把“已读”改成 不阻塞首屏的弱一致策略
        • 🔴方案 F:排查是不是你自己“叠加调用”导致的伪慢,这个在 uni-app 里非常常见
      • ✅️问题延伸
      • ✅️问题预测
      • ✅️小结
    • 🌹 结语 & 互动说明
    • 🧧 文末福利:技术成长加速包 🧧
    • 🫵 Who am I?

📣 请知悉:如下方案不保证一定适配你的问题!

如下是针对上述问题进行专业角度剖析答疑,不喜勿喷,仅供参考:

✅️问题理解

你这个问题,我先给一个明确判断:大概率不是“单一接口慢”这么简单,而是“进入未读群会话时,前端把多个链路叠在一起了”——至少包含:

  1. 会话同步链路:登录成功后,SDK 会分页从云端同步会话列表getConversationList的返回里有isSyncCompleted字段就是为了标识“云端会话同步是否完成”;如果 SDK 还没完成同步,立即读未读总数/会话数据,本身就可能拿到不完整结果或表现出明显波动。
  2. 消息拉取链路getMessageList本来就是“首次进入会话渲染消息列表/ 下拉查看更多历史消息”时调用的接口;也就是说,你进入未读群会话时,它天然可能触发历史消息或漫游消息拉取
  3. 已读上报链路setMessageRead不是本地改个状态就完了,官方定义是“将某会话下的未读消息状态设置为已读”,而且是针对整个会话进行已读上报,成功后会把该会话未读数置 0。也就是说,这个动作本质上更像一次“会话级状态同步”。
  4. Android 端运行时差异:你现在是 uni-app 集成 Tencent IM,这类方案在 App 端通常要经过 WebView / JS 运行时 / WebSocket 链路;腾讯官方更新日志里明确提到过WebView 环境 websocket 重连恢复慢、以及uni-app 打包 App 支持二进制传输数据这类和稳定性、性能直接相关的改动。同时官方也明确写了:V3(@tencentcloud/chat)已经是旧架构,建议升级到 V4 以获得更好的稳定性和在线支持

所以,结合你的现象:

  • iOS 快、Android 慢
  • 无未读的群组进入很快
  • 有未读的群组获取消息/设已读时快时慢
  • 几十毫秒到两三秒抖动明显

我更倾向于判断为:
“未读群会话进入时,触发了云端同步 / 历史消息拉取 / 已读上报,而 Android 侧 WebView + WebSocket 稳定性与调度更差,导致延迟抖动被放大。”这是一个进入会话链路设计问题 + SDK版本/端能力问题 + Android运行环境差异问题的叠加,不太像单纯的“腾讯云服务端故障”。官方文档和更新日志能支持这个判断方向。

另外还有一个很关键的点:
“不存在未读消息的群组进入也很快”这一条非常有价值。它强烈说明:慢并不是会话页本身渲染慢,而是“未读相关链路”触发时才慢。从经验上看,这通常意味着:

  • 无未读时,更多依赖本地已有缓存 / 已同步会话数据
  • 有未读时,进入页后会触发补消息、对齐状态、清未读、会话更新等动作
  • 你当前代码很可能把这些动作串行阻塞到了首屏

这部分是基于你症状的工程判断,不是拍脑袋猜。

下面这个流程图,就是我对你现状的理解模型:

✅️问题解决方案

🟢方案 A:先做SDK 版本与架构升级,这是优先级最高的主方案

这是我最推荐的方案,因为你这个问题非常像踩了旧版本 + Android 端能力差异 + uni-app 打包路径的坑。

腾讯官方更新日志里有几条非常关键:

  • V3(@tencentcloud/chat)是旧架构,官方建议升级到 V4,以获得更好的稳定性和在线支持。
  • 3.5.8修复了WebView 环境 ws 重连恢复慢的问题。
  • 3.6.2增加了uniapp 打包 App 支持二进制传输数据。这条对 App 端性能和传输效率非常关键。
  • 3.5.9还修复过“在线同步未读偶现产生空会话”“登录成功立即获取单聊漫游偶现字段未更新”等同步类问题。虽然不是你这个 case 的完全同名问题,但说明这个版本段确实有同步稳定性修正。

所以你应该先做这几步:

第一步:确认当前版本

  • @tencentcloud/chat版本号
  • uni-app 版本
  • HBuilderX 版本
  • Android System WebView 版本
  • 真机 Android 版本 + 机型

第二步:如果当前低于 3.6.2,优先升级到最新稳定版

  • 至少先升到包含 3.6.2 之后能力的版本
  • 更推荐直接评估迁移V4 / lite-chat
  • 升级后先不要动太多业务代码,先做 A/B 对比:同机型、同账号、同群、同网络、同未读量

第三步:升级验证项
你要重点看这 4 个数据:

  • 未读群进入getMessageListp50 / p95
  • setMessageReadp50 / p95
  • Android 冷启动后首次进会话耗时
  • Android 后台切前台再进会话耗时

为什么我把升级放第一位?
因为如果你现在用的是较老的 V3 版本,那么后面做再多业务层优化,可能都在旧 runtime / 旧 ws 行为 / 旧 uni-app 传输路径上打补丁,收益有限。先把 SDK 基线抬上去,后面的优化才有意义。💡

🟡方案 B:重构“进入会话”的调用顺序,不要把 getMessageList 和 setMessageRead 串行阻塞首屏

这是你代码层面最容易立竿见影的优化。

你现在大概率是这种链路:

  1. 进入会话页
  2. 立刻查会话
  3. 立刻拉消息
  4. 立刻设已读
  5. 等所有 Promise 回来后再真正渲染

这会导致一个问题:
只要云端同步、网络抖动、Android WebView 调度有一点波动,整个首屏就被卡住。

正确思路应该是:

  1. 先确认 SDK_READY
  2. 先确认当前 conversation 已进入“可读状态”
  3. 首屏只做一次getMessageList
  4. 消息能渲染就先渲染
  5. setMessageRead放到首屏渲染后异步触发
  6. 绝对不要在onShow/watch/mounted/ 路由切换里重复调用同一套逻辑

官方文档明确说了:

  • SDK ready后才能稳定使用 SDK 能力。
  • getMessageList是进入会话首次渲染时用的。
  • setMessageRead是打开/切换会话时调用的会话级已读上报。

推荐你改成下面这种结构:

// conversation-enter.jsletenteringMap=newMap();letreadMarkMap=newMap();exportasyncfunctionenterConversation(chat,conversationID){if(enteringMap.get(conversationID)){returnenteringMap.get(conversationID);}consttask=(async()=>{// 1. 确保 SDK readyawaitwaitSdkReady(chat);// 2. 首次只拉消息,不要先 setMessageReadconstmsgResp=awaitchat.getMessageList({conversationID});constmessageList=msgResp?.data?.messageList||[];// 3. 先把消息渲染出去renderMessageList(conversationID,messageList);// 4. 渲染完成后,异步设已读,不阻塞 UIqueueMicrotask(()=>{debounceSetRead(chat,conversationID);});returnmessageList;})().finally(()=>{enteringMap.delete(conversationID);});enteringMap.set(conversationID,task);returntask;}functiondebounceSetRead(chat,conversationID){clearTimeout(readMarkMap.get(conversationID));consttimer=setTimeout(async()=>{try{awaitchat.setMessageRead({conversationID});}catch(err){console.warn('[IM] setMessageRead failed',conversationID,err);}},200);// 让首屏先出来readMarkMap.set(conversationID,timer);}functionwaitSdkReady(chat){if(chat.isReady&&chat.isReady())returnPromise.resolve();returnnewPromise((resolve)=>{consthandler=()=>{chat.off(TencentCloudChat.EVENT.SDK_READY,handler);resolve();};chat.on(TencentCloudChat.EVENT.SDK_READY,handler);});}

这个方案能解决什么?

  • 避免首屏被 setMessageRead 阻塞
  • 避免重复进入同一会话时并发打 SDK
  • 避免 Android 上 Promise 链过长造成体感慢
  • 把“消息拉取”和“已读上报”解耦

再强调一个很容易踩坑的点:
不要在以下多个地方重复触发同一逻辑

  • onLoad
  • onShow
  • 监听当前会话变化watch(currentConversationID)
  • 页面恢复onAppShow
  • 收到新消息事件后又自动刷新当前会话

很多项目最后不是“接口慢”,而是自己把接口打了 2~5 次,看起来就像腾讯 SDK 不稳定。

🟡方案 C:把“会话列表 / 未读总数”改成事件驱动,不要每次现查

官方给了非常明确的机制:

  • 可以监听CONVERSATION_LIST_UPDATED获取会话列表更新通知。
  • 可以监听TOTAL_UNREAD_MESSAGE_COUNT_UPDATED获取未读总数变化。
  • getConversationList返回还有isSyncCompleted,说明它本身就有“从云端同步进行中/已完成”的阶段性。

这意味着,你不应该这样写:

// 错误思路:每次进会话页都主动查awaitchat.getConversationList({hasUnreadCount:true});awaitchat.getTotalUnreadMessageCount();awaitchat.getConversationProfile(conversationID);awaitchat.getMessageList({conversationID});

而应该改成:

  • 首页 / tab 页:初始化后监听会话列表和未读变化,写入本地 store
  • 会话页:直接读 store 里的 conversation
  • 只有当 conversation 不存在或消息列表为空时,才主动补一次getMessageList

推荐结构:

// store/im.jsconststate={conversationMap:newMap(),totalUnreadCount:0,};exportfunctionbindIMEvents(chat){chat.on(TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED,(event)=>{constlist=event.data||[];list.forEach(item=>{state.conversationMap.set(item.conversationID,item);});});chat.on(TencentCloudChat.EVENT.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED,(event)=>{state.totalUnreadCount=event.data||0;});chat.on(TencentCloudChat.EVENT.NET_STATE_CHANGE,(event)=>{console.log('[IM][NET_STATE_CHANGE]',event.data.state);});chat.on(TencentCloudChat.EVENT.ERROR,(event)=>{console.error('[IM][ERROR]',event.data);});}

这样做的收益是:

  • 会话页打开时,不用再去“现问一次云端”
  • 未读变化靠事件推送更新,不靠页面刷新拉取
  • 首页、会话页、角标的状态来源一致
  • 更容易定位“究竟是 SDK 慢还是页面逻辑重复调用”
🟢方案 D:做一套Android 专项时序埋点,把“慢”拆成 4 段

你这个问题已经不适合再靠肉眼猜了。要落地,就必须埋点。
而且这个埋点不是泛泛而谈,是要专门拆这 4 段:

  1. 进入页面耗时
  2. getMessageList耗时
  3. 首屏渲染耗时
  4. setMessageRead耗时

再把这几个上下文一起记下来:

  • Android 机型
  • Android 版本
  • System WebView 版本
  • 当前网络类型(Wi-Fi/4G/5G)
  • 进入会话时未读数
  • 当前群消息量
  • 是否冷启动后首次进入
  • 是否后台切前台后进入
  • 是否在NET_STATE_CONNECTING状态下触发
  • 当前 SDK 版本、uni-app 版本

官方文档明确支持监听NET_STATE_CHANGESDK_NOT_READYERROR等事件,这些事件就是你判断“真网络抖动”还是“你自己逻辑问题”的关键证据。

我建议你直接上下面这个埋点工具:

functionnow(){returnDate.now();}asyncfunctiontrackIMStep(name,ext,fn){conststart=now();try{constres=awaitfn();constcost=now()-start;console.log('[IM_PERF]',{name,cost,success:true,...ext});returnres;}catch(err){constcost=now()-start;console.error('[IM_PERF]',{name,cost,success:false,error:err?.message||String(err),code:err?.code,...ext});throwerr;}}

会话页里这样用:

asyncfunctionopenConversation(chat,conversationID,unreadCount){constext={conversationID,unreadCount,platform:'android',page:'chat-detail'};constpageEnterStart=Date.now();constmsgResp=awaittrackIMStep('getMessageList',ext,()=>{returnchat.getMessageList({conversationID});});constmessageList=msgResp?.data?.messageList||[];renderMessageList(conversationID,messageList);console.log('[IM_PERF]',{name:'render_first_screen',cost:Date.now()-pageEnterStart,conversationID,unreadCount});if(unreadCount>0){setTimeout(()=>{trackIMStep('setMessageRead',ext,()=>{returnchat.setMessageRead({conversationID});});},200);}}

然后你要按下面方式看结果:

  • 如果getMessageList本身慢
    → 说明慢在消息拉取 / 同步链路
  • 如果getMessageList很快,但首屏慢
    → 说明慢在消息解析 / 自定义消息渲染 / Vue diff / 列表渲染
  • 如果setMessageRead单独慢
    → 说明慢在已读上报 / 网络状态 / SDK 状态
  • 如果所有慢请求都伴随NET_STATE_CONNECTING
    → 说明是 WebSocket 网络抖动 / 重连恢复问题
  • 如果只在 Android 某些机型慢
    → 重点查 System WebView 版本、ROM、省电策略、后台网络策略

这个方案非常关键,因为它能把“腾讯 SDK 慢”变成一个有证据链的问题。🔥

🟡方案 E:把“已读”改成 不阻塞首屏的弱一致策略

这是一个很实用的工程优化,很多 IM 项目最后就是这么做的。

核心思想:

  • 首屏目标是“消息先出来
  • 已读目标是“状态尽快对齐
  • 这两个目标不应该强耦合

所以你可以采用:

策略 1:首屏渲染后 100~300ms 再上报已读
这样用户体感会明显变好,因为 UI 已经可见。

策略 2:只有unreadCount > 0才上报已读
不要每次进会话都机械地打一遍。

策略 3:同一个会话短时间内只允许一次已读上报
例如 2 秒节流:

constreadThrottleMap=newMap();functionshouldReportRead(conversationID,interval=2000){constnow=Date.now();constlast=readThrottleMap.get(conversationID)||0;if(now-last<interval)returnfalse;readThrottleMap.set(conversationID,now);returntrue;}

策略 4:上报失败不阻塞页面,也不要立刻无限重试

  • 失败时打日志
  • 等下次页面稳定 / 网络恢复再重试

这个方案的意义在于:
即便网络真的有波动,用户感知也会从“页面卡住”变成“页面先开,已读稍后完成”,体验会好很多。

🔴方案 F:排查是不是你自己“叠加调用”导致的伪慢,这个在 uni-app 里非常常见

这条我单独拎出来,因为太常见了。

你要重点搜一下这些场景:

  • 同一个页面是否既在onLoad又在onShow调了getMessageList
  • 是否有watch(route.params.id)又触发了一次加载
  • 是否CONVERSATION_LIST_UPDATED事件回调里又主动去getConversationList
  • 是否收到MESSAGE_RECEIVED后又主动刷新当前页
  • 是否用了 keep-alive / tab 切换回来时又重复注册监听
  • 是否没有off,导致一个页面进出几次后监听越来越多

这种问题会造成:

  • 单次进入页面实际打 2~4 次getMessageList
  • setMessageRead被多次触发
  • Android 端比 iOS 更容易把问题放大,因为 Android WebView 调度和渲染本来就更敏感

你可以在所有 IM 调用前面统一打一层日志:

functionwrapIM(chat){constrawGetMessageList=chat.getMessageList.bind(chat);chat.getMessageList=function(options){console.log('[IM_CALL] getMessageList',options,newError().stack);returnrawGetMessageList(options);};constrawSetMessageRead=chat.setMessageRead.bind(chat);chat.setMessageRead=function(options){console.log('[IM_CALL] setMessageRead',options,newError().stack);returnrawSetMessageRead(options);};returnchat;}

只要你一看日志,同一个会话进入打了几次,一眼就清楚了。

✅️问题延伸

这个问题往深一点看,其实涉及 4 个层面的系统设计:

1. IM 不等于普通接口请求
普通接口慢,通常是一次 HTTP 请求慢。
但 IM 进入会话时,背后常常叠加:

  • 长连接状态
  • 会话列表同步状态
  • 历史消息拉取
  • 已读状态同步
  • 本地缓存命中率
  • 事件派发是否完成

所以它天然比“请求用户详情接口”复杂得多。

2. “无未读快,有未读慢” 是非常典型的状态型问题
这个现象往往意味着不是页面静态性能差,而是某个状态触发了额外同步链路
在你这里,这个状态就是:未读群会话

3. Android 与 iOS 差异,在 uni-app + IM 这类场景会被明显放大
iOS 通常在 JS 运行时、WebView 调度、系统网络收敛上更稳定;
Android 端则容易受到这些因素影响:

  • ROM 对后台网络策略更激进
  • System WebView 版本碎片化
  • 某些机型省电策略会影响长连接恢复
  • 前后台切换后 WebSocket 恢复速度差异更大

腾讯官方更新日志专门修过 WebView websocket 恢复慢、uni-app App 二进制传输等问题,本身也侧面说明了这个方向确实是影响面。

4. 会话页首屏设计必须“弱依赖已读”
很多项目一开始喜欢“进入页 = 拉消息 + 设已读 + 拉群资料 + 拉成员 + 拉回执 + 拉已读成员”,最后首屏一定会抖。
真正稳的做法是:

  • 首屏只保证消息能看
  • 其他状态延后异步完成

✅️问题预测

基于你现在的描述,我对后续排查结果有几个高概率预测:

预测 1:你们当前 SDK 版本偏旧,或者至少没有吃到 3.6.2 / 3.5.8 之后的关键修复
如果这一条成立,那升级后 Android 抖动会明显收敛。

预测 2:你们当前“进入会话”逻辑里,setMessageRead阻塞了首屏,或者和getMessageList串行了
这是最常见的业务层问题。

预测 3:会话页存在重复触发
尤其是 uni-app 页面生命周期 + watch + 事件监听叠加,导致同一会话重复请求。

预测 4:冷启动登录后立刻进入未读群,会比已进入过首页一段时间后再进群更慢
因为官方文档已经明确,登录成功后 SDK 会分页拉取会话列表,同步未完成前很多依赖会话状态的数据都不稳定。

预测 5:Android 上慢的不一定只有网络请求本身,可能还包含消息渲染开销
尤其如果你们有这些逻辑:

  • 自定义消息 JSON 深解析
  • 每条消息都额外请求头像/资料
  • 每条消息都做时间格式化和复杂计算
  • 大列表没有做虚拟滚动或分段渲染

这类问题经常伪装成“getMessageList 慢”,实际上是“数据回来后页面还没画出来”。

✅️小结

我给你的最终结论是:

这不是单点接口 bug,而是“未读群进入链路”设计 + SDK 版本/架构 + Android WebView/WebSocket 稳定性共同作用的结果。

你最该做的事,按优先级排:

第一优先级

  1. 确认当前@tencentcloud/chat版本
  2. 优先升级到最新稳定版,最好评估 V4
  3. 确认 Android 端是否已吃到 uni-app App 二进制传输 / WebView ws 修复

第二优先级

  1. 首屏先getMessageList,先渲染
  2. setMessageRead延迟异步,不阻塞首屏
  3. 同一会话进入逻辑加锁,防重复调用

第三优先级

  1. 会话列表、未读总数改事件驱动
  2. 埋点拆解耗时
  3. 监听NET_STATE_CHANGE/ERROR/SDK_READY/SDK_NOT_READY

第四优先级

  1. 检查是否重复注册监听
  2. 检查是否 onShow / watch / 回调多处叠加请求
  3. 检查消息渲染是否把“接口慢”伪装出来

我先确认一个关键点,拿到后我可以继续把问题收敛到更具体:
你们现在用的@tencentcloud/chat具体版本号、uni-app 版本号、HBuilderX 版本号、Android System WebView 版本分别是多少?
再加一段你们“进入会话页”的代码(尤其是getMessageListsetMessageRead、页面生命周期、监听注册那部分),我可以继续直接按你项目结构给你改成一版更稳的实现方案。

🌹 结语 & 互动说明

希望以上分析与解决思路,能为你当前的问题提供一些有效线索或直接可用的操作路径

若你按文中步骤执行后仍未解决:

  • 不必焦虑或抱怨,这很常见——复杂问题往往由多重因素叠加引起;
  • 欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区;
  • 我会在力所能及的范围内,结合大家的反馈一起帮你继续定位 👀

💡如果你有更优或更通用的解法:

  • 非常欢迎在评论区分享你的实践经验或改进方案;
  • 你的这份补充,可能正好帮到更多正在被类似问题困扰的同学;
  • 正所谓「赠人玫瑰,手有余香」,也算是为技术社区持续注入正向循环

🧧 文末福利:技术成长加速包 🧧

文中部分问题来自本人项目实践,部分来自读者反馈与公开社区案例,也有少量经由全网社区与智能问答平台整理而来。

若你尝试后仍没完全解决问题,还请多一点理解、少一点苛责——技术问题本就复杂多变,没有任何人能给出对所有场景都 100% 套用的方案。

如果你已经找到更适合自己项目现场的做法,非常建议你沉淀成文档或教程,这不仅是对他人的帮助,更是对自己认知的再升级。

如果你还在持续查 Bug、找方案,可以顺便逛逛我专门整理的 Bug 专栏👉《全栈 Bug 调优(实战版)》👈️

这里收录的都是在真实场景中踩过的坑,希望能帮你少走弯路,节省更多宝贵时间。

✍️如果这篇文章对你有一点点帮助:

  • 欢迎给 bug菌 来个一键三连:关注 + 点赞 + 收藏
  • 你的支持,是我持续输出高质量实战内容的最大动力。

同时也欢迎关注我的硬核技术号 「猿圈奇妙屋」:

获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G+ 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料,通通免费领取
你能想到的绝大部分学习资料,我都尽量帮你准备齐全,剩下的只需要你愿意迈出那一步来拿。

🫵 Who am I?

我是 bug菌:

  • 热活于 CSDN | 稀土掘金 | InfoQ | 51CTO | 华为云开发者社区 | 阿里云开发者社区 | 腾讯云开发者社区 | 开源中国 | 博客园 | 墨天轮 等各大技术社区;
  • CSDN 博客之星 Top30、华为云多年度十佳博主&卓越贡献奖、掘金多年度人气作者 Top40;
  • CSDN、掘金、InfoQ、51CTO 等平台签约及优质作者;
  • 全网粉丝累计30w+

更多高质量技术内容及成长资料,可查看这个合集入口 👉 点击查看 👈️

硬核技术号「猿圈奇妙屋」期待你的加入,一起进阶、一起打怪升级。

- End -