perf: Optimize message persistence and reduce localStorage operations

- Refactor message saving strategy from automatic to manual saving
  - Save messages only on key operations: send, complete, edit, delete, role toggle, clear
  - Prevent frequent localStorage writes during streaming responses

- Remove excessive console logging
  - Remove all console.log statements from save/load operations
  - Clean up debug logs to reduce console noise

- Optimize initial state loading with lazy initialization
  - Replace useRef with useState lazy initialization for config and messages
  - Ensure loadConfig and loadMessages are called only once on mount
  - Prevent redundant localStorage reads during re-renders

- Update hooks to support new save strategy
  - Pass saveMessages callback through component hierarchy
  - Add saveMessagesImmediately to relevant hooks (useApiRequest, useMessageActions, useMessageEdit)
  - Trigger saves at appropriate lifecycle points

This significantly improves performance by reducing localStorage I/O operations
from continuous writes during streaming to discrete saves at meaningful points.
This commit is contained in:
Apple\Apple
2025-06-02 21:21:46 +08:00
parent 3ea13caab9
commit f6fc8e9f7e
6 changed files with 85 additions and 59 deletions

View File

@@ -20,7 +20,8 @@ export const useApiRequest = (
setMessage,
setDebugData,
setActiveDebugTab,
sseSourceRef
sseSourceRef,
saveMessages
) => {
const { t } = useTranslation();
@@ -105,7 +106,7 @@ export const useApiRequest = (
const autoCollapseState = applyAutoCollapseLogic(lastMessage, true);
return [
const updatedMessages = [
...prevMessage.slice(0, -1),
{
...lastMessage,
@@ -113,8 +114,15 @@ export const useApiRequest = (
...autoCollapseState,
}
];
// 在消息完成时保存
if (status === MESSAGE_STATUS.COMPLETE || status === MESSAGE_STATUS.ERROR) {
setTimeout(() => saveMessages(), 0);
}
return updatedMessages;
});
}, [setMessage, applyAutoCollapseLogic]);
}, [setMessage, applyAutoCollapseLogic, saveMessages]);
// 非流式请求
const handleNonStreamRequest = useCallback(async (payload) => {
@@ -356,7 +364,7 @@ export const useApiRequest = (
const autoCollapseState = applyAutoCollapseLogic(lastMessage, true);
return [
const updatedMessages = [
...prevMessage.slice(0, -1),
{
...lastMessage,
@@ -366,11 +374,16 @@ export const useApiRequest = (
...autoCollapseState,
}
];
// 停止生成时也保存
setTimeout(() => saveMessages(), 0);
return updatedMessages;
}
return prevMessage;
});
}
}, [setMessage, applyAutoCollapseLogic]);
}, [setMessage, applyAutoCollapseLogic, saveMessages]);
// 发送请求
const sendRequest = useCallback((payload, isStream) => {