← Назад к вопросам
Зачем нужен HTML для создания Web приложений?
1.2 Junior🔥 131 комментариев
#HTML и CSS
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Зачем React делится на пакеты React и ReactDOM
Это архитектурное решение для разделения ответственности и гибкости использования.
История: раньше было всё вместе
// React v0.11 (2014)
import React from 'react';
React.render(<App />, document.getElementById('root'));
// Всё было в одном пакете
Разделение (React v0.12+)
// React - компоненты и логика
import React, { Component, useState } from 'react';
// ReactDOM - рендерит в DOM
import ReactDOM from 'react-dom';
ReactDOM.render(<App />, document.getElementById('root'));
Зачем нужно разделение
1. Разные платформы
// Веб браузер
import ReactDOM from 'react-dom';
// Native для iOS/Android
import React from 'react-native';
// VR приложения
import React from 'react-vr';
// Игры
import React from 'react-game';
// Одна логика компонентов (React), разные рендерры
2. Архитектура
┌─────────────────────────────────┐
│ React Core │
│ - Компоненты │
│ - Hooks │
│ - State management │
│ - Virtual DOM logic │
└─────────────────────────────────┘
|
┌─────┴─────┐
| |
v v
┌─────────┐ ┌────────────┐
│ReactDOM │ │React │
│(браузер)│ │Native │
└─────────┘ │(мобиль) │
└────────────┘
3. Размер бандла
// Если тебе нужна только логика компонентов (в Node.js)
import React from 'react';
// Не нужно загружать весь ReactDOM код!
// ReactDOM содержит:
// - Управление DOM
// - Event handling
// - Браузерные API
// - Стили и CSS
// = ~65KB
Примеры использования
В браузере (веб)
// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
На сервере (Node.js SSR)
// server.js
import React from 'react';
import ReactDOMServer from 'react-dom/server';
const html = ReactDOMServer.renderToString(<App />);
res.send(html);
// Нет ReactDOM нужен на сервере!
В React Native (мобиль)
// App.js
import React from 'react';
import { View, Text } from 'react-native';
export default function App() {
return (
<View>
<Text>Hello Mobile</Text>
</View>
);
}
// Используем React, но рендерим в Native элементы
Мини игра (Canvas)
// game.js
import React, { useState, useEffect } from 'react';
function GameComponent() {
const [score, setScore] = useState(0);
// Логика компонента
useEffect(() => {
// Рисуем на Canvas (не используя ReactDOM)
}, []);
return null; // Ничего не рендерим в DOM
}
Преимущества разделения
✓ Код React логики не привязан к браузеру
✓ Можно использовать на разных платформах
✓ Меньше размер бандла для специфичных случаев
✓ Легче тестировать логику без DOM
✓ SSR работает эффективнее
✓ Возможность иметь разные рендеры
Технический стек
React (компоненты, логика)
↓
Reconciliation (сравнение деревьев)
↓
Diff algorithm (выявление изменений)
↓
Renderer (вывод на конкретную платформу)
├─ ReactDOM (браузер)
├─ React Native (мобиль)
├─ React VR (VR)
└─ Custom renderer (свой)
Создание собственного рендерера
import React from 'react';
import { createRoot } from 'react-reconciler';
// Твой кастомный рендерер
const MyRenderer = createRoot(hostConfig);
MyRenderer.render(<App />);
// Рендерит на свою платформу!
Заключение
React разделен на:
- React - логика компонентов (платформо-независимый)
- ReactDOM - рендерит в браузер
- ReactNative - рендерит на мобиль
- Др. рендеры - специфичные платформы
Это позволяет использовать одну логику компонентов на разных платформах с разными рендерерами.