perf: sprint C — отделить history от IPC state-broadcast
#9 AppState больше не содержит `history` (вынесено в PersistedState — internal store-shape). `broadcastState()` и IPC.getState шлют через IPC только exercises/settings/challenges/gamesEnabled. Раньше каждый markDone/snooze/toggle вызывал broadcastState() → весь state, включая до 10k history-записей (~500KB JSON), летел через IPC к каждому BrowserWindow и парсился в renderer'е. На долгом горизонте использования становилось заметным лагом UI. Renderer и раньше историю из state не читал (Dashboard вызывает IPC.getHistory отдельно), так что это чистый perf-win без behavioural change. Store-internal mutations продолжают работать с полным PersistedState через `getState()`; renderer-bound IPC использует новый `getStateForRenderer()`. Не сделано из спринта C: zustand setState refactor (#8) — текущая архитектура работает корректно (zustand bathes), `?? []` fallback'и в селекторах безопасны. Реальный gain был от #9, который и закрыт.
This commit is contained in:
@@ -39,11 +39,22 @@ export type Settings = {
|
||||
quietHours: QuietHours
|
||||
}
|
||||
|
||||
/**
|
||||
* State, видимое renderer'у (через IPC.getState и evtStateChanged).
|
||||
* `history` намеренно НЕ включена — она достигает 10k записей × ~50 байт =
|
||||
* 500KB JSON, и шлать её на каждый markDone/snooze/etc слишком дорого.
|
||||
* Renderer запрашивает историю отдельно через `getHistory()` IPC (с опц.
|
||||
* `sinceMs` для инкрементальной подгрузки).
|
||||
*/
|
||||
export type AppState = {
|
||||
exercises: Exercise[]
|
||||
settings: Settings
|
||||
challenges: Challenge[]
|
||||
gamesEnabled: Partial<Record<GameId, boolean>>
|
||||
}
|
||||
|
||||
/** Persisted shape — расширяет AppState историей (живёт только в main). */
|
||||
export type PersistedState = AppState & {
|
||||
history?: HistoryEntry[]
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user