Руслан Куянец | Reactify
5.87K subscribers
696 photos
52 videos
39 files
276 links
Я IT-специалист, ментор и основатель проекта YeaHub и сообщества Reactify. Здесь рассказываю про Frontend и IT.

Менторство:
https://reactify.ru

YouTube канал:
https://youtube.com/@reactify-it

YeaHub:
https://yeahub.ru/

Связь:
@ruslan_kuyanets
Download Telegram
👩‍💻 Подключение компонента с помощью connect

Хотя хуки являются современным способом работы с Redux, вы также можете использовать метод connect из библиотеки react-redux для подключения компонентов к Redux. Это более старый способ, но он по-прежнему широко используется и имеет свои преимущества.


// Компонент
const TodoList = ({ todos, addTodo, removeTodo }) => {
// some logic
return ();
};

// Определяем, какие данные из Redux store передать компоненту
const mapStateToProps = (state) => ({
todos: state.todos.todos,
});

// Определяем, какие действия передать компоненту
const mapDispatchToProps = {
addTodo,
removeTodo,
};

// Подключаем компонент к Redux
export default connect(mapStateToProps, mapDispatchToProps)(TodoList);


Делаю сейчас курс по Redux + Redux Toolkit + RTK Query и вспомнил, как раньше подключались компоненты. Блин, выглядит круто. Может снова так делать.😅


Кто помнит? Олды есть?

#redux #react
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥5🤝1
👩‍💻 Принципы Redux

Redux основывается на нескольких ключевых принципах, которые помогают организовать и управлять состоянием приложения.

🔒 Единое хранилище (Single Source of Truth)

В Redux есть только одно общее хранилище, которое содержит все состояние приложения. Это облегчает управление состоянием и делает его предсказуемым.

Поскольку всё состояние хранится в одном месте, легче отследить изменения и управлять ими. Это позволяет избежать проблем с синхронизацией, которые могут возникнуть, если состояние хранится в разных местах.


const initialState = {
todos: [],
user: null,
};

// Всё состояние хранится в одном объекте
const state = {
todos: ['Задача 1', 'Задача 2'],
user: { name: 'Иван', age: 30 },
};


👀 Состояние только для чтения (Read-Only State)

Единственным способом изменения состояния является отправка действия (action). Это гарантирует, что изменения состояния происходят только через определенные точки (actions), что делает их предсказуемыми.

Когда состояние приложения меняется, это происходит только через отправку действий. Это делает все изменения явными и отслеживаемыми.


// Действие для добавления задачи
const addTodo = (text) => ({
type: 'ADD_TODO',
payload: text,
});

// Изменение состояния только через действие
store.dispatch(addTodo('Новая задача'));


Чистые функции редюсеры (Pure Functions)

Редюсеры должны быть чистыми функциями. Это значит, что для одинаковых входных данных они всегда должны возвращать одинаковый результат, и они не должны изменять свои входные данные.

Чистые функции делают состояние предсказуемым и упрощают отладку. Они не имеют побочных эффектов и не влияют на внешние состояния.


const todoReducer = (state = initialState, action) => {
switch (action.type) {
case 'ADD_TODO':
return {
...state,
todos: [...state.todos, action.payload],
};
default:
return state; // Возвращаем новое состояние, не изменяя текущее
}
};


⬇️ Однонаправленный поток данных (Unidirectional Data Flow)

Поток данных в Redux всегда односторонний. Это означает, что данные передаются от состояния к представлению, и изменения состояния происходят только через действия.

Однонаправленный поток данных упрощает понимание, как данные перемещаются в приложении. Он делает отладку проще, поскольку вы всегда знаете, откуда приходят данные и как они изменяются.


// Пример потока данных
const mapStateToProps = (state) => ({
todos: state.todos,
});

// Компонент получает данные
const TodoList = ({ todos }) => (
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
);

// Связываем компонент с Redux
export default connect(mapStateToProps)(TodoList);


#redux #frontend #react #flux
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥65😁1💯1
🔼 Почему важно использовать lazy-loading

Lazy-loading (ленивая загрузка) — это способ загружать ресурсы (изображения, компоненты) только тогда, когда они нужны. Это улучшает скорость загрузки страницы, снижает нагрузку на сервер и экономит трафик.

⚠️ Проблема

При загрузке страницы браузер загружает все ресурсы сразу, даже те, которые пользователь не видит. Это увеличивает время загрузки и может ухудшить пользовательский опыт.

✔️ Решение

Lazy-loading изображений
Современный HTML позволяет указать атрибут loading="lazy":

<img src="example.jpg" alt="Описание" loading="lazy" />

Это простой и поддерживаемый способ ленивой загрузки.

Lazy-loading компонентов в React
В React можно использовать React.lazy и Suspense:

import React, { Suspense } from 'react';

const HeavyComponent = React.lazy(() => import('./HeavyComponent'));

function App() {
return (
<div>
<h1>Главная страница</h1>
<Suspense fallback={<div>Загрузка...</div>}>
<HeavyComponent />
</Suspense>
</div>
);
}

Компонент HeavyComponent загрузится только тогда, когда он понадобится.

💎 Преимущества
- Ускоряет загрузку страницы.
- Снижает объем передаваемых данных.
- Улучшает производительность и SEO.

Используйте lazy-loading, чтобы сделать ваши проекты быстрее и удобнее для пользователей.

#lazy #react #optimization
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥62💯1
👩‍💻 5 продвинутых паттернов в React

Каждый разработчик хочет писать универсальный, чистый код, который не будет повторяться, будет оптимизированным и легкомасштабируемым. В этом видео мы разберем 5 продвинутых паттернов и подходов в React

- Slot Pattern (Component Injection)
- Render Prop
- Proxy Component
- Function as a Child
- Compound Components

Видео уже на канале!
Я не оставляю ссылку, так как видео лучше продвигается, если заходить на него напрямую с YouTube. Это помогает улучшить его рейтинг и увеличить шансы на органическое продвижение.

#frontend #react #patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥35👍6🤝3
👩‍💻 Принципы SOLID в React

