From 459eaa5428d88e6148c6f97fc52a115e2b06aecd Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 6 May 2026 08:50:13 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(im):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=B6=88=E6=81=AF=E5=AD=98=E5=82=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=87=8F=E5=B0=91=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改进消息存储时的处理逻辑,通过提前检查是否存在 _localFile 来优化性能,避免不必要的全量映射操作。 --- src/views/im/home/store/conversationStore.ts | 21 ++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/views/im/home/store/conversationStore.ts b/src/views/im/home/store/conversationStore.ts index fe2924feb..58c509074 100644 --- a/src/views/im/home/store/conversationStore.ts +++ b/src/views/im/home/store/conversationStore.ts @@ -268,14 +268,19 @@ export const useConversationStore = defineStore('imConversationStore', { ).filter((c) => !c.deleted) for (const conversation of conversationsToFlush) { // ① toRaw 拆掉 Vue reactive Proxy:IDB 的 structuredClone 不接受 Proxy,不拆会抛 DataCloneError 静默落盘失败(只 meta 写得进去,messages 永远丢) - // ② 剥掉 _localFile:IDB 能 structuredClone File 对象,但视频几百 MB 落盘没意义,刷新后媒体 SENDING / FAILED 重传也走不通 - const messagesForFlush = toRaw(conversation.messages).map((message) => { - if (message._localFile == null) { - return message - } - const { _localFile: _omitted, ...rest } = message - return rest - }) + // ② 剥 _localFile:IDB 能 structuredClone File 对象,但视频几百 MB 落盘没意义; + // fast path:先扫一眼整条链路有无 _localFile,没有就直接 toRaw —— 绝大部分会话不会同时有上传中的媒体,每次 ack 都全量 map+spread 浪费 + const rawMessages = toRaw(conversation.messages) + const hasLocalFile = rawMessages.some((message) => message._localFile != null) + const messagesForFlush = hasLocalFile + ? rawMessages.map((message) => { + if (message._localFile == null) { + return message + } + const { _localFile: _omitted, ...rest } = message + return rest + }) + : rawMessages tasks.push( imStorage.setItem( StorageKeys.conversationMessages(userId, conversation.type, conversation.targetId),