# Рендеринг на сервере — Mercury LMS
> HS4 Mercury Hyperscript. `@fiberfx/hyperscript/server` рендерит компоненты в HTML-строку без выполнения эффектов; `hydrate` / `hydrateRoot` подключаются к этому HTML в браузере. `@fiberfx/render-to-string` 4.0.0 реэкспортирует тот же модуль.
## Когда читать
При рендеринге страницы или острова в HTML на сервере либо в тесте, а также при подключении компонентов к серверной разметке в браузере.
## Контракт
- `renderToString(vnode, context?): string`. Экспорт по умолчанию, `render` и `renderToStaticMarkup` — одна функция. `context` — начальный объект контекста корня из прежнего API (`getChildContext`); код с `createContext` его не передаёт.
- При рендеринге в строку обработчики `useEffect` и `useLayoutEffect` не выполняются, обработчики событий не сериализуются. `useState` даёт начальное значение; `useContext` читает провайдеров в дереве.
- `useId`: идентификаторы идут по порядку дерева (`P0-0`, `P0-1`, …), нумерация сбрасывается для каждого корня `renderToString` и совпадает после гидратации.
- Если компонент выбрасывает промис, `renderToString` выбрасывает `Error('Use "renderToStringAsync" for suspenseful rendering.')`.
- `renderToStringAsync(vnode, context?)`: всегда используйте `await`. Повторно рендерит приостановленный компонент после завершения промиса, оборачивает результат в `…` и поддерживает до 25 вложенных уровней. Предварительная версия: тестового покрытия нет.
- Браузер: `hydrate(vnode, parent)` из `@fiberfx/hyperscript` или `hydrateRoot(container, children)` из `@fiberfx/hyperscript/client`, возвращающий `{ render, unmount }`. Гидратируйте то же дерево с теми же свойствами; серверные узлы сохраняются.
- `useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)`: `getServerSnapshot` читается на сервере и при гидратации; после неё выполняется рендеринг с `getSnapshot`. Подписка оформляется в эффекте.
## Минимальный пример
```tsx
// server
import { renderToString } from "@fiberfx/hyperscript/server";
const html = renderToString(); // ""
// browser
import { hydrateRoot } from "@fiberfx/hyperscript/client";
const app = document.getElementById("app");
if (app) hydrateRoot(app, );
```
## Не выдавать
- Чтение `window`, `document` или `navigator` во время рендеринга компонента на сервере: читайте их в `useEffect` либо через `useSyncExternalStore` с `getServerSnapshot`.
- `renderToStringAsync` без `await`.
- Подпути `./jsx`, `./stream` или `./stream-node` пакета `@fiberfx/render-to-string`: они не экспортируются.
## Далее
- Контекст, порталы и memo: /ru/hyperscript/context/llms.txt
- Тестирование и наблюдение: /ru/hyperscript/testing/llms.txt
- Эта текстовая версия: /ru/hyperscript/server/llms.txt (страница в Markdown, `/hyperscript/server.md`, запланирована на W3)
## Навигация
- [Страница в браузере](/ru/hyperscript/server)
- [Индекс для агентов](/ru/llms.txt)
- [Все английские текстовые версии](/llms-full.txt)
- [Карта сайта](/sitemap.xml)
- [Текст курса](/ru/hyperscript/llms.txt)