Принципы SOLID помогают строить приложения, которые проще развивать и поддерживать в долгосрочной перспективе. Они помогают выстроить архитектуру с учетом будущих расширений и изменений. Изучив эти принципы, вы научитесь думать на шаг вперед, проектируя гибкие и масштабируемые системы.

- Single Responsibility Principle (Принцип единственной ответственности)
- Open/Closed Principle (Принцип открытости/закрытости)
- Liskov Substitution Principle (Принцип Барбары Лисков)
- Interface Segregation Principle (Принцип разделения интерфейса)
- Dependency Inversion Principle (Принцип инверсии зависимостей)

Видео уже на канале!
Я не оставляю ссылку, так как видео лучше продвигается, если заходить на него напрямую с YouTube. Это помогает улучшить его рейтинг и увеличить шансы на органическое продвижение.

🔗 Репозиторий

#react #solid #frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥62🤝2
👩‍💻 Принципы ООП в React.

В этом видео разберем основные принципы ООП — инкапсуляцию, наследование, полиморфизм и абстракцию — и покажем, как они работают в React. Узнаем, что такое Render Props, Component Injection, композиция и декомпозиция, и применим их в функциональных компонентах, Custom Hooks и HOCs.

Видео уже на канале!
Я не оставляю ссылку, так как видео лучше продвигается, если заходить на него напрямую с YouTube. Это помогает улучшить его рейтинг и увеличить шансы на органическое продвижение.

🔗 Репозиторий

#frontend #react #ооп
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥21
👩‍💻 Продвинутый React

Выпущено три видео по паттернам и принципам программирования:

📹 5 продвинутых паттернов в React – изучаем ключевые подходы и паттерны в разработке React-приложений: Render Props, Slot Pattern (Component Injection), Proxy Component, Function as a Child, Compound Components.

📹 Принципы SOLID в React – учимся создавать переиспользуемые компоненты, используя SOLID-принципы. Разбираем, как правильно декомпозировать код и проектировать архитектуру с учетом лучших практик.

📹 Принципы ООП в React – закрепляем понимание объектно-ориентированного программирования, разбираем, откуда берутся паттерны и подходы, и как они помогают в разработке.

💡 Для чего это нужно?

Формирование архитектурного мышления важно уже на этапе обучения. Понимание принципов и подходов к разработке помогает писать более чистый, масштабируемый код. Чем раньше вы начнете разбираться в паттернах, тем быстрее сможете применять их в своих проектах и развивать свои навыки.

Сначала может быть сложно увидеть, где и как использовать тот или иной паттерн, но с опытом вы научитесь понимать, когда он действительно необходим, а когда избыточен.

#frontend #react #solid #oop
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥6🤝41
👩‍💻 Проектирование таблицы в React: SOLID, IoC и Render Props

В админке типового приложения таблицы встречаются на каждом шагу: пользователи, товары, заказы, подписки. Дизайн у них обычно единообразный — различаются только данные, заголовки и возможные действия в ячейках.

Проблема:
Если делать отдельный компонент под каждую сущность (UsersTable, ProductsTable), получим дублирование кода. Если запихать всю логику в один компонент — он превратится в монстра с кучей if-else.

Решение:
Делаем единную таблицу, но гибкую. Вместо хардкода данных и столбцов, выносим рендеринг наружу.

Какие техники применяем?
✔️ Render Props – Передаём renderRow и renderHeader как пропсы. Внутри Table только разметка, логика рендеринга — снаружи.

✔️ Принцип открытости/закрытости – Если для товаров нужна иконка валюты, а для пользователей — аватарка, не лезем внутрь Table, а просто рисуем нужное в переданной функции.

✔️ Dependency Injection – Зависимости (рендер-функции) приходят через пропсы. Можно подставить любую логику без изменений самого компонента.

✔️ Инверсия управления (IoC) – Table не знает, что в нём будет. Управление содержимым — у родителя.

✔️ Паттерн "Стратегия" – renderRow и renderHeader — это стратегии отображения. Подменяем их под задачу.

Итог:
Одна таблица на все случаи, без дублирования, с возможностью кастомизации под любую сущность.

Если тема интересна, сделаю серию постов про другие типовые компоненты: модалки, фильтры, карточки. Как вам идея?


#react #solid #patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37🔥127
👩‍💻 Разработка UI Kit: создание компонента Button

UI Kit представляет собой систематизированную коллекцию интерфейсных компонентов, которая служит фундаментом для разработки приложений. В современных проектах наличие продуманного UI Kit перешло из категории рекомендаций в обязательное требование по нескольким ключевым причинам.

1️⃣ Во-первых, UI Kit обеспечивает визуальную и функциональную согласованность интерфейса. Когда десятки или сотни экранов используют одни и те же компоненты
2️⃣ Во-вторых, разработка ускоряется в разы — вместо создания элементов с нуля, команда использует готовые решения.
3️⃣ В-третьих, значительно упрощается поддержка и масштабирование: изменения в дизайн-системе вносятся в одном месте, а применяются во всём проекте.

[Картинка 1: Пример Storybook]

UI Kit — это не просто коллекция кнопок и полей ввода. Это комплексная система, включающая:
- Базовые компоненты интерфейса (кнопки, формы, переключатели)
- Типографику и иерархию текста
- Цветовую палитру с семантическим значением цветов
- Систему отступов и размеров
- Состояния элементов (активное, неактивное, hover, focus)

[Картинка 2 и 3: Дизайн в Figma]

🛡 Основные принципы разработки компонентов UI Kit
При создании компонентов для UI Kit необходимо придерживаться нескольких фундаментальных принципов

1. Семантическая корректность
Каждый компонент должен максимально точно отражать свою суть на уровне HTML-разметки. Кнопка — это <button> или <input type="button">, ссылка — <a>, поле ввода — <input> или <textarea>. Это важно не только для доступности (accessibility), но и для правильной работы в различных контекстах (например, в формах или при навигации).

2. Полнота свойств
Компонент должен поддерживать все стандартные HTML-атрибуты соответствующего элемента. Для кнопки это включает type (button, submit, reset), disabled, autofocus и другие.

3. Управляемость извне
Компонент не должен содержать внутреннюю логику состояния (где это возможно). Все состояния (активное, неактивное, загружающееся) должны управляться через пропсы. Это делает компонент предсказуемым и легко интегрируемым в любую архитектуру.

