3.7 KiB
Модуль React внутри домена
Пояснение границы фреймворка на примере React.
Связанные правила
Имя и место модуля
Зависящий от фреймворка модуль находится непосредственно в домене и называется именем фреймворка:
domains/auth/react/
├── components/
├── hooks/
├── providers/
├── types/
└── index.ts
Имя react точно обозначает зависимость и не требует пустой промежуточной группы framework/react или bindings/react. Если домен действительно поддерживает другой фреймворк, он получает отдельный соседний модуль, например vue.
Роль модуля React
Модуль React может:
- передавать готовый
AuthApiчерез контекст и провайдер; - предоставлять хук доступа к API или состоянию;
- связывать жизненный цикл React с подпиской;
- реализовывать относящийся к домену React-компонент.
Он не меняет предметные правила, не создаёт ошибки домена, не выбирает адаптеры и не вызывает фабрику или типовую сборку. Сборка остаётся у модуля-владельца графа; модуль React получает готовый экземпляр.
type AuthProviderProps = PropsWithChildren<{
api: AuthApi
}>
export const AuthProvider = ({ api, children }: AuthProviderProps) => {
return <AuthContext.Provider value={api}>{children}</AuthContext.Provider>
}
Наблюдение за состоянием
Если AuthApi предоставляет независимый от фреймворка интерфейс getSnapshot и subscribe, модуль React может использовать useSyncExternalStore:
'use client'
export const useAuthState = () => {
const api = useAuth()
return useSyncExternalStore(
api.subscribe,
api.getSnapshot,
api.getSnapshot,
)
}
Модуль business не импортирует React и не возвращает React-хук как единственный способ наблюдать состояние. Подпиской и её очисткой управляет useSyncExternalStore.
Интерфейс домена и композиции
Компонент принадлежит react, если его ответственность ограничена контрактом домена: он работает с AuthApi, состоянием и устойчивыми ошибками домена. Он не владеет страницей, маршрутом, перенаправлением, продуктовым текстом или композицией нескольких доменов.
Экран, результат маршрута, локальный текст ошибки, перенаправление и интерфейс конкретной страницы остаются в compositions. Зависимость от React сама по себе не доказывает принадлежность домену.