- Spegnimento
- 26 agosto 2026 alle ore 01:16 UTC
- Autore
- kamo
- Impegno
- 40d24fc
Batch 2 dell'audit delle prestazioni lato cliente. Come nel lotto 1, niente un membro può vedere o fare modifiche. Il registro degli strumenti ha importato tutte le dieci finestre degli strumenti con impazienza, e ToolProviders monta il registro incondizionatamente all'interno di AuthedChrome — così ogni albero componente di finestra seduto nella shell radice di tutte le 143 rotte per le finestre il commento del dock dice inizio vuoto. Misurato con esbuild contro solo le librerie del fornitore che questo ha tirato in: reag-mark-mark-gfm + remark-math + rehype-katex + rehype-highlight (l'AI chat bubble) è 610 KB min / 182 KB gzip, css-tree + dompurify (il modello di messaggio editor) è di 226 KB / 66 KB, e Quill è di 205 KB / 60 KB — 1,016 KB minificati / 301 KB gzip del codice del fornitore da solo, con i componenti dello strumento stessi in cima. Tutto era scaricato, paralizzato ed eseguito durante l'idratazione su ogni carico di pagina. Due cose lo tengono invisibile. I campi `icon` rimangono impazienti, perché ToolWindowsContext le legge sincroniamente per ri-iniettare una finestra minimizzata hexhead e controlla lo strumentoPlatform per la veridicità prima di consentire una finestra per aprire affatto — un lazy icon si trasforma in fallimenti silenziosi, che è la classe esatta di "non ha pop su" bug questo dock ha avuto prima. E i pezzi sono scaldati piuttosto che aspettare: ToolDock precarica tutti i dieci inattivo dopo la prima vernice, quindi un clic non aspetta mai su un fetch, e ToolWindowRestore precarica esattamente gli strumenti i suoi nomi snapshot prima rigiocarlo, quindi una finestra restaurata non dipinge mai cromato intorno a un corpo vuoto. DateTimeDisplay armato un intervallo 1 Hz per istanza senza cancello, e costruito il suo 8-timezone tooltip — con un formatore per riga — nel corpo di rendering se o meno il tooltip era aperto. Su /leads che è ~60 istanze: 60 timer, 60 React commits per secondo, e qualche centinaio di millisecondi al secondo di Intl lavoro su una griglia nessuno è toccante. La zecca è ora gated su `isOpen || isHovered | format == 'relative'`, che è esattamente dove viene reso un valore live: l'intestazione della punta degli strumenti, l'etichetta mentre hovered (si scambia con un contatore di seconda risoluzione), e un relativo display che deve rinfrescarsi. Salta anche il commit mentre la scheda è nascosta, e rilegge il orologio quando il cancello si apre — senza quel catch-up il primo telaio hovered mostrerebbe un'età misurata ogni volta che la zecca è passata. Il tooltip è una funzione ora, quindi è costruito solo quando aperto. I tre formatori sono memorizzati nella cache per data fuso orario. NavHighlightContext ha portato il id e il suo setter in un unico valore, così ogni puntatore entrare e lasciare re-rendered ogni consumatore — compreso app/page.tsx, 851-line launchpad, che chiama sempre il setter e non legge mai il id. Nuotare attraverso una griglia di dodici-tili è ~24 eventi, in modo che era ~24 re-renders completi del launchpad e ogni widget live su di esso. Spalato in due contesti: il setter è stabile da useState contratto in modo che gli scrittori non re-render mai, e solo le wrapper opzione che disegnare il punto culminante ancora abbonarsi al id. Decisamente NON incluso: spostare i due fogli di stile di ag-grid da globals.css. È la più grande vincita di render-blocking nell'audit (187 KB nella <head> di ogni percorso, tra cui /validate e /logout), ma invertisce la cascata — ag-grid CSS attualmente carica BEFORE Preflight Tailwind e poi carica dopo di esso — e verificare che non costi nulla di visibile necessita di un browser su /leads, /commerce e /settings/member/[id]. A sinistra per qualcuno che può guardarlo. verificato: tsc --noEmit clean; tutti gli 8 script di guardia passano; 422 test attraverso il nav, pagina, strumenti, chat e time suite passano, e la suite completa è verde tranne uno test appartenente al lavoro in volo di un'altra sessione.