perf: replace JSON.parse(JSON.stringify()) with structuredClone in Chat.svelte (#22102)

Replace 7 instances of JSON.parse(JSON.stringify()) deep cloning with the native structuredClone API. All are on cold paths (model selection, file preparation, history saving) but structuredClone is ~2x faster and more readable.
This commit is contained in:
Classic298
2026-03-01 13:37:20 -05:00
committed by GitHub
parent a0d6c209c3
commit 3569280c0b
+7 -7
View File
@@ -321,7 +321,7 @@
const onSelectedModelIdsChange = () => { const onSelectedModelIdsChange = () => {
resetInput(); resetInput();
oldSelectedModelIds = JSON.parse(JSON.stringify(selectedModelIds)); oldSelectedModelIds = structuredClone(selectedModelIds);
}; };
const resetInput = () => { const resetInput = () => {
@@ -1241,7 +1241,7 @@
selectedModels = selectedModels.length > 0 ? [selectedModels[0]] : ['']; selectedModels = selectedModels.length > 0 ? [selectedModels[0]] : [''];
} }
oldSelectedModelIds = JSON.parse(JSON.stringify(selectedModels)); oldSelectedModelIds = structuredClone(selectedModels);
history = history =
(chatContent?.history ?? undefined) !== undefined (chatContent?.history ?? undefined) !== undefined
@@ -1771,7 +1771,7 @@
if (taskIds !== null && taskIds.length > 0) { if (taskIds !== null && taskIds.length > 0) {
if ($settings?.enableMessageQueue ?? true) { if ($settings?.enableMessageQueue ?? true) {
// Queue the message // Queue the message
const _files = JSON.parse(JSON.stringify(files)); const _files = structuredClone(files);
messageQueue = [ messageQueue = [
...messageQueue, ...messageQueue,
{ {
@@ -1806,7 +1806,7 @@
prompt = ''; prompt = '';
const messages = createMessagesList(history, history.currentId); const messages = createMessagesList(history, history.currentId);
const _files = JSON.parse(JSON.stringify(files)); const _files = structuredClone(files);
chatFiles.push( chatFiles.push(
..._files.filter( ..._files.filter(
@@ -1875,7 +1875,7 @@
} }
let _chatId = JSON.parse(JSON.stringify($chatId)); let _chatId = JSON.parse(JSON.stringify($chatId));
_history = JSON.parse(JSON.stringify(_history)); _history = structuredClone(_history);
const responseMessageIds: Record<PropertyKey, string> = {}; const responseMessageIds: Record<PropertyKey, string> = {};
// If modelId is provided, use it, else use selected model // If modelId is provided, use it, else use selected model
@@ -1928,7 +1928,7 @@
await tick(); await tick();
_history = JSON.parse(JSON.stringify(history)); _history = structuredClone(history);
// Save chat after all messages have been created // Save chat after all messages have been created
await saveChatHandler(_chatId, _history); await saveChatHandler(_chatId, _history);
@@ -2039,7 +2039,7 @@
return fileExists; return fileExists;
}); });
let files = JSON.parse(JSON.stringify(chatFiles)); let files = structuredClone(chatFiles);
files.push( files.push(
...(userMessage?.files ?? []).filter( ...(userMessage?.files ?? []).filter(
(item) => (item) =>