ДокументацияРежимы страниц файла
ISR (устаревший при повторной проверке)
Определение
ISR кэширует HTML-код одной страницы для каждого URL-адреса и обслуживает его до истечения срока действия окна. Копия с истекшим сроком действия по-прежнему обслуживается, пока в фоновом режиме отображается новая: то есть устаревшая при повторной проверке.
Как это работает
revalidate = N в заголовке страницы .nexy включает его. N - количество секунд; отсутствие, нулевое или отрицательное значение означает отсутствие кэша вообще.
Ключом кэша является только путь запроса - request.scope["path"]. Строка запроса не является его частью.
| Какая | ценность |
|---|---|
| Введите | URL-путь (/blog/hello) |
| Хранение | в памяти в процессе рендеринга страницы |
| Связано | 256 записей на процесс, последние использованные вытеснены |
| Заголовок ответа | cache-control: public, s-maxage=N, stale-while-revalidate=N |
Жизненный цикл рендеринга
- Поступает запрос на страницу, которая объявляет
revalidate. - Записей пока нет: страница отображается, сохраняется и возвращается.
- Запись моложе
Nсекунд: возвращается как есть, страница не отображается. - Запись старше
Nсекунд: запись stale возвращается немедленно, а фоновая задача отображает новую. - Если этот фоновый рендеринг активируется, устаревшая запись остается, и следующий устаревший запрос пытается повториться.
Когда использовать
- Один и тот же HTML-код для каждого посетителя: сообщение в блоге, страница продукта, страница документации.
- Страница читается часто и меняется редко.
- Данные могут быть датированы несколькими секундами, и никто этого не заметит.
Конфигурация
revalidate = 60<h1>Rendered at most once per minute</h1>N - простое целое число. В другом месте нет переопределения для каждого маршрута, а обработчики .py не являются страницами: они никогда не попадают в этот кеш.
Пример
Сообщение в блоге, которое читает базу данных:
revalidate = 300slug: prop[str] = "untitled"posts = {"hello": {"title": "Hello"}, "other": {"title": "Other"}}post = posts.get(slug, {"title": "Untitled"})<h1>{{ post.title }}</h1>Первый запрос к /blog/hello обрабатывается и сохраняется. Следующие 300 секунд обслуживаются по памяти. /blog/other - это отдельная запись, отображаемая и сохраняемая отдельно. В реальном проекте posts поступает из базы данных или службы, вызываемой один раз при регенерации.
Ограничения
Nexy гарантирует, что ключ кэша является путем, устаревшая копия обслуживается во время регенерации, а хранилище ограничено и потокобезопасно.
По соглашению страница, на которой объявлено revalidate, является общедоступным контентом. Напишите это так, как будто каждый посетитель видит один и тот же HTML-код.
Ваше приложение отвечает за всё остальное:
| Ограничение | Что это значит |
|---|---|
| Строка запроса игнорируется. | /search?q=a и /search?q=b имеют одну общую запись. Не кэшируйте страницу поиска. |
| Сеанс не изолирован | В ответе говорится public, и HTML-код первого посетителя предоставляется всем. Никогда не читайте сеанс на странице с revalidate. |
| Нет аннулирования на стороне сервера. | Ничто не удаляет запись до закрытия ее окна. revalidate(...) внутри Действие только сообщает браузеру о необходимости перезагрузить путь; он не касается этого кеша. |
| Один кэш на процесс | Несколько рабочих хранят несколько кэшей с разным содержимым. |
| Параллельные регенерации | Ничто не дедуплицирует их: десять устаревших запросов могут запустить десять рендеров. |
| Ошибки молчат | Неудачная регенерация продолжает обслуживать старую страницу; сбой регистрируется, а не возвращается. |
Следующие шаги
- SSR: как страница отображается перед кэшированием
- Действия: заголовок
revalidateи что он не делает - Производительность
- Страницы: макеты и динамические сегменты