4. Принцип открытости/закрытости
Компонент должен быть закрыт для модификаций (его базовое поведение нельзя изменить), но открыт для расширения. На практике это означает:
- Возможность добавления классов через className
- Возможность передачи произвольных атрибутов
- Гибкость в контенте через children

5. Единый источник правды
Изменение компонента в UI Kit должно автоматически отражаться во всех местах его использования. Это требует тщательного проектирования API компонента на этапе создания, чтобы избежать необходимости "ветвления" логики в будущем.

🔒 Архитектура UI Kit в проекте
Оптимальная структура для UI Kit в проекте выглядит следующим образом:

src/
ui/
Button/
Button.tsx # React-компонент
Button.stories.tsx # Документация в Storybook
Button.test.tsx # Тесты компонента
Button.module.css # Стили компонента
Input/ # Аналогичная структура для других компонентов
...
styles/
variables.css # CSS-переменные (цвета, отступы, шрифты)
typography.css # Типографика
animations.css # Анимации
global.css # Глобальные стили


🖥 Реализация компонента Button для UI Kit
Перед разработкой тщательно изучаем макеты и выделяем все варианты кнопок: Варианты по стилю, Размеры, Состояния, Дополнительные требования (иконки, текст).

[Картинка 4: Компонент Button]

При стилизации используем CSS-переменные из дизайн-системы, Для каждого варианта прописываем цвета для всех состояний.

[Картинка 5: CSS-переменные]

Создаем подробные TypeScript-интерфейсы: Объединение с нативными атрибутами button и a, Поддержка всех стандартных HTML-атрибутов, Четкое разделение кастомных и стандартных пропсов

[Картинка 6: Типизация кнопки]

Далее создаем сторисы для всех вариантов: Основной вид, Все состояния, Примеры с иконками, Вариант как ссылки

#ui #storybook #button #react
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍124🤝2
🤯 Подборка сложных вопросов с собеседований

1. Какая разница в tree-shaking у CJS и ESM?
ESM (ECMAScript Modules):
- Статический анализ на этапе сборки → можно точно определить неиспользуемый код.
- Импорты (import/export) фиксированы, что позволяет оптимизировать бандл.

CJS (CommonJS):
- Динамические require() → сборщик не может заранее знать, какие части модуля будут использоваться.
- Загружает модуль целиком, что мешает tree-shaking.

2. Какую часть спецификации ES нельзя реализовать через полифиллы и транспиляцию?
Proxy – требует нативной поддержки браузера, так как работает на низком уровне (перехват операций с объектами). Vue 2 для старых браузеров использовал Object.defineProperty вместо Proxy.

3. Для чего используется <picture>, кроме выбора формата изображения?
Адаптивные изображения:
- Разные версии картинки под разные размеры экрана (media-атрибуты).
- Оптимизация под ретину (srcset).
- Fallback для старых браузеров (<img> внутри).
- Разгрузка мобильных сетей (легкие версии).

4. Зачем нужен тег <base>?
Задает базовый URL для всех относительных ссылок на странице.

<base href="https://example.com/assets/">
<img src="logo.png"> <!-- Загрузится https://example.com/assets/logo.png -->


5. Как в runtime проверить поддержку CSS-свойства?
if (CSS.supports('display', 'grid')) {  
console.log('Grid поддерживается!');
}

Альтернатива: @supports в CSS.

6. Как называется реактивность в React?
Не настоящая реактивность (как в Svelte/Solid/Vue). React использует "pull-based" модель (перерисовка по изменению состояния). Гранулярная реактивность (сигналы, Proxy) – когда обновляются только зависимые части.

7. Как определить системную тему (dark/light)?
В JS:

const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;

// Следить за изменением темы
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
console.log(e.matches ? 'Тёмная тема' : 'Светлая тема');
});

В CSS:

