Explica cómo useSyncExternalStore integra fuentes externas mediante subscribe y getSnapshot, manteniendo snapshots consistentes con renderizado concurrente y SSR.
Un store externo cambia fuera del ciclo normal de estado React. useSyncExternalStore ofrece una suscripción compatible con renderizado concurrente y SSR.
Entre render y effect el store puede cambiar. Durante rendering concurrente, distintas partes podrían observar snapshots incompatibles. useSyncExternalStore permite que React verifique el snapshot antes del commit.
Crea un objeto nuevo en cada lectura y puede producir loops o renders continuos. La store debe cachear su snapshot o el selector debe conservar referencias.
El snapshot servidor debe producir un primer render cliente compatible. Si no conoces el valor real, elige un default y actualiza después de hydration.
Una store puede mutar internamente por rendimiento, pero getSnapshot debe exponer una referencia nueva cuando el valor observable cambia y conservarla cuando no cambia. Para consumidores, el snapshot se trata como inmutable.
getServerSnapshot se ejecuta durante server rendering y hydration inicial. El valor debe serializarse o reconstruirse de forma consistente. Una store singleton servidor puede filtrar datos entre requests; crea una instancia por request cuando contiene información de usuario.
Si el servidor devuelve true para online y el cliente inicialmente devuelve false, React utiliza el snapshot servidor durante hydration y después actualiza. Diseña UI para evitar un mensaje engañoso crítico. Algunas fuentes pueden omitir server rendering o mostrar estado desconocido.
Si una store externa cambia durante una transition, React puede volver a leer el snapshot para asegurar consistencia. Si el valor cambió de forma incompatible, la actualización puede convertirse en bloqueante. La store debe ofrecer snapshots estables y rápidos.
Redux, Zustand y otras suelen integrar esta primitive internamente. El desarrollador de producto usa sus Hooks. useSyncExternalStore es especialmente relevante para:
Autores de stores.
Wrappers sobre browser APIs.
Integración con sistemas mutables existentes.
No reimplementes una librería madura sin necesidad.