import React from 'react'; import { type CreateModuleLoaderParams, type ModuleResourcesGetter } from '../module-loader/create-module-loader'; import { type MountableModule } from '../module-loader/module-types'; import { type BaseModuleState } from '../module-loader/types'; import { type FetchStyleContent, type StylesMode } from './server-module-loader'; export type CreateSsrMounterOptions = { /** id загружаемого модуля */ moduleId: string; /** id приложения-хоста */ hostAppId: string; /** * Фетчер ресурсов модуля (например, `createServerStateModuleFetcher`). Используется * напрямую на сервере (для получения html), а на клиенте оборачивается в * `createEmbeddedModuleFetcher`, чтобы не делать повторный сетевой запрос. */ getModuleResources: ModuleResourcesGetter; /** функция скачивания css модуля для инлайна (по умолчанию — глобальный `fetch`) */ fetchStyleContent?: FetchStyleContent; /** * Как отдавать стили SSR-модуля на сервере. * inline — дефолт без FOUC для React 18 streaming. * link — меньший HTML и browser cache, но Suspense boundary может раскрыться до загрузки CSS. */ stylesMode?: StylesMode; } & Omit, GetResourcesParams, ModuleState>, 'moduleId' | 'hostAppId' | 'getModuleResources'>; export type SsrModuleComponentProps = { /** полные параметры для `mount`/`hydrate`/`update` (могут содержать колбэки, ref-ы) */ runParams?: RunParams; /** сериализуемое подмножество параметров, с которым модуль рендерится на сервере */ ssrRunParams?: SsrRunParams; /** параметры, которые передаются в фетчер ресурсов модуля */ getResourcesParams?: GetResourcesParams; /** id инстанса — нужен, если на странице несколько инстансов одного модуля */ instanceId?: string; /** SSR + shadow DOM не поддерживается — приведёт к ошибке */ useShadowDom?: boolean; }; /** * Создаёт изоморфный компонент для серверного рендеринга модуля. * * На сервере компонент подвешивается (Suspense) на запрос ресурсов модуля с флагом `ssr`, * инлайнит стили, рендерит html модуля и встраивает payload ресурсов в разметку. На клиенте * компонент читает этот payload (без повторного сетевого запроса), гидрирует серверную * разметку через `module.hydrate` (или монтирует заново, если `hydrate` нет) и обновляет * модуль через `module.update` при изменении `runParams`. * * Клиентский лоадер строится внутри фабрики: фетчер оборачивается в `createEmbeddedModuleFetcher` * с исходным фетчером в качестве fallback, поэтому повторный запрос ресурсов не выполняется. */ export declare function createSsrMounter({ moduleId, hostAppId, getModuleResources, fetchStyleContent, stylesMode, ...loaderOptions }: CreateSsrMounterOptions): { ModuleComponent: (props: SsrModuleComponentProps) => React.JSX.Element; };