DocsModos de páginas de archivos
ISR (obsoleto mientras se revalida)
Definición
ISR almacena en caché el HTML de una página, por URL, y lo sirve hasta que caduque su ventana. La copia caducada todavía se entrega mientras se procesa una nueva en segundo plano: es decir, obsoleta mientras se revalida.
como funciona
revalidate = N en la portada de una página .nexy lo activa. N es una cantidad de segundos; un valor faltante, cero o negativo significa que no hay ningún caché.
La clave de caché es la ruta de solicitud únicamente - request.scope["path"]. La cadena de consulta no forma parte de ella.
| Qué | Valor |
|---|---|
| Clave | la ruta URL (/blog/hello) |
| Almacenamiento | en memoria, en el proceso que renderiza la página |
| Encuadernado | 256 entradas por proceso, menos utilizado recientemente desalojado |
| Encabezado de respuesta | cache-control: public, s-maxage=N, stale-while-revalidate=N |
Ciclo de vida de renderizado
- Llega una solicitud para una página que declara
revalidate. - Aún no hay entrada: la página se representa, se almacena y se devuelve.
- Entrada anterior a
Nsegundos: devuelta tal como está, la página no se representa. - Entrada con más de
Nsegundos: la entrada obsoleta se devuelve inmediatamente y una tarea en segundo plano genera una nueva. - Si esa representación en segundo plano aumenta, la entrada obsoleta permanece y la siguiente solicitud obsoleta se vuelve a intentar.
cuando usar
- El mismo HTML para cada visitante: una publicación de blog, una página de producto, una página de documentación.
- La página se lee con frecuencia y rara vez cambia.
- Los datos pueden tener unos segundos de antigüedad sin que nadie se dé cuenta.
Configuración
revalidate = 60<h1>Rendered at most once per minute</h1>N es un número entero simple. No hay anulación por ruta en ningún otro lugar y los controladores .py no son páginas: nunca ingresan a este caché.
Ejemplo
Una publicación de blog que lee una base de datos:
revalidate = 300slug: prop[str] = "untitled"posts = {"hello": {"title": "Hello"}, "other": {"title": "Other"}}post = posts.get(slug, {"title": "Untitled"})<h1>{{ post.title }}</h1>La primera solicitud a /blog/hello renderiza y almacena. Los siguientes 300 segundos se sirven de memoria. /blog/other es una entrada independiente, renderizada y almacenada por sí sola. En un proyecto real posts proviene de una base de datos o un servicio, llamado una vez por regeneración.
Limitaciones
Nexy garantiza que la clave de caché es la ruta, que la copia obsoleta se entrega durante la regeneración y que el almacén está limitado y es seguro para subprocesos.
Por convención, una página que declara revalidate es contenido público. Escríbalo como si todos los visitantes vieran el mismo HTML.
Tu aplicación es responsable de todo lo demás:
| Límite | Qué significa |
|---|---|
| La cadena de consulta se ignoró | /search?q=a y /search?q=b comparten una entrada. No almacene en caché una página de búsqueda. |
| Sesión no aislada | La respuesta dice public y el HTML del primer visitante se entrega a todos. Nunca leas la sesión en una página con revalidate. |
| Sin invalidación del lado del servidor | Nada elimina una entrada antes de que finalice su ventana. revalidate(...) dentro de una Acción solo le dice al navegador que recargue una ruta; no toca este caché. |
| Un caché por proceso | Varios trabajadores mantienen varios cachés, con diferentes contenidos. |
| Regeneraciones simultáneas | Nada las deduplica: diez solicitudes obsoletas pueden iniciar diez renderizaciones. |
| Los errores son silenciosos | Una regeneración fallida sigue entregando la página anterior; el error se registra, no se devuelve. |
Próximos pasos
- SSR: cómo se representa la página antes de almacenarla en caché
- Acciones: el encabezado
revalidatey lo que no hace - Rendimiento
- Páginas: diseños y segmentos dinámicos