Speculation Rules: границы prefetch и prerender
Сравните допуск, активацию, отказ, учетные данные, побочные эффекты и безопасный fixture для Speculation Rules.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
BotBrowser может повторить авторизованный контекст и записать видимый результат навигации, но не заявляет, что включает, принуждает или измеряет поддержку Speculation Rules в конкретной сборке. Практическое решение уже: применять prefetch, когда будущую навигацию можно безопасно подготовить, а prerender только если скрытый документ можно создать, активировать или отбросить без нежелательной работы. Браузер решает вопрос допуска и жизненного цикла; приложение задаёт подсказку и обычный безопасный путь.
TL;DR
prefetchготовит возможный ответ, аprerenderсоздаёт скрытый документ, который может стать видимым. Ни одна подсказка не гарантирует загрузку или отрисовку.- Допуск зависит от правила, URL, происхождения, политики, ресурсов устройства и реализации. Совпавшее правило не доказывает наличие запроса.
- Активация превращает спекулятивный документ в видимый. До неё возможен отказ, поэтому инициализация должна переносить документ, который никогда не показывается.
- Учетные данные, cookies, хранилище, аналитика, медиа, WebSocket и записи являются границами побочных эффектов. Спекулятивная цель должна быть только для чтения.
- Синтетический fixture может записать вход, намерение запроса, активацию и отказ, не утверждая, что он запускался в браузере.
Contents
- Prefetch и prerender обещают разное
- Допуск определяет браузер
- Активация и отказ образуют жизненный цикл
- Учетные данные, побочные эффекты и приватность
- Копируемый fixture и ограниченная запись
- Выбор запасного пути по наблюдаемой границе
- Граница возможностей BotBrowser
- Практический итог
Prefetch и prerender обещают разное
API Speculation Rules на MDN задаёт JSON-формат вероятных навигаций. Браузер может загрузить цель или построить скрытый документ, но страница не получает синхронного подтверждения принятия правила. Обычная ссылка поэтому не становится гарантированно быстрой.
prefetch в основном получает ресурс и хранит его во внутреннем кэше. Полученные байты не делают документ активным. Другая URL, заголовки, политика, учетные данные или состояние браузера могут помешать повторному использованию.
prerender может создать скрытый контекст, загрузить страницу и выполнить ограниченную инициализацию до возможной активации. Документация Chrome о prerender описывает активацию или удаление страницы. Это не видимая вкладка и не фоновый worker с правом выполнять необратимые действия.
| Подсказка | Что может сделать браузер | Допустимое предположение | Безопасная цель |
|---|---|---|---|
prefetch | Загрузить ресурс-кандидат | Ничего до настоящей навигации | Кэшируемый документ только для чтения |
prerender | Создать скрытый документ | Он может никогда не стать видимым | Оболочка с отложенными записями |
| Нет подсказки | Навигировать по запросу | Обычный жизненный цикл | Поток с явным намерением |
Prefetch тратит сеть и кэш, prerender дополнительно тратит CPU, память и инициализацию. Не применяйте его к покупке, письму, сокету, одноразовому токену или GET с изменением состояния. В руководстве по измерению производительности браузера описано различие между отметкой времени и навигацией: отметка в скрытом документе не доказывает посещение.
Допуск определяет браузер
Спецификация WICG Speculation Rules описывает форму правила и условия, которые проверяет пользовательский агент. href_matches, selector_matches и eagerness являются входом алгоритма, а не отчётом о причине пропуска.
<script type="speculationrules">
{
"prefetch": [
{
"where": { "href_matches": "/docs/*" },
"eagerness": "moderate"
}
],
"prerender": [
{
"where": { "selector_matches": "a[data-prerender]" },
"eagerness": "conservative"
}
]
}
</script>
Совпадение может быть отклонено политикой, нехваткой ресурсов, происхождением или частичной поддержкой синтаксиса. DNS, TLS, перенаправление или изменение состояния тоже могут отменить результат. Записывайте источник правила, класс URL, заголовки, версию, условия сети и запасной путь, а не универсальный вердикт.
В руководстве по Navigation API и истории показано, что видимая URL не доказывает посещение человеком. Руководство по безопасным контекстам добавляет предварительную проверку перед запросом мощной функции. Аналитика должна зависеть от активации, а не от одного запроса.
Активация и отказ образуют жизненный цикл
Используйте четыре состояния: объявлено, допущено, активировано и отброшено. Объявлено означает наличие JSON; допущено означает, что браузер рассматривает цель; активировано означает видимую навигацию; отброшено означает удаление, истечение или замену без активации. Допуск не подтверждает загрузку.
Активация является моментом для аналитики, постоянной персонализации, резервирования, мутаций и сторонних вставок. Отказ нормален: пользователь выбрал другую ссылку, сеть оборвалась или браузер освободил память. Таймеры и ссылки очищайте идемпотентно, не показывая ошибку для невидимого кандидата.
| Состояние | Что может хранить fixture | Опасная трактовка |
|---|---|---|
| Объявлено | Отпечаток JSON и класс URL | Браузер принял правило |
| Допущено | Диагностика, если она доступна | Запрос состоялся |
| Активировано | Видимая навигация или событие приложения | Инициализация была один раз |
| Отброшено | Удаление или истечение | Пользователь отказался |
События могут идти в другом порядке. Используйте синтетический идентификатор fixture, отдельно проверяйте скрытую и видимую фазы для worker и служебного обработчика и сохраняйте основной контент даже без переносимого события активации.
Учетные данные, побочные эффекты и приватность
Cookies, кэш, авторизация, client hints, referrer policy и служебный обработчик влияют на ответ. Точная комбинация зависит от происхождения, режима учетных данных, политики и браузера. Не помещайте в fixture реальный аккаунт или production-токен.
Разделяйте чтение и запись. Публичная оболочка лучше подходит для спекуляции, чем URL, который изменяет корзину или расходует токен; даже GET может иметь побочный эффект. Авторизация и идемпотентность остаются решениями сервера.
Скрытый документ может отправить beacon до видимости и завысить визиты. Необратимую аналитику отправляйте после видимой навигации. Руководство по предотвращению DNS-утечек показывает, почему вспомогательные запросы нужно анализировать отдельно; prefetch и prerender также должны быть частью заявленной сетевой политики.
Используйте test-user-17, order-synthetic-42 и собственный receiver. Удаляйте заголовки, полные referrer и чувствительные параметры во время сбора, ограничивайте хранение и назначайте ответственного за удаление.
Копируемый fixture и ограниченная запись
Этот fixture декларативен: он не доказывает принятие правила, загрузку или активацию.
<script type="speculationrules">
{
"prefetch": [
{
"urls": ["/fixture/read-only-shell.html"],
"eagerness": "immediate"
}
],
"prerender": [
{
"urls": ["/fixture/activation-shell.html"],
"eagerness": "conservative"
}
]
}
</script>
<a href="/fixture/read-only-shell.html" data-case="prefetch">Read-only shell</a>
<a href="/fixture/activation-shell.html" data-case="prerender">Activation shell</a>
<output id="speculation-status">not observed</output>
{
"fixture": "speculation-boundary-v1",
"candidate": "/fixture/activation-shell.html",
"hint": "prerender",
"browser": "declared product, version, channel, and OS",
"policy": "response and permissions policy revision",
"credentials": "synthetic, no account cookie",
"declared": true,
"eligible": "unknown until a run records it",
"activated": "unknown until a visible navigation records it",
"abandoned": "unknown until the lifecycle ends",
"observed": null,
"fallback": "ordinary navigation remains available",
"dataClass": "synthetic"
}
Проверьте оболочку только для чтения и цель, которая показывает лишь маркер активации. Отсутствующая URL может проверить работоспособность обычной ссылки, но не доказывает блокировку. Реальный запуск должен добавить точную версию, политику, результат и причину отказа в закрытую evidence-запись.
Выбор запасного пути по наблюдаемой границе
| Ситуация | Решение | Причина |
|---|---|---|
| Кэшируемая цель только для чтения | Предпочесть prefetch или обычную навигацию | Меньше затрат и эффектов |
| Оболочка с отложенными записями | Рассмотреть осторожный prerender | Инициализация обратима |
| Изменение состояния при загрузке | Не применять prerender | Удаление может уже выполнить действие |
| Чувствительные учетные данные до активации | Явные навигация и авторизация | Меньше раскрытия |
| Поддержка или политика неизвестны | Сохранить обычную ссылку | Подсказка не является гарантией |
Сначала сравните правило, финальный ответ, URL, происхождение, режим учетных данных, версию и политику. WICG, MDN и Chrome описывают синтаксис и пределы, но не измеряют произвольную версию.
Граница возможностей BotBrowser
BotBrowser может открыть авторизованный профиль, повторить заявленный контекст и показать результат собственного fixture. Он не может заставить браузер принять кандидата, активировать prerender, прочитать внутреннее решение о допуске или гарантировать отсутствие запроса у третьей стороны. Документация расширенных возможностей BotBrowser не объявляет реализацию Speculation Rules.
Будущий результат должен быть ограничен профилем, версией, системой, политикой и ревизией fixture. Успешная загрузка не доказывает допуск всех кандидатов. Не используйте спекуляцию для обхода авторизации, согласия, приватности или лимитов провайдера.
FAQ
Означает ли prefetch посещение?
Нет. Ответ может быть загружен без видимой навигации и затем отброшен. Посещение считайте только после активации.
Всегда ли prerender быстрее?
Нет. Он может уменьшить работу при активации, но потребляет больше памяти, CPU и инициализации и может быть удалён.
Может ли спекулятивный запрос использовать учетные данные?
На него влияют учетные данные, происхождение, политика, кэш и служебный обработчик. Используйте синтетические значения или ничего.
Когда отправлять аналитику?
После подтверждения видимой навигации, чтобы не считать отброшенный документ визитом.
Что делать при неизвестном допуске?
Оставить обычную ссылку и отметить результат как непроверенный. Обязательный контент не должен зависеть от подсказки.
Sources
- Спецификация WICG Speculation Rules
- MDN: Speculation Rules API
- Chrome: Prerender pages
- BotBrowser: Advanced features
Практический итог
Выбирайте prefetch для ответа только для чтения, который допускает раннюю загрузку; prerender только для скрытого документа, который может активироваться или быть отброшен без необратимой записи. Допуск принадлежит браузеру, активация подтверждает видимое намерение, а спекулятивный запрос остаётся кандидатом. Учетные данные, запись и аналитика требуют явной авторизации.
Безопасный следующий шаг: разместить fixture на собственном источнике, сохранить обычные ссылки и записывать объявлено, допущено, активировано и отброшено раздельно. Будущий запуск опишет одну версию; он не докажет универсальную поддержку и не превратит BotBrowser в реализацию Speculation Rules.
Эта статья входит в руководство: Поверхности веб-платформы: карта проверки
Похожие статьи
Navigation API, история и границы приватности
ПлатформаБезопасные контексты: почему мощным API браузера нужен HTTPS
ПлатформаГраницы CORS в браузере: заголовки, preflight, учетные данные и кэш
ПлатформаBack-Forward Cache: жизненный цикл, приватность и согласованность
ПлатформаDocument Picture-in-Picture: границы разрешений и окон
ПлатформаПолитика одного источника и изоляция сайтов
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.