Una instantánea de sesión para la pestaña, ni una por instancia de gancho

Performancekamo-internal
Se descapó
26 de agosto de 2026 a las 5:40 UTC
Autor
kamo
Compromit
2241a5c

UsUserInfo celebró su sesión en tres celdas de uso. Tiene 187 sitios de llamadas y aproximadamente 27 de se montan para toda la sesión, el navegador, cada proveedor de shell, el launchpad. El TEQUEST ya estaba unida, así que sólo hubo una llamada /api/user-info, pero cuando resolvió las 27 instancias llamadas su propio setUserInfo con los mismos datos. Veintisiete actualizaciones independientes de Reactar que llevan estado idéntico, en cada enfoque de la pestaña y cada cinco minutos garra. El estado se traslada a una tienda de módulos detrás de usoSyncExternalStore, por lo que un refresco es una escritura y un pase de renderizado en lote. La tienda es app/lib/userInfoStore.ts en lugar de un módulo local de gancho por una razón específica: Nada en este repo puede atrapar un retroceso de derechos. No hay una "prueba-biblioteca", no hay prueba monta un componente, y la aplicación/ganchos/** no está en la lista de inclusión de vitest. gancho pasaría nunca en ejecución. app/lib/** está incluido, por lo que las reglas que los derechos de puerta a través el producto ahora tiene 25 pruebas que cubren cada ruta de escritura. Tres propiedades son carga y cada una está sujetada por una prueba: La carga comienza TRUE y es un pegado de ida. Los guardias de derechos caen en un DENY, no a a esperar, y comprobar que se abre con la devolución falsa de la página web de la tienda, por lo que una tienda que reporta carga:falsa antes de que lleguen los datos no deja "ningún permiso" a un miembro que tiene la derecha, y desactiva el vigésimo "useEffect(..., [cargar]) - redirecciona que leen los derechos en el primero render no cargar. Nada se estrella y no falla ninguna prueba. Igualmente nunca debe volver a ser verdad, o cada guardia de la aplicación destella su estado de carga cada cinco minutos. Los escritos son solo navegador por construcción. En el servidor un proceso sirve a cada concurrente solicitud, por lo que una variable de módulo que sostiene los derechos de un miembro es una compartida con todos los demás el render de miembro. publish() se niega a escribir sin una ventana y getServerSnapshot devuelve un constante congelada en lugar de leer la instantánea mutable. Esa constante también es obligatoria: shell autenticado es echado por el servidor y este gancho se alcanza durante el pase del servidor desde el El árbol cliente de roote, donde React 19 lanza en lugar de caer de nuevo, sin límite Por encima de AuthedChrome para atraparlo. La instantánea se mantiene, nunca se reconstruye. loadUserInfoShared devuelve un objeto recién analizado cada tiempo, que es precisamente por lo que las 27 instancias se volvieron a presentar; una instantánea que construyó uno No sólo volver a volver a hacer retroceder sino tirar. Las cargas útiles equivalentes ya no se publican en absoluto, por lo que los consumidores memos de teclado fuera de la identidad userInfo . ConfiguraciónAppPinsLa puerta de nav de contexto sobre todo. Reputar cada cinco minutos por una carga útil que no cambió. Tres decisiones que vale la pena nombrar, porque cada una tenía una alternativa defendible: La navegación /logout está ahora cerrada en la que hay un suscriptor. El viejo es la guardia MountedRef se sentó por encima del interruptor, no en un setState, por lo que se saltó la redirección también - una instancia que desmontó Mid-flight no navegó. Suprimiendo el árbitro de plano, que es el movimiento habitual al adoptar un la tienda de módulos, habría promovido silenciosamente esa redirigible de lo condicionado a incondicional. Sólo la primera carga es en primer plano; luego se monta refrescar en el fondo. Los derechos se mantienen como frescos en la navegación como antes, pero un error transitorio en una montura tardía ya no puede ser de usuario en blanco para todos los 27 consumidores cuando antes sólo dejaba en blanco la única instancia que lo golpeó. Las siete llamadas de carga externaUserInfoCompartir deliberadamente no publican. Se disparan websocket reconectarse en momentos arbitrarios, y conducir el gating del producto desde una superficie desencadenante Nadie está mirando es peor que la estariedad limitada de no hacerlo. identidad que no puede cambiar dentro de una sesión. Los accesores se dejan como flechas a propósito. Estabilizarlos es el instinto natural aquí y rompería silenciosamente nueve sitios de llamadas. useHrOverview, useSubscriptionPermissions, PlataformaDerechistasContexto y otras seis que dependen de la identidad inestable de hoy para mantenerse fresco, Computación una vez contra una instantánea nula en su lugar. La entrada /logout de la lista de permisos en check-client-navigation.mjs sigue la línea para la que existe. Verificado: limpia, los 10 guardias pasen, 3286 pruebas verdes, compilaciones de construcción de la producción, y Servidor independiente todavía hace que la shell autenticada de 200, 16.238 bytes de DOM a través de 153 elementos, dos cabeceras, diez botones, Mis empresas / Mi perfil / Cerrar sesión. Quiere un humano para clic a través de la navegación basada en los derechos, un miembro de derechos limitados y una sesión que expira ante él barcos.

Todos los cambios

Como lo que ves enviaste?

Cada una de estas actualizaciones aterriza en su espacio de trabajo automáticamente. Empieza gratis y verlo crecer semana tras semana.

Arranzar gratis para siempreVer Precios