- Shipped
- 26 agosto 2026 alle ore 03:03 UTC
- Author
- kamo
- Commit
- e029a0f
I prossimi componenti client server-renders, quindi `window`, `document`, `localStorage`, `sessionStorage` e `navigator` non esistono durante il render che produce l'HTML. Leggere uno in un corpo componente getta ReferenceError sul server, e un tiro lì è una pagina vuota piuttosto che una degradata. L'hanno fatto quattro componenti. FloatingChatWindow lettura window.innerWidth/innerHeight in un useState inizialiiser e ancora nei suoi vincoli di trascinamento; ChatBox ha calcolato il suo massimizzato altezza dalla finestra. internoHeight; Lightbox e AddToContactsDialog document.corpo senza guardia. Tutti e quattro sono dietro un chiamante che li monta solo dopo un azione utente, in modo che il server non li raggiunge mai oggi — queste guardie sono ciò che tengono che un dettaglio di implementazione del chiamante piuttosto che un'assunzione di carico-portante. L'iniziale posizione di FloatingChatWindow è stata anche ricomputata su ogni render per un valore di utilizzoStato scarta dopo il primo; è pigro ora. Aggiunge script/check-ssr-safe.mjs, che cammina ogni file 'utilizza client' con il TypeScript compilatore API e report legge che si verificano durante il render. Funziona nel test npm. Ottenere l'analisi giusta ha preso tre correzioni, tutti vale la pena di registrare perché ciascuno è un modo per scrivere questo assegno in modo errato: - Trattare qualsiasi funzioneDeclaration come "deferito" lo fa segnalare ZERO. Una reazione componente è una dichiarazione di funzione, e il suo corpo viene eseguito durante il render. Solo minuscolo uno è un aiutante invocato più tardi. - `window` e `document` sono identificatori ordinari. Un attributo JSX chiamato `window=`, un oggetto chiave `documento:`, e un oggetto destrutturato `{ finestra: editing }` sono etichette, non legge — quattro componenti reali utilizzano esattamente quelli. - La guardia idiomatica non avvolge lesticamente la lettura. `if (!mounted) ritorno null` siede diverse dichiarazioni sopra `createPortal(x, document.body)`, così camminando fino l'identificatore non lo trova mai. Quattro componenti erano già al sicuro in questo modo, e un controllare che non può vedere che avrebbe avuto persone "fissare" codice corretto. Verificato contro i controlli positivi piantati in entrambe le direzioni: un componente non protetto è segnalato, uno montato-guardato non è. tsc --noEmit clean su tutti e quattro i componenti e le loro importazioni transitive; tutte le 10 guardie passano. Questo chiarisce il blocco sulla rimozione della porta di montaggio MemberListProvider, che è ciò mantiene l'intera app autenticata dal server-rendered HTML. La rimozione è un cambiamento separato e vuole ancora un passaggio di fumo percorso, perché sarebbe la prima volta questi percorsi sono mai stati server-rendered.