@media (prefers-color-scheme: dark) {
body { background: #000; color: #fff; }
}


8. Что такое CSS Container Query?
Аналог @media, но зависящий от размера контейнера, а не viewport. Позволяет адаптировать стили для компонентов (например, карточка меняет layout в узком контейнере).

.container { container-type: inline-size; }

@container (max-width: 500px) {
.card { flex-direction: column; }
}


9. Что будет с padding: 1,5px?
Непредсказуемо! Это синтаксическая ошибка (запятая вместо точки), но браузер попытается "починить". Может интерпретироваться как 1px, 15px или проигнорироваться.

Вывод: так писать нельзя, только padding: 1.5px.

10. Как из массива [1, 2, 3] получить тип 1 | 2 | 3?
const arr = [1, 2, 3] as const;  // Делаем кортеж  
type T = typeof arr[number]; // 1 | 2 | 3

Без as const тип будет number[].

11. Разница между import { ReactNode } и import { type ReactNode }?
Обычный импорт:

import { ReactNode } from 'react'; // Может попасть в бандл.

Импорт типа (TypeScript 4.5+):

import { type ReactNode } from 'react'; // Удаляется при компиляции.

Полезно для оптимизации бандла (импорты только для типов не включаются в JS-код).

#собеседования #react #javascript #typescript
👍20🔥52
👨‍💻 План развития Frontend Разработчика (Часть 3)

Ты уже освоил базу: HTML, CSS, JavaScript. Но в реальности никто не пишет проекты на чистом коде — это долго, сложно и неэффективно. Если ты написал что-то на чистом JS без фреймворков, то, грубо говоря, ты создал свой фреймворк. Другим разработчикам будет тяжело разобраться в твоём коде, а поддержка такого проекта превратится в ад.

Решение? Готовые фреймворки и библиотеки. Они дают структуру, правила и экосистему, упрощают разработку и делают код предсказуемым.

Среди популярных вариантов — Vue, Angular, Svelte, Solid, но мы остановимся на React. Почему? Потому что он мощный, гибкий и востребованный на рынке. Давай разберёмся, как его правильно учить.

👩‍💻 React + Router (< 2 месяцев)

React — это основной инструмент, с которым ты будешь работать. Если ты можешь сделать ToDo App, то это уже похоже на коммерческий код. Чем рабочий код отличается от пет-проектов? Объёмом, структурой, абстракциями, обёртками, разделением на модули.

Когда ты делаешь простое приложение (например, Кинотеатр), ты уже сталкиваешься с реальными кейсами:
- Работа с API
- Отрисовка данных
- Поиск и фильтрация
- Роутинг
- Управление состоянием

Сложность не в написании какого-то "особенного" кода, а в масштабе. Нужно учиться ориентироваться в больших проектах, понимать чужой код и писать поддерживаемый свой.

Для изучения React я предлагаю максимально подготовить свой мозг и пройти 2 курса по React, повторяя за автором и делая конспект:

React - Курс по React для Начинающих
https://www.youtube.com/watch?v=is3T0W0ouT0

→ Курс React с нуля
https://youtu.be/am_UiIvha5M?si=7io3qRZITckfH2zA

Далее проходим более подробный курс с дотошным объяснением базы от Димыча:

→ Todolist React JS
https://www.youtube.com/watch?v=pzs3a-d3kjM

После этого приступаем к практике и делаем приложение новостей с основными фичами фронтенда: Поиск, Фильтрация, Пагинация, Слайдер и т.д. Тут также произойдёт первое знакомство с TypeScript, Redux, Router, FSD:

React Новости
https://youtu.be/bD0UXb7kD_k?si=e5Y5Jkiwt_66U5Ug

Далее углубляем свои знания и смотрим, как создают большое приложение Pizza:

React Pizza v2
https://youtu.be/_UywBskWJ7Q?si=WN2kX8Eck9BW_OD3

Ещё больше практики, чтобы уже тошнило, а мозг окончательно привык к React:

→ Разработай 6 проектов на ReactJS
https://youtu.be/eS0GL73tkmw?si=2G36Y4n-bYI4hnT1

Изучаем базу роутинга и применяем сразу на практике

React Router 6
https://youtu.be/0auS9DNTmzE?si=GGuidPN1NpfvVAiw

🖥 TypeScript (≤10 дней)

На самом деле ТС очень сложный. Даже опытные разработчики не умеют решать сложные задачи. Проходим 2 курса в YouTube:

→ Полный курс TypeScript
https://www.youtube.com/watch?v=V7hBejCH1HI

→ TypeScript ФУНДАМЕНТАЛЬНЫЙ КУРС
https://youtu.be/LWtHl__oEWc?si=E3MJHqHHMM68NblJ

Если за 10 дней не освоили базис — всё равно идём дальше. Остальное натренируется в проектах. Сложные темы: дженерики, утилити-типы, защитники типов, маппинг — вы не поймёте их, пока не начнёте практиковаться в полном стеке. Нам нужна база, которая покрывает 80% рабочей нагрузки.

👩‍💻 Redux + RTK (3-4 недели)

Тут так же как и в TypeScript. Redux имеет кучу инструментов. Но для того чтобы нам понять его - нужна практика. У многи новичков проблема с ним. Что нам нужно уметь: создавать слайсы, использовать данные в компонентах, использовать диспатч, делать запросы на сервер с санками или rtk query. Это база, которая уже позволит вам делать приложение. остальное изучаем уже на практике всего стека.

→ Полный курс Redux
https://www.youtube.com/watch?v=gPmYTqGPDWA

→ Redux Toolkit для управления
https://www.youtube.com/watch?v=C0fBnil_Im4

То же самое и с Redux. Хотя в нём много инструментов, главное — начать практиковаться. У многих новичков возникают сложности. Базовые навыки, которые нужно освоить: Создание слайсов, Использование данных в компонентах, Работа с диспатчем, Запросы к серверу (санки или RTK Query)

Этого достаточно для создания рабочих приложений. Остальное освоится в процессе работы с полным стеком.

#redux #roadmap #frontend #react #typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥108
👨‍💻 План развития Frontend Разработчика (Часть 4)

Когда мы изучили полный стек: React, Router, Redux, TypeScript - начинаем очень много практиковаться. Набивать руку и развивать мышление.

Можно смотреть, как делают большие приложения (рекомендуется смотреть в Яндекс.Браузере с переводом):

https://youtu.be/0mdjgQdQF1k
https://youtu.be/fq7k_gVV5x8
https://youtu.be/xZ1ba-RLrjo
https://youtu.be/-7K_0NRLCu4
https://youtu.be/JKuofETX0GM

Мы запоминаем, чем руководствуется автор, как он разбивает на части приложение, какие компоненты делает. Чем больше мы практикуемся, тем лучше. Но самое главное как можно быстрее начать делать проекты самостоятельно.

Как выбрать проект:
- Не берите готовые идеи из YouTube
- Не копипастите код без понимания
- Делайте всё самостоятельно

Примеры идей:
- Приложение магазин с товарами
- Аналитика футбола с API футболистов
- Приложение с картой для просмотра самолётов

Где брать ресурсы:
- Публичные API (найдите в браузере: "публичное API самолётов/футболистов" и т.д.)
- Бесплатные дизайны в Figma (или создайте простой прототип)

Главное, чтобы вам было интересно и был азарт!

Это репозиторий YeaHub. Здесь используется куча инструментов, много страниц — всё грамотно настроено. Мои ученики тут проходят финальную практику перед выходом на рынок. Это даёт мощный буст: их обучение чётко делится на "до" и "после".

Репа специально открыта — любой новичок может заглянуть в большой продакшн-проект. Когда я сам учился, мне очень не хватало такого примера.

https://github.com/YeaHubTeam/yeahub-platform

После того, как вы уже можете разрабатывать приложения в полном стеке, можно углублять знания

Архитектура Frontend с Нуля до Продакшена. Docker, Webpack, CI/CD, React, Deploy
https://www.youtube.com/watch?v=GJe0-oPbiqw

Деплой Frontend приложения.
https://youtu.be/8OHe6chCWTE?si=JQpY1Bki7Cj6GiZC

→ Feature-Sliced Design
https://www.youtube.com/watch?v=O4SDx-aZY5U

Формирование архитектурного мышления важно уже на этапе обучения. Понимание принципов и подходов к разработке помогает писать более чистый, масштабируемый код. Чем раньше вы начнете разбираться в паттернах, тем быстрее сможете применять их в своих проектах и развивать свои навыки.

📹 5 продвинутых паттернов в React – изучаем ключевые подходы

📹 Принципы SOLID в React – учимся создавать переиспользуемые компоненты, используя SOLID-принципы

📹 Принципы ООП в React – закрепляем понимание объектно-ориентированного программирования

С самого начала параллельно с изучением технологий готовься к собеседованиям. Каждый раз после освоения новой темы закрепляй теорию — проходи вопросы в тренажере 🚀 YeaHub.

#курс #frontend #react
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥7🤝31
👩‍💻 React Fiber

React Fiber — это новый алгоритм согласования (reconciliation), представленный в React 16. Он заменил старый механизм обновления Virtual DOM

🗓 Что было до Fiber?

До React 16 использовался стековый алгоритм рендеринга. Его ограничения:

Синхронный рендеринг – React выполнял обновление за один проход, блокируя основной поток. Если дерево компонентов было большим, это вызывало лаги.

Невозможность приоритизации – Все обновления обрабатывались в порядке очереди, даже если некоторые (например, анимации или пользовательский ввод) требовали более быстрой реакции.

Отсутствие прерываний – Процесс нельзя было разбить на части или отложить, что усложняло реализацию плавного интерфейса.


🔼 Почему Fiber — это улучшение?

Fiber решает эти проблемы, вводя:

Инкрементальный рендеринг – Работа разбивается на небольшие части, которые выполняются в несколько кадров, избегая блокировки потока.

Приоритезацию задач – Критичные обновления (например, клики) обрабатываются раньше фоновых (рендер тяжёлых списков).

Возможность паузы и возобновления –
React может прервать рендеринг для выполнения более важной задачи, а затем продолжить.

Поддержку рендеринга вне основного потока – Это основа для Concurrent
React, позволяющего выполнять вычисления параллельно.

Fiber не изменил принцип работы Virtual DOM, но сделал его обновление более умным и адаптивным.

#react #fiber
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥218👍7🫡1
🔧 Как оптимизировать фронтенд?

Во-первых, знание способов оптимизации фронтенд-приложений полезно абсолютно всем разработчикам: это помогает писать более качественный, эффективный и поддерживаемый код.

Во-вторых, тема оптимизаций регулярно всплывает на собеседованиях. Когда вас спрашивают, важно не просто перечислить техники, а уметь рассуждать, приводить примеры и объяснять, почему именно этот подход работает. Нужно чувствовать себя в этом вопросе как рыба в воде.

Чтобы в этом разобраться, мы будем делить оптимизации на разные категории. Это позволит системно подойти к теме, а не сваливать все приёмы в одну кучу:

📌 1. По направлению оптимизации (Что именно оптимизируем?)

Загрузка (быстрее доставить код и ассеты пользователю)
Выполнение (ускорить работу JS, рендера, анимаций)
Рендеринг (уменьшить количество перерисовок, оптимизировать DOM и Virtual DOM)
Сеть (сократить количество запросов, уменьшить вес ресурсов)
Память (контролировать утечки и тяжелые структуры данных)
Пользовательский опыт (UX perf) (перфоманс как часть удобства: LCP, FID, CLS)

📌 2. По подходу (активные / пассивные)

Активные — мы прямо пишем код с учетом оптимизаций (мемоизация, lazy-loading, code splitting).
Пассивныеоптимизации «под капотом», которые происходят автоматически и не требуют явных действий разработчика. Мы их напрямую не пишем, но должны понимать, что они есть и как работают (батчинг, tree shaking и тд)

📌 3. По уровню применения

Фреймворк-специфичные (React: memo, useCallback, Suspense; Vue: computed, watchEffect, и т.д.)
Языковые/ванильные (JS: Event delegation, Web Workers; CSS: will-change, contain; HTML: loading="lazy")
Инфраструктурные (CDN, кеши, SSR/SSG, bundlers: webpack/vite/rollup)
Браузерные и DevTools (Performance tab, Lighthouse, Coverage, профилировщики)
Архитектурные и паттерны (Декомпозиция, DRY, SOLID и тд.)

📌 4. По типу эффекта

Скорость загрузки (Load performance) — как быстро сайт открывается.
Интерактивность (Runtime performance) — как быстро реагирует на действия.
Гладкость (Smoothness) — FPS, плавность анимаций, отсутствие "лагов".
Устойчивость (Stability) — CLS, предсказуемость интерфейса.

📌 5. По времени применения

До разработки — проектирование архитектуры, выбор стека.
Во время разработки — правильные паттерны, линтеры, code splitting.
После разработки — профилирование, мониторинг перфоманса, оптимизация по данным реальных пользователей (RUM).

Я запускаю цикл постов, в котором на конкретных примерах разберём каждую категорию. Посмотрим, какие инструменты и практики можно применять, обсудим их плюсы и минусы, а также то, как они работают в реальных проектах.

Цель — собрать большую базу знаний из 50+ способов оптимизации фронтенда (а может, получится и больше). В итоге выйдет не просто серия постов, а полноценная карта оптимизаций, которая станет шпаргалкой для собесов и практической помощью в работе.

#оптимизации #react #frontend
5👍41🔥244🤝2
🧠 Оптимизация памяти во фронтенде

Когда говорят про оптимизацию фронтенда, чаще всего думают о скорости загрузки или анимациях. Но есть ещё одна важная область — память.

- утечки замедляют приложение со временем
- на мобильных устройствах это может приводить к крашам
- стабильность UX напрямую зависит от того, как мы управляем памятью

Теперь давайте поговорим об основных источниках проблем

1️⃣Замыкания и долгоживущие ссылки

Частая ошибка — сохранять в замыкании большие объекты или DOM-элементы, которые уже не нужны. В итоге GC (сборщик мусора) не может их очистить.

Решение: не тащить в замыкания лишнее, по возможности использовать WeakMap/WeakSet для хранения.

2️⃣Неудалённые обработчики событий

Навесили addEventListener, но забыли removeEventListener. Опасно при работе с компонентами: удалённый компонент может остаться в памяти из-за висящего обработчика.

Решение: всегда отписываемся.

useEffect(() => {
const handler = () => console.log("scroll");
window.addEventListener("scroll", handler);

return () => {
window.removeEventListener("scroll", handler);
};
}, []);


3️⃣Таймеры и интервалы

Забытые setInterval или setTimeout продолжают жить, даже если компонент уже размонтирован.

Решение: чистим вручную.

const id = setInterval(() => doWork(), 1000);
// позже
clearInterval(id);


4️⃣Кэширование «без меры»

Иногда мы храним результаты в памяти (memoization, cache, global store), но не думаем про «старые» данные. В итоге кэш растёт бесконечно. Избыточное кэширование и мемоизация тоже могут быть вредны: на лёгких операциях выгоднее пересчитать заново, чем хранить всё в памяти.

Решение: использовать LRU cache или ограничивать размер хранения.

5️⃣Глобальные ссылки и синглтоны

Всё, что записано в глобальную область (window, global store), живёт всё время жизни приложения. Если туда положить тяжёлый объект, GC его никогда не удалит.

Решение: хранить только действительно нужное, очищать ссылки вручную, если объект больше не нужен.

6️⃣DOM-ссылки и оторванные узлы

Если держать ссылку на DOM-элемент, удалённый из документа, он остаётся в памяти. Особенно актуально при ручной работе с document.createElement.

Решение: обнулять ссылки после удаления узлов.

#оптимизации #react #frontend #память
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥71
🖥 Замыкания и долгоживущие ссылки: как избежать утечек памяти

Замыкания в JavaScript позволяют функциям «запоминать» переменные внешнего окружения. Но если в замыкании остаются большие объекты или DOM-элементы, сборщик мусора их не очистит — это приводит к утечкам памяти.

🔹 Проблема: долгоживущие ссылки

Когда замыкание хранит объект, на который больше нет других ссылок, сборщик мусора не может его удалить, потому что замыкание всё ещё держит ссылку.


function createCache() {
const cache = { largeData: new Array(1000000).fill('*') };

return function getCache() {
return cache;
};
}

const getCache = createCache();
// cache занимает память, пока существует getCache


Здесь cache будет жить в памяти пока существует функция getCache, даже если мы больше не используем её данные.

🔹 Решение 1: функция очистки

Можно добавить метод для обнуления ссылок, чтобы GC мог очистить объект:


function createCache() {
let cache = { largeData: new Array(1000000).fill('*') };

function getCache() {
return cache;
}

getCache.cleanup = function () {
cache = null; // память освобождается
};

return getCache;
}

const getCache = createCache();
getCache.cleanup(); // теперь память под cache может быть освобождена


🔹 Решение 2: WeakMap для временных данных

Если нужно хранить состояние объектов, но не держать их в памяти навсегда, используйте WeakMap. Сборщик мусора автоматически очистит объект, когда на него не останется ссылок.


const objectData = new WeakMap();

function attachData(obj) {
objectData.set(obj, { temp: 'data' });
}

let obj = {};
attachData(obj);

obj = null; // объект и данные в WeakMap будут автоматически удалены


🔹 Резюме: как безопасно использовать замыкания

- Не храните в замыканиях лишние объекты.
- Для больших структур или временных данных используйте WeakMap/WeakSet.
- Добавляйте функции очистки (cleanup) для объектов и стейта, которые больше не нужны.
- Проверяйте память через DevTools, чтобы убедиться, что объекты удаляются.

💡 Совет для разработчиков:
Любой state или кеш, который вы храните в замыкании, должен иметь «точку выхода» — иначе ваше приложение постепенно «накопит» память, которая больше не используется.


#оптимизации #react #frontend #память #замыкания
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥104🤝2🫡1
📚 Кэширование без меры: когда оптимизация становится проблемой

Кэширование и мемоизация звучат как бесплатная оптимизация. Мы думаем: «Раз вычисление можно не делать повторно, значит всегда лучше закэшировать». Но это опасное заблуждение. Если кэшировать без меры, приложение начинает засорять память и работать хуже, а не лучше.

🚨 Как мы засоряем память

Представьте, что вы храните в памяти результаты всех вычислений. Старые данные не удаляются, новые постоянно добавляются. В итоге кэш разрастается до сотен мегабайт. На слабых устройствах это выливается во фризы или даже падение.

Был реальный кейс: разработчик решил «оптимизировать» React-страницу и мемоизировал каждый UI-компонент. На странице их было сотни. В итоге выигрыш оказался мизерным, а память улетела в космос. Сам процесс мемоизации стал дороже, чем пересчёт. Правильнее было бы мемоизировать целую форму или контейнер, где решение о перерисовке действительно экономит ресурсы.

Пример бессмысленной мемоизации

function add(a, b) {
return a + b;
}

// кто-то решил мемоизировать даже это
function memoize(fn) {
const cache = new Map();
return function(...args) {
const key = args.join(',');
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
};
}

const memoAdd = memoize(add);

console.log(memoAdd(2, 3)); // 5
console.log(memoAdd(2, 3)); // 5 из кэша (но толку?)


Сложение и так работает за наносекунды. Хранить результаты в памяти бессмысленно — найти их в Map будет дольше.

Пример, где кэш оправдан

Тяжёлые операции, например парсинг или генерация отчётов.

function heavyComputation(key) {
// имитация дорогой операции
for (let i = 0; i < 1e7; i++) {}
return `Result for ${key}`;
}


Если вызывать её часто с одними и теми же данными, кэш реально ускоряет работу. Но нужен лимит. Самый популярный вариант — LRU Cache (Least Recently Used).

import LRU from 'lru-cache';

const cache = new LRU({ max: 100 }); // максимум 100 элементов

function getData(key) {
if (cache.has(key)) {
return cache.get(key);
}
const result = heavyComputation(key);
cache.set(key, result);
return result;
}

console.log(getData("a")); // долго
console.log(getData("a")); // быстро, из кэша


Теперь кэш не растёт бесконечно. Когда хранилище достигает 100 элементов, старые записи выбрасываются.

🔧 Пример из UI

Вместо того чтобы мемоизировать каждый компонент по отдельности:

const MemoButton = React.memo(Button);
const MemoInput = React.memo(Input);
const MemoLabel = React.memo(Label);


Лучше мемоизировать контейнер, внутри которого они все живут:

const Form = ({ fields, onSubmit }) => {
return (
<form onSubmit={onSubmit}>
{fields.map((f) => (
<Input key={f.id} {...f} />
))}
<button type="submit">Submit</button>
</form>
);
};

// мемоизируем целиком форму
export default React.memo(Form);


Так вы экономите не на «каждой кнопке», а на всей форме сразу. Это дешевле и эффективнее.

Кэш — это инструмент, а не магическая палочка. Он действительно помогает на тяжёлых вычислениях и часто используемых данных. Но хранить всё подряд — значит засорять память. Лёгкие операции всегда лучше пересчитать заново. А в UI выгоднее мемоизировать крупные контейнеры, а не каждую мелочь.


💡Правило простое: если сомневаешься — лучше пересчитай, чем закэшируй навсегда.

#оптимизации #react #frontend #память #memo #кеширование
🔥224👍2
🚀 UX Performance: как скорость ощущается глазами пользователя

Когда мы говорим "сайт быстрый" — это не про цифры в Lighthouse, а про то, как человек ощущает взаимодействие.
Google выделил три ключевых метрики, которые напрямую влияют на удобство:

LCP — Largest Contentful Paint

INP (ранее FID) — Interaction to Next Paint

CLS — Cumulative Layout Shift

Давай разберём их: что значат, как ломаются и как чинить.

1. 🖼 LCP — "Когда я увидел главное"

Что это: за сколько секунд показывается главный кусок контента (большая картинка, заголовок, постер видео).
👉 Хорошо: ≤ 2.5с, Плохо: > 4с.


Пример плохого UX:
Открываешь страницу новостей, а вместо фото и заголовка долго смотришь на белый экран. Даже если внизу уже подгрузился футер, пользователю кажется, что страница медленная.

Что ломает LCP:
- Ленивая загрузка (loading="lazy") у главной картинки.
- Большой TTFB (медленный сервер/БД).
- Картинка грузится через JS, а не сразу в HTML.

Как починить:
- Ускорить бэкенд + CDN.
- Добавить preload для картинки
- Не ленизируйте главный баннер.
- Используйте современные форматы (AVIF/WebP).

2. INP — "Насколько сайт слушается"

Что это: измеряет задержку между действием (клик, ввод) и моментом, когда UI реально отвечает.
👉 Хорошо: ≤ 200мс, Плохо: > 500мс.


Пример плохого UX:
Ты кликаешь на кнопку "Добавить в корзину", а сайт думает 1–2 секунды, и только потом подсвечивает товар. Даже если заказ оформляется успешно — ощущение тормоза.

Что ломает INP:
- Тяжёлый JS-бандл, грузящий CPU.
- Обработчик события делает слишком много (например, ререндер целого списка).
- Длинные задачи > 50мс на главном потоке.

Как починить:
- Разбивайте работу на части (Web Worker, requestIdleCallback).
- Даём быстрый визуальный отклик, а данные подгружаем асинхронно.
- Слушатели прокрутки/тача → всегда passive: true
- Для длинных списков — content-visibility: auto; в CSS.

3. 📏 CLS — "Ничего не прыгает"

Что это: метрика стабильности интерфейса.
👉 Хорошо: ≤ 0.1, Плохо: > 0.25.


Пример плохого UX:
Ты хотел кликнуть "Оплатить", но страница прыгнула из-за подгрузившейся рекламы, и ты ткнул в "Удалить". Боль.

Что ломает CLS:
- Картинки без размеров.
- Баннеры/видео без зарезервированного места.
- Подключение шрифтов без font-display: swap.

Как починить:
- Всегда задаём размеры/aspect-ratio у изображений
- Резервируем контейнеры под рекламу.
- Используем font-display: swap и fallback-шрифты близкие по метрикам.
- Анимации — только через transform/opacity.

#оптимизации #react #frontend #ux #performance
🔥19👍64💯3
👩‍💻 ВЕСЬ React в одном собеседовании. 100 вопросов + 20 задач за 2 часа

Это видео представляет собой структурированный разбор ключевых тем React, необходимых для успешного прохождения технического собеседования. Формат сочетает теоретические вопросы с практическим решением задач.

Рекомендую посмотреть это видео, как и предыдущее. Считай, сразу готов к собесам 😎

Видео уже на канале!
Я не оставляю ссылку, так как видео лучше продвигается, если заходить на него напрямую с YouTube. Это помогает улучшить его рейтинг и увеличить шансы на органическое продвижение.

🔗 Ссылка на вопросы и задачи

00:00:00 Введение: тема собеседования по React
00:01:44 Что такое React
00:02:43 React как библиотека
00:03:40 SPA-приложения
00:05:25 Компонентный подход
00:06:12 JSX
00:07:11 Состояние и props
00:08:05 Рендеринг списков
00:09:44 Условный рендеринг
00:12:38 Триггеры рендера
00:13:08 Изменение пропсов и перерендер
00:14:25 Роль хуков в React
00:15:41 Основные хуки
00:16:37 Дополнительные хуки
00:18:34 Оптимизация с помощью мемоизации
00:21:02 Жизненные циклы компонентов
00:23:01 Фазы жизненного цикла
00:24:21 Жизненные циклы компонента
00:25:13 Жизненные циклы в функциональных компонентах
00:26:47 Ленивая инициализация состояния
00:27:28 React Children
00:28:27 Обработка данных запроса
00:32:59 Рефакторинг компонента
00:37:38 Оптимизация функции
00:41:07 Работа с запросами и событиями
00:42:37 Сервис «Хаб»
00:43:54 Функциональность тренажёра
00:44:55 Задания на консоль
00:46:23 React Memo
00:51:14 Рефакторинг кода
00:54:24 Обработка событий в React
00:55:54 React Fragment
00:56:15 Проп-дриллинг
00:57:10 Контексты в React
00:57:33 Контролируемые и неконтролируемые входы
00:58:27 Порталы в React
00:59:54 Создание контекста
01:00:54 useEffect vs useLayoutEffect
01:01:32 Использование useRef
01:02:31 Кастомные хуки
01:03:30 Мемоизация и кэширование
01:06:04 Хуки как декораторы
01:07:11 UserUseContext
01:08:04 ImperativeHandle
01:09:24 Поднятие и опускание состояния
01:11:06 Реф и форвард реф
01:13:12 Пьюр компонент
01:14:14 Эра баундере (Error Boundary)
01:15:25 React Router
01:16:18 Render Props
01:18:40 Синтетические события
01:19:40 Управляемый и неуправляемый input
01:22:33 Кастомный хук toggle
01:26:26 Пример с меню
01:27:02 Рендеринг компонентов
01:28:30 Изменение состояния isValid
01:31:52 Оптимизация рендеринга
01:33:10 Рефакторинг кода и оптимизация
01:37:53 StrictMode
01:38:51 Код-сплит и ленивая загрузка
01:40:15 Анлодинг (загрузка при монтировании)
01:41:24 React Lazy и Suspense
01:42:23 Инструменты разработчика React
01:43:23 Оптимизация в React
01:44:49 Дополнительные оптимизации
01:45:40 Мемоизация и код-сплитинг
01:46:37 Батчинг в React
01:48:58 Реактивность в React
01:50:53 Реализация реактивности
01:51:20 Прокси-объекты и паттерны
01:52:15 Эвристики React
01:53:55 Принудительный рендер
01:54:20 Кастомный хук с debounce
01:57:47 Рекурсивное отображение структуры
02:02:46 Компонент «Файл»
02:06:38 Рефакторинг рендеринга файлов
02:08:50 Завершение и React 18
02:09:44 Конкурентный режим и хуки
02:10:14 Управление конкурентным режимом
02:11:00 React 19: новые возможности
02:11:44 Планировщик Fiber
02:12:44 Фазы рендеринга и коммита
02:12:48 Конкурентный режим и приоритеты
02:13:49 Серверные компоненты
02:15:09 Серверный рендеринг и гидрация
02:16:14 Асинхронные обновления в React
02:17:51 Виртуальный и теневой DOM
02:18:42 Типы элементов в React
02:19:11 Принцип единой ответственности
02:20:05 Принцип открытости-закрытости
02:21:42 Принципы SOLID в React
02:22:31 Render-пропсы и слоты
02:23:25 Антипаттерн компоновщика
02:24:22 Изучение паттернов
02:26:18 Подготовка к собеседованиям

#react #собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
134🔥13👍6
🔥 10 способов оптимизировать React-бандл

Когда React-приложение растёт, размер бандла становится критичным. От него напрямую зависят скорость загрузки, время до первого рендера и даже SEO.
Вот проверенные приёмы, которые реально уменьшают размер бандла и ускоряют загрузку 👇

1️⃣ Tree shaking
Webpack умеет автоматически выкидывать неиспользуемый код.
Главное — использовать import/export, а не require().
Например, если ты импортировал только map из lodash, в бандл не попадёт весь lodash, а только нужная часть.
Это работает в продакшн-сборке (mode: 'production') и помогает избавиться от «мёртвых» зависимостей.

2️⃣ Code splitting / Lazy loading
Разделяем приложение на отдельные чанки, чтобы не грузить всё сразу.
В React это делается просто:
const Settings = React.lazy(() => import('./Settings'));

Компонент подгружается только при переходе на нужную страницу — это ускоряет загрузку первого экрана и экономит трафик пользователю.

3️⃣ Dynamic imports
Похожи на lazy loading, но гибче: модуль можно подгрузить в любой момент, например, при клике или определённом событии.
button.onclick = async () => {
const { run } = await import('./heavyModule');
run();
};

Так можно динамически подгружать тяжёлые утилиты, графики или редакторы, которые нужны не всем пользователям.

4️⃣ Vendor splitting
Отделяем сторонние библиотеки (React, Lodash, Axios и т.д.) от остального кода.
Они попадают в отдельный чанк (vendors.js), и браузер может кешировать его между обновлениями приложения.
При следующем релизе пользователь скачает только изменившийся код, а не всё приложение заново.

5️⃣ Bundle analyzer
Инструмент webpack-bundle-analyzer показывает визуально, какие файлы занимают больше всего места в бандле.
Это помогает быстро понять, стоит ли заменить тяжёлую библиотеку на более лёгкий аналог или удалить неиспользуемые импорты.
Пример: часто moment.js можно заменить на dayjs, и размер падает на десятки килобайт.

6️⃣ Compression (gzip / brotli)
После сборки важно сжимать файлы перед отправкой пользователю.
На сервере (или CDN) включается gzip или brotli, и вес бандла уменьшается в 2–3 раза.
Например, 600 KB превращаются в 200 KB — и страница загружается ощутимо быстрее.

7️⃣ Minification
Минификация удаляет пробелы, переносы строк, комментарии и переименовывает переменные.
Инструменты вроде Terser или esbuild делают это автоматически при продакшн-сборке.
В итоге код становится компактнее и быстрее загружается, но функционально не меняется.

8️⃣ Dead code elimination
Webpack и Babel умеют находить и удалять код, который никогда не выполнится.
Например:
if (process.env.NODE_ENV !== 'production') {
console.log('debug info');
}

В продакшн-версии эти строки просто не попадут в итоговый бандл.
Это избавляет от лишнего мусора и ускоряет работу.

9️⃣ Asset optimization
Изображения, шрифты и SVG тоже влияют на размер бандла.
Используй оптимизацию — например, image-webpack-loader или svgo.
Преобразуй картинки в современные форматы (.webp, .avif), чтобы они весили меньше.
Иногда просто переконвертация PNG → WebP уменьшает размер в 5–10 раз.

🔟 Prefetch / Preload
Позволяет браузеру заранее подгружать чанки, которые скоро понадобятся.
<link rel="prefetch" href="settings.chunk.js">

Например, пользователь на главной странице, но браузер уже «знает», что он, скорее всего, откроет настройки — и подгружает их заранее.
Это улучшает перформанс без лишней нагрузки на сеть.

⚡️ Даже простое применение этих приёмов может сократить размер бандла в 2–3 раза и сделать приложение визуально «быстрее» для пользователя.
А если подключить анализатор и немного поработать с динамическими импортами — результат будет заметен сразу.


#react #frontend #webpack #vite #оптимизация #performance
#оптимизации #react #frontend #webpack
13🔥10👍7🤝2