PassFront
  1. PassFront
  2. База знаний
  3. Основы React

В чем разница между 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 и т.д. Версии пакетов держат синхронными.

Другие вопросы раздела