browser¶
browser позволяет пометить компонент как доступный только в браузере во время серверного рендеринга.
1 | |
Описание¶
browser(reason?)¶
Вызовите browser внутри use, чтобы пометить компонент как доступный только в браузере во время серверного рендеринга:
1 2 3 4 5 6 7 | |
Во время серверного рендеринга use(browser()) останавливает рендеринг компонента и оставляет на его месте фолбэк ближайшей границы <Suspense>. В браузере use(browser()) возвращает undefined, поэтому компонент рендерится как обычно.
Параметры¶
- опционально
reason: Строка или функция, которая объясняет, почему содержимое нужно рендерить в браузере. Строка или возвращаемое значение функции становитсяcauseобъектаError, передаваемого вonBrowserBailout. React вызывает функцию причины каждый раз, когда серверный рендерер встречает значение, возвращённоеbrowser, но не вызывает её в браузере. Если создание причины дорого, передайте функцию, например() => new Error(...).
Возвращаемое значение¶
browser возвращает непрозрачное значение, которое можно передать в use в компоненте или использовать как причину при прерывании серверного рендеринга. В браузере передача этого значения в use возвращает undefined.
Предупреждения¶
use(browser())во время серверного рендеринга должен находиться внутри границы<Suspense>. Без неё серверный рендеринг завершается ошибкой.use(browser())нужно вызывать из клиентского компонента, а не из серверного компонента.- Сам по себе вызов
browser()ничего не делает. Чтобы пометить компонент как доступный только в браузере, передайте значение, возвращённоеbrowser, вuse. Не выбрасывайте его.
Использование¶
Рендеринг содержимого только в браузере¶
Вызовите browser внутри use в компоненте, который должен рендериться только в браузере.
Это можно использовать вместо проверки typeof window, ожидания, пока Эффект установит состояние «смонтирован», или опции фреймворка, которая отключает серверный рендеринг.
Нажмите Reload, чтобы увидеть фолбэк загрузки в исходном HTML. После гидратации React показывает черновик, загруженный из localStorage.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Примечание
use(browser()) нужно вызывать из клиентского компонента. Если ваш фреймворк по умолчанию использует серверные компоненты, добавьте директиву 'use client' в этот файл или перенесите вызов в дочерний клиентский компонент:
1 2 3 4 5 6 7 8 9 10 | |
Условный рендеринг на сервере¶
Как и другие вызовы use, use(browser()) можно вызывать внутри условия или после раннего возврата. Это позволяет компоненту или пользовательскому хуку отказаться от серверного рендеринга в зависимости от условия, например от значения пропса.
Например, хук useTimeZone принимает необязательное значение по умолчанию. Если оно передано, React рендерит значение по умолчанию в исходном HTML и в браузере. Без значения по умолчанию компонент приостанавливается во время серверного рендеринга и показывает локальный часовой пояс устройства в браузере.
Нажмите Reload, чтобы увидеть фолбэк загрузки до появления часового пояса пользователя.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Похожий приём можно применить, чтобы условно избежать серверного рендеринга при использовании библиотеки получения данных с поддержкой Suspense:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
С initialData React рендерит компонент в HTML на сервере. Без него React оставляет в HTML фолбэк ближайшей границы <Suspense>. В браузере useQuery может получить данные или прочитать их из клиентского кэша, как обычно.
Отчёты о рендеринге только в браузере на сервере¶
Передайте обратный вызов onBrowserBailout серверному рендереру, чтобы сообщать о рендеринге только в браузере. Когда React оставляет фолбэк Suspense для браузера, он не вызывает обратный вызов onError серверного рендерера и обратный вызов onRecoverableError у hydrateRoot. В этом примере также передаётся причина, доступная как cause сообщаемой ошибки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
onBrowserBailout получает два аргумента:
Error, описывающий рендеринг только в браузере. Если вы передали причину вbrowser, она доступна какcauseошибки.- Объект
errorInfoсоcomponentStack, который показывает, где произошёл рендеринг только в браузере.
Функция причины может вернуть любое значение. Верните новый Error, чтобы у причины был собственный стек и при этом Error не создавался в браузере. React не сериализует причину в HTML.
Если нет границы Suspense, которая могла бы дать фолбэк, серверный рендеринг завершается ошибкой. React сообщает о сбое через обычные обратные вызовы ошибок рендерера, а не через onBrowserBailout.
Прерывание незавершённого серверного рендеринга в пользу браузера¶
Если вы вызываете API серверного рендеринга напрямую, можно перестать ждать незавершённое содержимое и позволить браузеру дорендерить его. Передайте значение, возвращённое browser, как причину при прерывании серверного рендеринга. Тогда React оставляет ожидающие границы Suspense в состоянии фолбэка и рендерит их содержимое в браузере:
1 2 3 4 5 6 7 8 9 10 11 | |
Причина прерывания browser не вызывает обратный вызов onError серверного рендерера и обратный вызов onRecoverableError у hydrateRoot. Вместо этого серверный рендерер сообщает о каждой восстановленной границе Suspense в onBrowserBailout.
Для API серверного рендеринга, которые принимают AbortSignal, передайте browser() как причину в AbortController.abort.
Источник — https://react.dev/reference/react-dom/browser