В чем разница между React и ReactDOM?
Основы React
react — ядро: компоненты, элементы, хуки, контекст — платформонезависимый API (сам механизм согласования, react-reconciler, встроен в каждый рендерер). react-dom — рендерер: привязка этого ядра к браузерному DOM.
Что в каждом пакете
import { useState, memo } from 'react'; // ядро
import { createRoot } from 'react-dom/client'; // браузерный рендерер
import { createPortal } from 'react-dom';
createRoot(document.getElementById('root')).render(<App />);- react: createElement, компоненты, хуки (useState, useEffect...), Context, memo, lazy — всё платформонезависимое.
- react-dom: монтирование в DOM (createRoot/render), порталы, события,
react-dom/serverдля SSR (renderToString и стриминговые API).
Зачем разделили
Ядро не знает, куда рендерить, — это позволяет иметь разные рендереры при одном ядре:
- react-dom — браузер;
- react-native — нативные iOS/Android-вью;
- react-three-fiber — 3D-сцены (Three.js), ink — терминал, react-pdf — документы.
Логика компонентов и хуки везде одни и те же; меняется только «бэкенд» отрисовки.
Практические следствия
- Версии react и react-dom должны совпадать.
- Хуки импортируются из react, порталы и работа с DOM — из react-dom.
- Кроссплатформенный код (компоненты без DOM-специфики) зависит только от react — легче шарить между web и native.
Коротко для собеседования
react — платформонезависимое ядро (компоненты, хуки, контекст; reconciler встроен в рендерер), react-dom — рендерер для браузера (createRoot, порталы, SSR-API). Разделение позволяет одному ядру работать с разными рендерерами: react-native, three-fiber и т.д. Версии пакетов держат синхронными.