- Introduced a new configuration file `config.yaml` for specifying project context and artifact rules. - Added `.openspec.yaml` files for tracking changes related to performance improvements. - Created design documents outlining the context, goals, decisions, and migration plans for optimizing session performance. - Proposed changes include batching database queries, debouncing event refreshes, purging old events, and implementing loading states for better user experience. - Added tasks and specifications to ensure proper implementation and validation of the new features. These enhancements aim to improve the scalability and responsiveness of the application during collaborative sessions.
2.0 KiB
2.0 KiB
1. Batch resolveCollaborator (N+1 fix)
- 1.1 Lire
src/services/session-queries.tset identifier toutes les occurrences deresolveCollaboratorappelées en boucle - 1.2 Créer une fonction
batchResolveCollaborators(userIds: string[])qui fait un seulprisma.user.findMany({ where: { id: { in: userIds } } }) - 1.3 Remplacer les boucles N+1 par collect des IDs → batch query → mapping en mémoire
- 1.4 Vérifier que les pages sessions/weather/etc. chargent correctement
2. Debounce router.refresh() dans useLive
- 2.1 Lire
src/hooks/useLive.tset localiser l'appel àrouter.refresh() - 2.2 Ajouter un
useRef<ReturnType<typeof setTimeout>>pour le timer de debounce - 2.3 Wrapper l'appel
router.refresh()avecclearTimeout+setTimeoutà 300ms - 2.4 Ajouter un
clearTimeoutdans le cleanup de l'effet pour éviter les leaks mémoire
3. Purge automatique des événements SSE
- 3.1 Lire
src/services/session-share-events.tset localisercreateEventetcleanupOldEvents - 3.2 Ajouter un appel fire-and-forget à
cleanupOldEventsà la fin decreateEvent(après l'insert) - 3.3 Wrapper l'appel dans un try/catch pour logger l'erreur sans bloquer
4. Ajout des loading.tsx sur les routes principales
- 4.1 Créer
src/app/sessions/loading.tsxavec un skeleton de liste de sessions - 4.2 Créer
src/app/weather/loading.tsxavec un skeleton de tableau météo - 4.3 Créer
src/app/users/loading.tsxavec un skeleton de liste utilisateurs - 4.4 Vérifier que le skeleton s'affiche bien à la navigation (ralentir le réseau dans DevTools)
5. Lazy-load des modals avec next/dynamic
- 5.1 Identifier tous les composants qui importent
ShareModaldirectement - 5.2 Remplacer chaque import statique par
next/dynamic(() => import(...), { ssr: false }) - 5.3 Vérifier que les modals s'ouvrent correctement après lazy-load
- 5.4 Vérifier dans les DevTools Network que le chunk modal n'est pas dans le bundle initial