PrepBro
Профессии
PrepBro
Профессия:

Подготовка

  • Вопросы6104
  • Задачи30

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Профессия:

Подготовка

  • Вопросы6104
  • Задачи30

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Все 24 профессии
Android DeveloperData AnalystSystem Analyst1С DeveloperiOS DeveloperBusiness AnalystJava DeveloperData ScientistQA EngineerQA AutomationPHP BackendC/C++ BackendDevOps EngineerIT Project ManagerFrontend DeveloperNode.js BackendUnity DeveloperC# BackendProduct AnalystFlutter DeveloperPython DeveloperIT Product ManagerGo DeveloperData Engineer

© 2026 PrepBro. Все права защищены.

Telegram-бот
\n```\n\n### Как это работает в деталях\n\n**Фаза 1: Инициирование загрузки**"}},{"@type":"Question","name":"Зачем библиотека React делится на пакеты ReactDOM и React?","acceptedAnswer":{"@type":"Answer","text":"## Архитектура React: разделение на React и ReactDOM\n\nРазделение React на два отдельных пакета — это архитектурное решение, которое отражает принцип разделения ответственности (Single Responsibility). Давайте разберёмся, почему это было сделано.\n\n## Основная причина: независимость ядра от платформы\n\nReact ядро (пакет `react`) содержит исключительно логику компонентов: состояние, жизненный цикл, хуки, контекст и алгоритм reconciliation (сравнение и обновление виртуального DOM). Это полностью независимо от того, как компоненты будут отрендерены.\n\nReactDOM (пакет `react-dom`) — это **рендерер**, который берёт результат работы React компонентов и преобразует их в реальный DOM браузера. Это позволяет одному ядру работать с разными целевыми платформами:\n\n```javascript\n// React — ядро, работает везде\nimport React from 'react';\n\nfunction MyComponent() {\n const [count, setCount] = React.useState(0);\n return ;\n}"}},{"@type":"Question","name":"Где лучше писать запросы к серверу в React?","acceptedAnswer":{"@type":"Answer","text":"## Где писать запросы к серверу в React?\n\nЭто один из самых важных вопросов в React архитектуре. Правильное размещение API запросов влияет на производительность, тестируемость и масштабируемость приложения.\n\n### Правило: Не в компонентах\n\n**Главный принцип:** Компоненты должны отвечать только за рендеринг, а не за логику получения данных.\n\n```typescript\n// Плохо — API прямо в компоненте\nexport function QuestionList() {\n const [questions, setQuestions] = useState([]);\n\nuseEffect(() => {\n fetch('/api/questions')\n .then(r => r.json())\n .then(data => setQuestions(data))\n .catch(error => console.error(error));\n }, []);\n\nreturn
{questions.map(q =>
{q.title}
)}
;\n}\n```\n\n**Проблемы:**\n- Трудно тестировать (нужно мокировать fetch)\n- Дублирование кода во многих компонентах\n- Смешивание concerns (UI + логика данных)\n- Сложно переиспользовать логику\n\n### Правильное место: Custom Hooks"}},{"@type":"Question","name":"Выполнится ли перерисовка если в useState изменить значение на такое же","acceptedAnswer":{"@type":"Answer","text":"## Перерисовка при установке того же значения в useState\n\n**Короткий ответ:** Нет, перерисовка не происходит, если значение одинаковое. React использует Object.is() для сравнения.\n\n## Как работает сравнение в React 18+\n\n```javascript\nconst [count, setCount] = useState(0);\n\n// Внутри React\nsetCount(0); // Object.is(0, 0) === true\n// Результат: перерисовка НЕ происходит\n\nsetCount(1); // Object.is(0, 1) === false\n// Результат: перерисовка ПРОИСХОДИТ\n```\n\n## Детальный механизм\n\n### React использует Object.is() для сравнения\n\n```javascript\n// Object.is() — это строгое сравнение\nObject.is(0, 0); // true\nObject.is('hello', 'hello'); // true\nObject.is(false, false); // true\n\n// Отличие от ===\nObject.is(NaN, NaN); // true (отличие от ===)\nObject.is(-0, +0); // false (отличие от ===)\nObject.is([], []); // false (разные ссылки)\n```\n\n## Примеры\n\n### Пример 1: Примитивы (числа, строки)\n\n```jsx\nfunction Counter() {\n const [count, setCount] = useState(0);"}},{"@type":"Question","name":"Как решаешь проблему когда не существует метода для задачи?","acceptedAnswer":{"@type":"Answer","text":"## Решение проблем без готовых методов\n\nВ разработке часто встречаются задачи, для которых нет встроенного метода или готовой библиотеки. Правильный подход требует **систематического мышления**, а не просто поиска в Google.\n\n### Мой процесс (10+ лет опыта)\n\n#### Шаг 1: Разбей задачу на подзадачи\n\nЕсли нет готового решения - декомпозируй проблему:\n\n```javascript\n// Задача: Найти все уникальные пары пользователей которые обменивались сообщениями\n\n// Неправильно: \"Как это сделать в JavaScript?\"\n// Правильно: Разбей на части\n\n// 1. Получить все сообщения\n// 2. Для каждого сообщения создать пару (от, к)\n// 3. Нормализовать пары (сортировать aby их уникальность)\n// 4. Удалить дубликаты\n// 5. Вернуть результат"}},{"@type":"Question","name":"Все ли будешь хранить в state","acceptedAnswer":{"@type":"Answer","text":"## Что хранить в state\n\n**Нет, не всё.** Хранение всего в state — это anti-pattern, который делает приложение медленным и сложным. Нужно критически подходить к тому, что живёт в state.\n\n### Правило 80/20\n\n**В state хранить только:**\n- Данные, которые используют несколько компонентов\n- Данные, изменяющиеся часто (и требующие перерендеринга)\n- UI состояние (opened, selected, loading, error)\n\n**НЕ хранить в state:**\n- Статические данные (конфиг, константы)\n- Данные, нужные одному компоненту (local state)\n- Производные данные (computed/selector)\n- Кэширующиеся данные (используй хуки типа useMemo)\n- Временные значения (в процессе редактирования)\n\n### Примеры НЕправильного подхода"}},{"@type":"Question","name":"В чем разница работы Event в React и в DOM?","acceptedAnswer":{"@type":"Answer","text":"## Разница между Events в React и нативном DOM\n\nЭто важный вопрос, потому что React имеет свою систему обработки событий, которая отличается от стандартного DOM API. Разработчик должен понимать эти различия для отладки и оптимизации.\n\n### Нативный DOM\n\nВ стандартном JavaScript события работают так:\n\n```javascript\n// Добавляем слушатель к элементу\nconst button = document.querySelector('button');\nbutton.addEventListener('click', (event) => {\n console.log('Клик!', event);\n});\n\n// Удаляем слушатель\nbutton.removeEventListener('click', handleClick);\n```\n\n**Фазы события в DOM:**\n1. **Capturing (захват)** - событие идёт от window к целевому элементу\n2. **Target (целевой элемент)** - событие на самом элементе\n3. **Bubbling (всплытие)** - событие идёт от целевого элемента к window\n\n```javascript\nconst parent = document.querySelector('.parent');\nconst child = document.querySelector('.child');\n\n// Фаза захвата\nparent.addEventListener('click', () => console.log('Parent capture'), true);"}},{"@type":"Question","name":"Где нужно использовать классы в React?","acceptedAnswer":{"@type":"Answer","text":"## Использование классов в React\n\nВ современном React предпочтение отдаётся функциональным компонентам с хуками. Однако класс-компоненты все ещё имеют место в определённых сценариях.\n\n### Почему функциональные компоненты - приоритет\n\nВ современной разработке **функциональные компоненты с хуками** - это стандарт. Они:\n- Проще писать и понимать\n- Имеют меньше boilerplate кода\n- Легче тестировать\n- Лучше с точки зрения производительности\n- Поддерживаются новыми возможностями React (Suspense, Concurrent features)\n\n```typescript\n// Современный подход - функциональный компонент\nfunction UserProfile({ userId }: { userId: string }) {\n const [user, setUser] = useState(null);\n const [loading, setLoading] = useState(true);\n\nuseEffect(() => {\n fetchUser(userId).then(setUser).finally(() => setLoading(false));\n }, [userId]);\n\nif (loading) return

Загрузка...

;\n return
{user?.name}
;\n}\n```\n\n### Сценарии использования класс-компонентов"}},{"@type":"Question","name":"Благодаря чему появляется ошибка CORS в браузере","acceptedAnswer":{"@type":"Answer","text":"## Благодаря чему появляется ошибка CORS в браузере\n\n**CORS** (Cross-Origin Resource Sharing) - это механизм безопасности браузера, который контролирует доступ к ресурсам с других доменов. Ошибка CORS появляется, когда браузер блокирует запрос к ресурсу с другого источника.\n\n### Что такое Origin (источник)\n\nOrigin состоит из трёх частей: **схема (protocol) + домен (domain) + порт (port)**\n\n```\nhttps://example.com:443\n ^ ^ ^\nпротокол домен порт\n```\n\n**Примеры разных Origin-ов:**\n\n```\nhttps://example.com (стандартный)\nhttps://example.com:3000 (другой порт!)\nhttp://example.com (другой протокол!)\nhttps://api.example.com (другой домен!)\nhttps://example.org (совсем другой домен)\n```\n\n### Когда появляется ошибка CORS\n\n**Same-Origin Policy** - браузер разрешает запросы только на тот же Origin.\n\n```javascript\n// Запрос со страницы: https://example.com\n\n// ОК: Same-Origin\nfetch('https://example.com/api/users');"}},{"@type":"Question","name":"UseEffect выполняется синхронно или асинхронно","acceptedAnswer":{"@type":"Answer","text":"## UseEffect: синхронно или асинхронно\n\n**useEffect выполняется асинхронно**, но с важными нюансами. Понимание этого критично для правильной работы с побочными эффектами в React.\n\n### Как работает useEffect\n\n**Этап 1: Рендер компонента (синхронно)**\n\n```javascript\nfunction MyComponent() {\n // Это выполняется синхронно при рендере\n const [count, setCount] = useState(0)\n console.log('Render: count =', count)\n \n return
{count}
\n}\n```\n\n**Этап 2: Обновление DOM (синхронно)**\n\n```javascript\n// React обновляет DOM\n// Это происходит после рендера, но ДО useEffect\n```\n\n**Этап 3: Выполнение useEffect (асинхронно)**\n\n```javascript\nfunction MyComponent() {\n const [count, setCount] = useState(0)\n \n // Это выполняется ПОСЛЕ рендера и обновления DOM\n useEffect(() => {\n console.log('useEffect: count =', count)\n }, [count])\n \n return
{count}
\n}\n```\n\n### Порядок выполнения"}},{"@type":"Question","name":"Map модифицирует исходный массив или создает новый","acceptedAnswer":{"@type":"Answer","text":"## Map: модифицирует или создает новый массив?\n\n**Map создает новый массив** и НЕ модифицирует исходный. Это критически важное поведение для функционального программирования в JavaScript и одна из основных причин, почему map столь популярен. За 10+ лет разработки я вижу, что правильное понимание этого различия - основа чистого и безошибочного кода.\n\n### Основное поведение\n\n**Array.prototype.map() создает новый массив:**\n\n```javascript\nconst numbers = [1, 2, 3, 4, 5];\n\nconst doubled = numbers.map(num => num * 2);\n\nconsole.log(doubled); // [2, 4, 6, 8, 10]\nconsole.log(numbers); // [1, 2, 3, 4, 5] (НЕ изменился!)\n\nconsole.log(doubled === numbers); // false (разные массивы)\n```\n\nЭто чистая функция - она не имеет побочных эффектов.\n\n### Почему это важно: Immutability (Неизменяемость)\n\n**Функциональное программирование предпочитает неизменяемость:**\n\n```javascript\n// ❌ Плохо: mutating the array (side effects)\nconst users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];"}},{"@type":"Question","name":"Умеешь ли верстать","acceptedAnswer":{"@type":"Answer","text":"## Умение верстать и создавать разметку\n\nДа, верстка (HTML + CSS) — это фундаментальный навык Frontend Developer. Верстка включает создание структурированной разметки и стилизацию компонентов.\n\n### Компетенции в верстке\n\n#### 1. Семантическая HTML разметка\n\nВерстка начинается с правильной HTML структуры:\n\n```html\n\n
\n
Logo
\n
\n
Home
\n
About
\n
\n
\n\n\n
\n

Logo

\n
\n Home\n About\n
\n
\n```\n\nСемантические теги улучшают SEO, доступность и читаемость кода.\n\n#### 2. CSS Flexbox\n\nFlexbox — основной инструмент для создания макетов:"}},{"@type":"Question","name":"Какие плюсы и минусы Composition API по сравнению с Options API?","acceptedAnswer":{"@type":"Answer","text":"## Composition API vs Options API в Vue\n\nVue 3 представил новый подход к написанию компонентов. Composition API похож на React hooks, в то время как Options API — старый синтаксис Vue 2. Оба работают в Vue 3, но имеют разные преимущества.\n\n### Options API (старый способ)\n\n```javascript\nexport default {\n data() {\n return {\n count: 0,\n message: 'Hello'\n };\n },\n computed: {\n doubled() {\n return this.count * 2;\n }\n },\n methods: {\n increment() {\n this.count++;\n }\n },\n watch: {\n count(newVal) {\n console.log('Count changed:', newVal);\n }\n },\n mounted() {\n console.log('Component mounted');\n }\n};\n```\n\n### Composition API (новый способ)\n\n```javascript\nimport { ref, computed, watch, onMounted } from 'vue';\n\nexport default {\n setup() {\n const count = ref(0);\n const message = ref('Hello');\n\nconst doubled = computed(() => count.value * 2);\n\nconst increment = () => {\n count.value++;\n };"}},{"@type":"Question","name":"Для чего нужен Package.json?","acceptedAnswer":{"@type":"Answer","text":"## Для чего нужен Package.json\n\nPackage.json — это **метаданные и конфигурация Node.js проекта**. Это один из самых важных файлов в JavaScript/TypeScript экосистеме. Без него npm/yarn не может управлять зависимостями и скриптами проекта.\n\n### Основное назначение\n\n**Package.json описывает:**\n1. Информацию о проекте (имя, версия, описание)\n2. Зависимости (dependencies и devDependencies)\n3. Scripts — команды для запуска проекта\n4. Конфигурацию инструментов (engines, browserslist, etc)\n5. Метаданные для публикации в npm (если это библиотека)\n\n### Структура package.json"}},{"@type":"Question","name":"Для чего нужен UseState?","acceptedAnswer":{"@type":"Answer","text":"## Для чего нужен UseState?\n\nuseState - это хук React, который позволяет добавлять состояние (state) в функциональные компоненты. Это одна из самых важных функций современного React.\n\n### Основное назначение\n\nuseState позволяет компоненту запомнить данные между рендерами. Каждый раз, когда состояние изменяется, компонент перерендеривается с новыми значениями.\n\n```javascript\nconst [count, setCount] = useState(0);\n```\n\n### Синтаксис\n\nconst [value, setValue] = useState(initialValue);\n\nvalue - текущее значение состояния\nsetValue - функция для обновления состояния\ninitialValue - начальное значение (опционально)\n\n### Простой пример\n\n```javascript\nfunction Counter() {\n const [count, setCount] = useState(0);\n \n return (\n
\n

Счётчик: {count}

\n \n
\n );\n}\n```\n\n### Управление различными типами данных"}},{"@type":"Question","name":"Slice или splice мутирует массив","acceptedAnswer":{"@type":"Answer","text":"## Slice или splice мутирует массив\n\n### Ответ: SPLICE мутирует, SLICE не мутирует\n\nЭто критически важное различие для понимания работы с массивами в JavaScript:\n\n- **slice()** — создаёт **новый массив**, исходный не меняется (**immutable**)\n- **splice()** — **модифицирует исходный массив** (**mutable**)\n\n### Сравнение методов\n\n| Метод | Мутирует оригинал | Возвращает | Синтаксис |\n|-------|------------------|-----------|----------|\n| **slice** | ❌ Нет | Новый массив | `array.slice(start, end)` |\n| **splice** | ✅ Да | Удалённые элементы | `array.splice(start, deleteCount, ...items)` |\n\n### slice() — безопасный метод\n\n```javascript\nconst original = [1, 2, 3, 4, 5];\n\n// slice() возвращает новый массив\nconst sliced = original.slice(1, 4);\n\nconsole.log(sliced); // [2, 3, 4]\nconsole.log(original); // [1, 2, 3, 4, 5] — не изменился!"}},{"@type":"Question","name":"Зачем нужен state в React?","acceptedAnswer":{"@type":"Answer","text":"# Зачем нужен state в React?\n\nState (состояние) — это один из ключевых концептов React. Это объект, который содержит данные, изменяемые во время жизни компонента. Понимание state — необходимо для создания интерактивных приложений.\n\n## Основное определение\n\nState — это локальные данные компонента, которые контролируют его поведение и внешний вид. Когда state изменяется, React автоматически перерендеривает компонент, отражая эти изменения в интерфейсе.\n\n## Зачем нужен state?\n\n### 1. Управление динамическими данными\n\nState позволяет компонентам хранить и управлять данными, которые меняются со временем:\n\n```javascript\nfunction Counter() {\n const [count, setCount] = useState(0);\n \n return (\n
\n

Count: {count}

\n \n
\n );\n}\n```\n\nБез state каждое нажатие кнопки не повлияло бы на интерфейс.\n\n### 2. Реактивность пользовательского интерфейса"}}]}

Вопросы по Frontend Developer

Что такое специфичность селекторов в CSS?
1.2 Junior🔥 30💬 1

Что такое специфичность селекторов в CSS?

Специфичность (Specificity) в CSS — это алгоритм, с помощью которого браузер определяет, какие стилевые правила из множества потенциально применимых к одному элементу будут применены в конечном итоге. Это механизм разрешения конфликтов, когда несколько селекторов с разными правилами нацелены на один и тот же HTML-элемент. Специфичность можно представить как «вес» или «приоритет» селектора: чем выше специфичность, тем больше вероятность, что его стили будут использованы.

Как рассчитывается специфичность?

Специфичность рассчитывается как сумма четырех компонентов, которые часто представляют в виде четырех чисел (a, b, c, d) или (0, 0, 0, 0), где:

Читать полностью ->
Что такое env?
1.3 Junior🔥 30💬 3

Что такое env?

В контексте веб-разработки, особенно frontend, термин env (сокращение от environment — окружение) обычно относится к переменным окружения или файлам окружения (например, .env). Это механизм для управления настройками приложения в зависимости от среды выполнения (разработка, тестирование, продакшн). Для Frontend Developer понимание env критически важно, так как оно обеспечивает безопасность, гибкость и поддержку разных сред без изменения кода.

Основные аспекты env в Frontend

1. Переменные окружения (Environment Variables)

Это динамические именованные значения (например, API_URL, DEBUG_MODE), которые влияют на поведение приложения. Они хранятся в файлах .env, которые не коммитятся в репозиторий (добавляются в .gitignore), чтобы защитить чувствительные данные (ключи API, пароли).

Пример файла .env:

API_URL=https://api.example.com
DEBUG=true
MAX_ITEMS=50
Читать полностью ->
Что такое Responsive Web-страница?
1.3 Junior🔥 30💬 1

Что такое Responsive Web-страница?

Responsive Web-страница (от англ. «responsive» — отзывчивый, адаптивный) — это веб-страница, которая автоматически адаптирует свой layout, содержание и функциональность для оптимального отображения на различных устройствах и экранах с разными размерами и ориентациями. Ключевая цель — обеспечить одинаково удобный и эффективный пользовательский опыт независимо от того, просматривается сайт на Desktop компьютере (широкий экран), планшете, мобильном телефоне или даже умном телефоне.

Основные принципы Responsive Design

Адаптивный дизайн строится на трёх фундаментальных технических принципах:

  1. Fluid Grids (Гибкие сетки)
    Вместо фиксированных размеров в пикселях используются относительные единицы измерения (проценты, em, rem, vw/vh). Контейнеры и колонки макета рассчитываются относительно ширины родительского элемента или области просмотра.
Читать полностью ->
Что нужно указать в CSS чтобы сработал breakpoint?
1.0 Junior🔥 30💬 1

Как задать breakpoint в CSS

В современном CSS для создания breakpoint (точки перехода, медиа-запроса) используются медиа-запросы (@media). Они позволяют применять стили в зависимости от характеристик устройства или среды отображения, таких как ширина области просмотра, ориентация или плотность пикселей.

Основные типы медиа-запросов для breakpoint

1. Медиа-запросы по ширине (width) — самые распространённые для адаптивного дизайна:

/* Для экранов шириной до 768px (мобильные) */
@media (max-width: 768px) {
  .container {
    padding: 10px;
  }
}

/* Для экранов шириной от 768px до 1024px (планшеты) */
@media (min-width: 768px) and (max-width: 1024px) {
  .container {
    padding: 20px;
  }
}

/* Для экранов шириной более 1024px (десктоп) */
@media (min-width: 1024px) {
  .container {
    padding: 30px;
  }
}
Читать полностью ->
Что будет если передать useState в функцию?
2.0 Middle🔥 30💬 2

Вопрос о передаче useState в функцию

Если коротко, то передать в функцию можно, но это почти всегда бессмысленно и приведёт к ошибкам или нерабочему коду. Давайте разберём этот вопрос подробно, так как он затрагивает фундаментальные принципы работы React Hooks.

Что такое useState и что он возвращает?

Хук useState возвращает массив из двух элементов:

  1. Текущее значение состояния
  2. Функцию-сеттер для обновления этого состояния
const [count, setCount] = useState(0);
// Возвращает: [0, function setCount(newValue) {...}]

В этом примере count — это примитивное число, а setCount — функция. Передать саму функцию useState куда-либо нельзя, так как это импорт из React (import { useState } from 'react'), это готовая функция из библиотеки.

Вопрос, скорее всего, подразумевает: "Что будет, если передать результат вызова useState (то есть массив [state, setState]) или его части в другую функцию?". Рассмотрим оба варианта.


Читать полностью ->
Проходишь ли какие-либо курсы
2.3 Middle🔥 30💬 2

Мой подход к непрерывному обучению в Frontend-разработке

Хотя у меня за плечами более 10 лет профессионального опыта в frontend-разработке, я считаю непрерывное обучение фундаментальным принципом успеха в нашей быстро меняющейся индустрии. Прямо сейчас я не прохожу формальные курсы с фиксированной программой, но мой процесс обучения является систематическим, целенаправленным и интегрированным в ежедневную работу.

Активные направления моего текущего развития

В настоящее время я фокусируюсь на нескольких ключевых областях:

Читать полностью ->
Приведи примеры задач которые делаешь на JavaScript
2.0 Middle🔥 30💬 1

Примеры типовых задач на JavaScript в Frontend-разработке

Как Frontend Developer с 10+ лет опыта, я решаю широкий спектр задач — от простой манипуляции DOM до создания сложных SPA-приложений. Вот ключевые категории с примерами:

1. Манипуляция DOM и работа с событиями

Цель: Динамическое изменение контента и обработка пользовательских взаимодействий.

// Пример: Создание интерактивного списка задач (To-Do)
class TodoList {
    constructor(containerId) {
        this.container = document.getElementById(containerId);
        this.tasks = [];
        this.init();
    }

init() {
        this.renderForm();
        this.container.addEventListener('click', (e) => {
            if (e.target.classList.contains('delete-btn')) {
                this.deleteTask(e.target.dataset.id);
            }
        });
    }
Читать полностью ->
Почему часто спрашивают про область видимости?
1.0 Junior🔥 30💬 2

Почему вопрос о Scope (области видимости) — ключевой на собеседовании Frontend Developer

Вопросы о области видимости (Scope) — один из краеугольных камней собеседований во frontend-разработке, особенно для JavaScript. Это не просто проверка теории, а глубокая оценка понимания основ языка, которое напрямую влияет на качество, надёжность и безопасность кода.

Область видимости — фундамент понимания JavaScript

JavaScript, несмотря на кажущуюся простоту, имеет уникальную и порой неочевидную модель видимости переменных. Кандидат, который досконально её понимает:

  • Верно предсказывает поведение кода в нестандартных ситуациях (замыкания, hoisting).
  • Избегает распространённых ошибок, ведущих к багам (например, случайное создание глобальной переменной в нестрогом режиме).
  • Пишет более безопасный и поддерживаемый код, правильно инкапсулируя данные.

Ключевые аспекты, которые проверяет вопрос о Scope

Читать полностью ->
Первее выполнится timeout или Promise
2.0 Middle🔥 30💬 1

Приоритет выполнения: setTimeout vs Promise

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

1. Базовый принцип Event Loop

JavaScript имеет однопоточную модель выполнения с асинхронной природой. Event Loop управляет порядком выполнения кода через несколько очередей:

  • Call Stack (Стек вызовов) — синхронные операции
  • Microtask Queue (очередь микрозадач) — для Promise.then/catch/finally, queueMicrotask, MutationObserver
  • Macrotask Queue (очередь макрозадач) — для setTimeout/setInterval, setImmediate, обработчиков событий, requestAnimationFrame

Ключевое правило: Event Loop обрабатывает микрозадачи между макрозадачами и очищает всю очередь микрозадач перед переходом к следующей макрозадаче.

2. Сравнительный пример

Рассмотрим классический пример:

Читать полностью ->
Часто ли используешь UseCallback
2.0 Middle🔥 30💬 1

Использование useCallback в современной React-разработке

Да, я действительно часто использую useCallback, но не бездумно, а с четким пониманием, когда это необходимо. За 10+ лет работы с React я выработал прагматичный подход к этому хуку, основанный на анализе реальной производительности и читаемости кода.

Основные сценарии применения useCallback

1. Мемоизация колбэков для дочерних компонентов:

const ProductList = ({ products, onSelect }) => {
  // Без useCallback ProductItem будет перерендериваться
  // при каждом рендере родителя
  const handleSelect = useCallback((productId) => {
    onSelect(productId);
  }, [onSelect]);

return (
    <div>
      {products.map(product => (
        <ProductItem 
          key={product.id} 
          product={product}
          onSelect={handleSelect}
        />
      ))}
    </div>
  );
};
Читать полностью ->
Одинаковые ли методы привязки у стрелочной и обычной функций
2.0 Middle🔥 30💬 1

Введение: Различие в привязке this - ключевая особенность

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

Подробное сравнение механизмов привязки this

1. Обычная функция: Динамический контекст

Обычная функция имеет собственный, динамически определяемый this. Значение this определяется не в момент объявления функции, а в момент её вызова. Оно зависит от того, как была вызвана функция.

const person = {
    name: 'Иван',
    greet: function() {
        console.log(`Привет, я ${this.name}`);
    }
};

person.greet(); // Вывод: "Привет, я Иван" - `this` = объект `person`

const externalGreet = person.greet;
externalGreet(); // Вывод: "Привет, я undefined" - `this` = глобальный объект (window/undefined в strict mode)
Читать полностью ->
Одинакового ли ранга асинхронные операции с Promise и с setTimeout
2.0 Middle🔥 30💬 1

Различие в ранге асинхронных операций: Promise vs setTimeout

Этот вопрос затрагивает фундаментальный аспект работы Event Loop в JavaScript. Promise и setTimeout действительно представляют собой асинхронные операции, но они имеют разный приоритет (ранг) в механизме событий, что напрямую влияет на порядок их выполнения.

Анатомия Event Loop: микрозадачи и макрозадачи

Ключ к пониманию различий лежит в концепции очередей задач (task queues). В современном JavaScript существует два основных типа очередей:

  1. Очередь микрозадач (Microtask Queue) — для операций с высоким приоритетом.
  2. Очередь макрозадач (Macrotask Queue или Task Queue) — для операций с обычным приоритетом.

Promise относится к микрозадачам. К ним же относятся queueMicrotask(), MutationObserver и некоторые другие API. setTimeout (а также setInterval, setImmediate (Node.js), события ввода-вывода, UI рендеринг) относятся к макрозадачам.

Читать полностью ->
Можно ли у стрелочной функции вызвать метод apply?
1.7 Middle🔥 30💬 1

Можно ли у стрелочной функции вызвать метод apply?

Да, у стрелочной функции можно вызвать метод apply() (и аналогичные методы call() и bind()), так как стрелочные функции в JavaScript являются объектами типа Function. Однако результат и поведение этих методов будет отличаться от их применения к обычным функциям из-за фундаментальных особенностей стрелочных функций.

Особенности стрелочных функций

Стрелочные функции отличаются от обычных функций в трех ключевых аспектах:

  1. Отсутствие собственного контекста (this).
  2. Отсутствие собственного объекта arguments.
  3. Не могут быть использованы как конструкторы.

Как работает apply() с стрелочной функцией

Метод apply() предназначен для вызова функции с заданным значением this и аргументами в виде массива. С обычной функцией он успешно изменяет её контекст:

// Обычная функция
function regularFunc() {
    console.log(this.value);
}
Читать полностью ->
Что такое кастомный хук в React?
1.8 Middle🔥 30💬 1

Что такое кастомный хук в React?

Кастомный хук (Custom Hook) в React — это JavaScript-функция, имя которой начинается с префикса use, которая может использовать другие хуки (такие как useState, useEffect, useContext и т.д.) и предназначена для переиспользования логики с состоянием между несколькими компонентами. Это одно из ключевых нововведений, появившихся с выходом React Hooks в версии 16.8, которое позволяет "вытащить" и инкапсулировать общую логику из компонентов в отдельные, независимые функции.

Основные характеристики кастомных хуков

Читать полностью ->
Можно ли применить метод из объекта через изменение this на текущий объект?
1.8 Middle🔥 30💬 1

Можно ли изменить this при вызове метода объекта?

Да, это возможно, и даже является фундаментальной возможностью JavaScript. Ключевой момент заключается в том, что значение this в JavaScript динамически определяется не местом объявления функции, а способом её вызова (за исключением стрелочных функций). Для управления значением this существуют три специальных метода: call(), apply() и bind().

Основные методы управления this

Эти методы доступны для любой функции, так как они являются свойствами встроенного прототипа Function.prototype.

1. call(context, ...args)

Немедленно вызывает функцию, явно устанавливая this в первый переданный аргумент (context). Последующие аргументы передаются в функцию как обычные параметры.

const user = { name: 'Анна' };
const car = { brand: 'Toyota' };

function showInfo(model, year) {
  console.log(`Пользователь: ${this.name}, Машина: ${this.brand}, Модель: ${model}, Год: ${year}`);
}
Читать полностью ->
Что не нужно писать в render в React?
2.3 Middle🔥 30💬 1

Что следует избегать в методе render компонента React

Метод render является ключевой частью компонента в React, но он предназначен исключительно для возврата JSX-разметки и должен быть «чистым» (без побочных эффектов). Нарушение этого принципа ведёт к непредсказуемому поведению, ошибкам и проблемам с производительностью. Вот что категорически не нужно делать внутри render.

1. Побочные эффекты (Side Effects)

render вызывается многократно при каждом обновлении компонента, поэтому любые операции, изменяющие состояние приложения или внешний мир, недопустимы. К ним относятся:

  • Модификация DOM напрямую (например, через document.getElementById).
  • Вызов API или асинхронные запросы.
  • Изменение пропсов (props) или состояния (state).
  • Работа с глобальными переменными или объектами вне React.
Читать полностью ->
Какой этап жизненного цикла классового компонента заменяет hook useEffect?
1.7 Middle🔥 30💬 2

Соответствие useEffect этапам жизненного цикла классовых компонентов

Хук useEffect в функциональных компонентах React заменяет не один, а несколько методов жизненного цикла классовых компонентов. Это фундаментальное отличие парадигм: useEffect абстрагирует логику побочных эффектов, объединяя то, что в классах было разнесено по разным методам.

Основные соответствия

1. componentDidMount + componentDidUpdate

Наиболее прямое соответствие — это комбинация двух методов. useEffect без второго аргумента (массива зависимостей) выполняется после каждого рендера, подобно:

  • componentDidMount — после первого рендера
  • componentDidUpdate — после каждого обновления
Читать полностью ->
Приведи пример использования componentDidMount в React
2.0 Middle🔥 30💬 2

Использование componentDidMount в React

componentDidMount — это жизненный метод класса React-компонента, который вызывается сразу после монтирования компонента в DOM. Это ключевое место для выполнения side effects, таких как загрузка данных из API, подписка на события, инициализация сторонних библиотек или работа с DOM.

Основные сценарии применения

1. Загрузка данных из API

Наиболее распространённый случай — выполнение AJAX-запросов для получения начальных данных компонента.

import React from 'react';

class UserProfile extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      user: null,
      loading: true,
      error: null
    };
  }
Читать полностью ->
Какие плюсы и минусы стека React + Redux?
2.0 Middle🔥 30💬 1

Плюсы и минусы стека React + Redux

Преимущества стека React + Redux

React и Redux, будучи использованы вместе, образуют мощную комбинацию для построения сложных клиентских приложений. Их совместное применение обеспечивает ряд ключевых преимуществ.

1. Чёткое разделение ответственности (Separation of Concerns)

React отвечает за UI-логику и рендеринг компонентов, а Redux управляет состоянием приложения (application state) и бизнес-логикой. Это разделение делает код более организованным, понятным и легким для поддержки. Компоненты React становятся преимущественно "чистыми" (presentational), они получают данные и callback-функции через props и просто отображают интерфейс. Логика изменения данных и сложные взаимодействия концентрируются в reducers, actions и middleware Redux.

Читать полностью ->
Какие плюсы и минусы async await в JavaScript?
1.7 Middle🔥 30💬 1

Плюсы и минусы async/await в JavaScript

async/await — это синтаксический сахар над Promise, представленный в ES2017, который кардинально изменил подход к асинхронному программированию в JavaScript. Как и любой инструмент, он имеет свои преимущества и недостатки, которые важно понимать для эффективного применения.

Основные преимущества async/await

1. Улучшенная читаемость и поддержка кода

// Сравнение: Promise.then() vs async/await
// Старый подход с цепочкой then
fetchData()
  .then(response => response.json())
  .then(data => processData(data))
  .then(result => saveResult(result))
  .catch(error => console.error('Ошибка:', error));
Читать полностью ->
Какие особенности контекста стрелочных функций?
1.8 Middle🔥 30💬 1

Особенности контекста стрелочных функций в JavaScript

Контекст выполнения (this) — одна из самых важных и фундаментальных особенностей стрелочных функций (Arrow Functions), отличающая их от обычных (Regular Functions). Это ключевое отличие влияет на их поведение, использование и выбор в различных ситуациях.

1. Отсутствие собственного контекста this

Стрелочные функции не имеют собственного this. Они захватывают (или «наследуют») значение this из окружающей лексической области видимости (того контекста, в котором они были созданы). Это поведение противоположно обычным функциям, которые определяют свой this в момент вызова, основываясь на способе вызова (например, как метод объекта, через call/apply, как конструктор или просто вызов).

Читать полностью ->
Какие знаешь методы жизненного цикла классового компонента React?
2.0 Middle🔥 30💬 1

Методы жизненного цикла классового компонента React

Методы жизненного цикла (Lifecycle Methods) в классовых компонентах React — это специальные функции, которые автоматически вызываются на разных этапах существования компонента: от его создания и монтирования в DOM до обновления и удаления. Они позволяют контролировать поведение компонента, выполнять side-эффекты, оптимизировать производительность и управлять состоянием.

Основные категории методов жизненного цикла

Все методы жизненного цикла можно разделить на три основные фазы:

  1. Монтирование (Mounting) — создание и вставка компонента в DOM.
  2. Обновление (Updating) — изменение пропсов или состояния компонента.
  3. Размонтирование (Unmounting) — удаление компонента из DOM.

Также существуют методы обработки ошибок (Error Handling), появившиеся в React 16.

Детальный разбор методов по фазам

Фаза монтирования

Читать полностью ->
Какие хуки React знаешь?
2.0 Middle🔥 30💬 2

Основные хуки React (Hooks)

Я работаю с React с момента выхода хуков в 2019 году (React 16.8) и активно применяю их во всех проектах. Хуки — это функции, которые позволяют использовать состояние и другие возможности React без написания классов. Они революционизировали разработку на React, сделав код более компактным, читаемым и reusable.

Все хуки можно разделить на три основные категории: базовые (используются в 95% компонентов), дополнительные (для оптимизации и side effects) и пользовательские (собственная логика).


📌 Базовые хуки (Basic Hooks)

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

  1. useState Управляет внутренним состоянием компонента. Возвращает массив из двух элементов: текущее значение состояния и функцию для его обновления.
    import React, { useState } from 'react';

function Counter() {
      const [count, setCount] = useState(0); // Инициализация
Читать полностью ->
Как собирать значения из input в React кроме useState?
2.0 Middle🔥 30💬 4

Сбор значений из input в React без использования useState

Хотя useState — самый распространённый и рекомендуемый способ управления состоянием форм в React, существуют альтернативные подходы, которые могут быть полезны в определённых сценариях.

1. Использование useRef для получения значений

Прямое обращение к DOM-элементу без перерисовки компонента. Подходит для чтения значений без необходимости мгновенной реакции интерфейса.

import React, { useRef } from 'react';

function RefForm() {
  const inputRef = useRef(null);
  
  const handleSubmit = (e) => {
    e.preventDefault();
    // Получаем значение напрямую из DOM-элемента
    console.log('Input value:', inputRef.current.value);
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="text" 
        ref={inputRef}
        placeholder="Введите текст"
      />
      <button type="submit">Отправить</button>
    </form>
  );
}
Читать полностью ->
В чем разница между методами Promise.race и Promise.any?
2.2 Middle🔥 30💬 1

Разница между Promise.race и Promise.any

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

Promise.race — первый результат (успех или ошибка)

Promise.race() возвращает Promise, который разрешается или отклоняется со значением первого завершённого Promise'а — неважно, успешно он завершился или с ошибкой.

const promise1 = new Promise((resolve) => setTimeout(() => resolve('First'), 100))
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Second'), 500))
const promise3 = new Promise((reject) => setTimeout(() => reject('Error'), 50))

// Пример 1: первым завершится promise3 с ошибкой
Promise.race([promise1, promise2, promise3])
  .then(result => console.log('Success:', result))
  .catch(error => console.log('Error:', error))  // Error: Error
Читать полностью ->
Как применить методы массива к Map?
1.8 Middle🔥 30💬 1

Применение методов массива к Map

Map в JavaScript - это отдельная структура данных, но её можно преобразовать в массив для использования методов Array.prototype.

1. Преобразование Map в массив

const map = new Map([
  ['name', 'John'],
  ['age', 30],
  ['city', 'New York']
]);

// Способ 1: Array.from() с entries()
const entries = Array.from(map.entries());
console.log(entries);
// [['name', 'John'], ['age', 30], ['city', 'New York']]

// Способ 2: Spread оператор
const spreadEntries = [...map];
console.log(spreadEntries);
// То же самое

// Способ 3: Array.from() с keys() или values()
const keys = Array.from(map.keys());
const values = Array.from(map.values());

2. Использование методов массива

Теперь с массивом можно использовать все методы:

const map = new Map([
  ['user1', { name: 'John', score: 100 }],
  ['user2', { name: 'Jane', score: 95 }],
  ['user3', { name: 'Bob', score: 110 }]
]);
Читать полностью ->
Как оптимизированы ререндеры в классовых компонентах в React?
1.7 Middle🔥 30💬 1

Оптимизация ререндеров в классовых компонентах React

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

1. shouldComponentUpdate() - явное управление ререндерами

shouldComponentUpdate() - это метод жизненного цикла, который определяет, нужно ли перерендеривать компонент.

class UserProfile extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    // Ререндер только если props или state изменились
    return (
      this.props.id !== nextProps.id ||
      this.state.isLoading !== nextState.isLoading
    )
  }

render() {
    return <div>{this.props.id}</div>
  }
}

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

2. React.PureComponent - поверхностное сравнение

Читать полностью ->
Можно ли закэшировать в браузере только статику?
1.0 Junior🔥 30💬 1

Нет, в браузере можно закэшировать не только статику. Кэширование работает для любых ресурсов и API ответов, если это разрешено HTTP заголовками.

HTTP Кэширование

Браузер кэширует ресурсы на основе HTTP заголовков Cache-Control, ETag, Last-Modified и других. Это относится ко всему: HTML, CSS, JS, изображениям, API ответам и даже XHR запросам.

Основные заголовки кэширования

// Статика (длительное кэширование)
// Cache-Control: public, max-age=31536000

// HTML (короткое кэширование)
// Cache-Control: public, max-age=3600

// API ответы (кэшируются, если не запрещено)
// Cache-Control: max-age=300

// Запретить кэширование
// Cache-Control: no-store, no-cache

Кэширование API ответов

// Fetch с использованием браузерного кэша
fetch('/api/users', {
  method: 'GET',
  // Браузер автоматически использует Cache-Control из ответа
})
.then(response => response.json())
.then(data => console.log(data));
Читать полностью ->
Как замыкание влияет на память?
2.0 Middle🔥 30💬 1

Замыкания и управление памятью

Замыкание (closure) — это функция, которая имеет доступ к переменным из своей области видимости, даже после того, как эта область завершила своё выполнение. Это мощная возможность JavaScript, но неправильное использование может привести к утечкам памяти.

Как замыкание влияет на память

Проблема: утечка памяти через замыкания

Когда функция создаёт замыкание, она сохраняет ссылки на все переменные из внешней области видимости. Если замыкание существует долгое время, эти переменные не будут удалены сборщиком мусора.

// Пример утечки памяти через замыкание
function createLeak() {
  const largeArray = new Array(1000000).fill("данные");
  
  return function() {
    console.log(largeArray.length); // замыкание удерживает largeArray в памяти
  };
}

const leakFunction = createLeak();

// largeArray не будет удалена, даже если нам больше не нужна сам массив
// Память будет удерживаться столько, сколько существует leakFunction
Читать полностью ->
Как useState запоминает прошлое состояние?
2.0 Middle🔥 30💬 1

Как useState запоминает прошлое состояние в React

useState — это не магия. React имеет чёткий механизм для запоминания состояния каждого компонента. Понимание этого механизма критично для правильного использования хуков.

Основной механизм: Fiber Architecture

React использует структуру данных "Fiber" для каждого компонента:

// Упрощённая структура Fiber
const fiber = {
  component: MyComponent,
  props: { name: "John" },
  state: [],           // Здесь хранятся значения useState
  hooks: [],           // Информация о хуках
  parent: parentFiber,
  child: childFiber,
  next: siblingFiber
};

Каждому компоненту соответствует уникальный fiber узел в дереве. На этом узле хранится:

  • Текущее состояние
  • История предыдущих состояний
  • Информация обо всех хуках

Порядок вызовов хуков (Hook Rules)

Критически важно: useState должен вызываться в одном и том же порядке!

Реакт запоминает состояние на основе порядка вызова хуков, а не их названия:

Читать полностью ->
Как this попадает в функцию?
1.8 Middle🔥 30💬 1

Как this попадает в функцию и правила его определения

this — один из самых сложных концептов в JavaScript. Понимание того, как this определяется при вызове функции, критично для написания корректного кода. Значение this определяется НЕ в момент объявления функции, а в момент её вызова.

Правила определения this

Есть чёткая иерархия правил, которые определяют значение this:

1. Явное указание: call(), apply(), bind()

Высший приоритет — явное связывание контекста:

const user = {
  name: 'John',
  greet: function() {
    console.log(`Hello, ${this.name}`);
  }
};

const admin = {
  name: 'Admin'
};

// call() — вызывает с явным this
user.greet.call(admin); // 'Hello, Admin'

// apply() — то же самое, но с массивом аргументов
user.greet.apply(admin); // 'Hello, Admin'

// bind() — создаёт новую функцию с привязанным this
const boundGreet = user.greet.bind(admin);
boundGreet(); // 'Hello, Admin'
Читать полностью ->
Как React защищает от XSS?
1.8 Middle🔥 30💬 1

Как React защищает от XSS?

XSS (Cross-Site Scripting) — это атака, когда вредоносный код (обычно JavaScript) внедряется на веб-сайт и выполняется в браузере пользователя. React имеет встроенные механизмы защиты от этого.

Что такое XSS?

// Пример уязвимости
const userInput = '<img src=x onerror="alert(\"Hacked!\")">'; // Опасные данные от пользователя

// В обычном HTML/jQuery
document.innerHTML = userInput; // Выполнит JavaScript!

// Результат: попап "Hacked!" - атака сработала

Как React защищает

1. Экранирование (Escaping) - главная защита

React по умолчанию экранирует все текстовые данные в JSX:

const userInput = '<img src=x onerror="alert(\"Hacked!\")">'; // XSS попытка

function Component() {
  return <div>{userInput}</div>; // Безопасно!
}

// React отобразит буквальный текст:
// <div>&lt;img src=x onerror="alert(\"Hacked!\")"&gt;</div>
// XSS не выполнится!

Как работает экранирование:

Читать полностью ->
Как хорошо знаешь Vue?
1.3 Junior🔥 30💬 1

Как хорошо знаешь Vue?

Это вопрос о глубине знания Vue.js фреймворка. Я отвечу честно и компrehensively.

Краткий ответ

Профессиональный уровень. Знаю Vue 2 и Vue 3, понимаю architecture, best practices, могу делать сложные приложения с оптимизацией.

Vue 2 vs Vue 3: Основные отличия

Vue 2: Options API

export default {
  data() {
    return {
      count: 0,
      name: 'John'
    };
  },
  
  computed: {
    doubled() {
      return this.count * 2;
    }
  },
  
  methods: {
    increment() {
      this.count++;
    }
  },
  
  watch: {
    count(newVal, oldVal) {
      console.log(`changed from ${oldVal} to ${newVal}`);
    }
  },
  
  mounted() {
    // инициализация
  },
  
  beforeDestroy() {
    // очистка
  }
};

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

Vue 3: Composition API

import { ref, computed, watch, onMounted, onUnmounted } from 'vue';
Читать полностью ->
Как скрипт загружается с атрибутом async?
2.0 Middle🔥 30💬 1

Атрибут async при загрузке скриптов

Атрибут async указывает браузеру загружать JavaScript скрипт асинхронно, параллельно с парсингом HTML, что улучшает производительность страницы.

Как работает async?

Без async (синхронная загрузка):

HTML parsing -> Script request -> Script download -> Script execution -> HTML parsing

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

С async (асинхронная загрузка):

HTML parsing -> Script request (в фоне)
HTML parsing (продолжается) <- Script download завершена -> Script execution -> HTML parsing

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

Синтаксис

<script async src="https://example.com/script.js"></script>

Как это работает в деталях

Фаза 1: Инициирование загрузки

Читать полностью ->
Зачем библиотека React делится на пакеты ReactDOM и React?
2.0 Middle🔥 30💬 1

Архитектура React: разделение на React и ReactDOM

Разделение React на два отдельных пакета — это архитектурное решение, которое отражает принцип разделения ответственности (Single Responsibility). Давайте разберёмся, почему это было сделано.

Основная причина: независимость ядра от платформы

React ядро (пакет react) содержит исключительно логику компонентов: состояние, жизненный цикл, хуки, контекст и алгоритм reconciliation (сравнение и обновление виртуального DOM). Это полностью независимо от того, как компоненты будут отрендерены.

ReactDOM (пакет react-dom) — это рендерер, который берёт результат работы React компонентов и преобразует их в реальный DOM браузера. Это позволяет одному ядру работать с разными целевыми платформами:

// React — ядро, работает везде
import React from 'react';

function MyComponent() {
  const [count, setCount] = React.useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
Читать полностью ->
Где лучше писать запросы к серверу в React?
2.0 Middle🔥 30💬 1

Где писать запросы к серверу в React?

Это один из самых важных вопросов в React архитектуре. Правильное размещение API запросов влияет на производительность, тестируемость и масштабируемость приложения.

Правило: Не в компонентах

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

// Плохо — API прямо в компоненте
export function QuestionList() {
  const [questions, setQuestions] = useState([]);

useEffect(() => {
    fetch('/api/questions')
      .then(r => r.json())
      .then(data => setQuestions(data))
      .catch(error => console.error(error));
  }, []);

return <div>{questions.map(q => <div key={q.id}>{q.title}</div>)}</div>;
}

Проблемы:

  • Трудно тестировать (нужно мокировать fetch)
  • Дублирование кода во многих компонентах
  • Смешивание concerns (UI + логика данных)
  • Сложно переиспользовать логику

Правильное место: Custom Hooks

Читать полностью ->
Выполнится ли перерисовка если в useState изменить значение на такое же
2.0 Middle🔥 30💬 1

Перерисовка при установке того же значения в useState

Короткий ответ: Нет, перерисовка не происходит, если значение одинаковое. React использует Object.is() для сравнения.

Как работает сравнение в React 18+

const [count, setCount] = useState(0);

// Внутри React
setCount(0); // Object.is(0, 0) === true
// Результат: перерисовка НЕ происходит

setCount(1); // Object.is(0, 1) === false
// Результат: перерисовка ПРОИСХОДИТ

Детальный механизм

React использует Object.is() для сравнения

// Object.is() — это строгое сравнение
Object.is(0, 0); // true
Object.is('hello', 'hello'); // true
Object.is(false, false); // true

// Отличие от ===
Object.is(NaN, NaN); // true (отличие от ===)
Object.is(-0, +0); // false (отличие от ===)
Object.is([], []); // false (разные ссылки)

Примеры

Пример 1: Примитивы (числа, строки)

function Counter() {
  const [count, setCount] = useState(0);
Читать полностью ->
Как решаешь проблему когда не существует метода для задачи?
2.0 Middle🔥 30💬 1

Решение проблем без готовых методов

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

Мой процесс (10+ лет опыта)

Шаг 1: Разбей задачу на подзадачи

Если нет готового решения - декомпозируй проблему:

// Задача: Найти все уникальные пары пользователей которые обменивались сообщениями

// Неправильно: "Как это сделать в JavaScript?"
// Правильно: Разбей на части

// 1. Получить все сообщения
// 2. Для каждого сообщения создать пару (от, к)
// 3. Нормализовать пары (сортировать aby их уникальность)
// 4. Удалить дубликаты
// 5. Вернуть результат
Читать полностью ->
Все ли будешь хранить в state
1.3 Junior🔥 30💬 2

Что хранить в state

Нет, не всё. Хранение всего в state — это anti-pattern, который делает приложение медленным и сложным. Нужно критически подходить к тому, что живёт в state.

Правило 80/20

В state хранить только:

  • Данные, которые используют несколько компонентов
  • Данные, изменяющиеся часто (и требующие перерендеринга)
  • UI состояние (opened, selected, loading, error)

НЕ хранить в state:

  • Статические данные (конфиг, константы)
  • Данные, нужные одному компоненту (local state)
  • Производные данные (computed/selector)
  • Кэширующиеся данные (используй хуки типа useMemo)
  • Временные значения (в процессе редактирования)

Примеры НЕправильного подхода

Читать полностью ->
В чем разница работы Event в React и в DOM?
2.0 Middle🔥 30💬 1

Разница между Events в React и нативном DOM

Это важный вопрос, потому что React имеет свою систему обработки событий, которая отличается от стандартного DOM API. Разработчик должен понимать эти различия для отладки и оптимизации.

Нативный DOM

В стандартном JavaScript события работают так:

// Добавляем слушатель к элементу
const button = document.querySelector('button');
button.addEventListener('click', (event) => {
  console.log('Клик!', event);
});

// Удаляем слушатель
button.removeEventListener('click', handleClick);

Фазы события в DOM:

  1. Capturing (захват) - событие идёт от window к целевому элементу
  2. Target (целевой элемент) - событие на самом элементе
  3. Bubbling (всплытие) - событие идёт от целевого элемента к window
const parent = document.querySelector('.parent');
const child = document.querySelector('.child');

// Фаза захвата
parent.addEventListener('click', () => console.log('Parent capture'), true);
Читать полностью ->
Где нужно использовать классы в React?
2.0 Middle🔥 30💬 1

Использование классов в React

В современном React предпочтение отдаётся функциональным компонентам с хуками. Однако класс-компоненты все ещё имеют место в определённых сценариях.

Почему функциональные компоненты - приоритет

В современной разработке функциональные компоненты с хуками - это стандарт. Они:

  • Проще писать и понимать
  • Имеют меньше boilerplate кода
  • Легче тестировать
  • Лучше с точки зрения производительности
  • Поддерживаются новыми возможностями React (Suspense, Concurrent features)
// Современный подход - функциональный компонент
function UserProfile({ userId }: { userId: string }) {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);

useEffect(() => {
    fetchUser(userId).then(setUser).finally(() => setLoading(false));
  }, [userId]);

if (loading) return <p>Загрузка...</p>;
  return <div>{user?.name}</div>;
}

Сценарии использования класс-компонентов

Читать полностью ->
Благодаря чему появляется ошибка CORS в браузере
1.0 Junior🔥 30💬 1

Благодаря чему появляется ошибка CORS в браузере

CORS (Cross-Origin Resource Sharing) - это механизм безопасности браузера, который контролирует доступ к ресурсам с других доменов. Ошибка CORS появляется, когда браузер блокирует запрос к ресурсу с другого источника.

Что такое Origin (источник)

Origin состоит из трёх частей: схема (protocol) + домен (domain) + порт (port)

https://example.com:443
 ^      ^           ^
протокол домен    порт

Примеры разных Origin-ов:

https://example.com        (стандартный)
https://example.com:3000   (другой порт!)
http://example.com         (другой протокол!)
https://api.example.com    (другой домен!)
https://example.org        (совсем другой домен)

Когда появляется ошибка CORS

Same-Origin Policy - браузер разрешает запросы только на тот же Origin.

// Запрос со страницы: https://example.com

// ОК: Same-Origin
fetch('https://example.com/api/users');
Читать полностью ->
UseEffect выполняется синхронно или асинхронно
2.0 Middle🔥 30💬 1

UseEffect: синхронно или асинхронно

useEffect выполняется асинхронно, но с важными нюансами. Понимание этого критично для правильной работы с побочными эффектами в React.

Как работает useEffect

Этап 1: Рендер компонента (синхронно)

function MyComponent() {
  // Это выполняется синхронно при рендере
  const [count, setCount] = useState(0)
  console.log('Render: count =', count)
  
  return <div>{count}</div>
}

Этап 2: Обновление DOM (синхронно)

// React обновляет DOM
// Это происходит после рендера, но ДО useEffect

Этап 3: Выполнение useEffect (асинхронно)

function MyComponent() {
  const [count, setCount] = useState(0)
  
  // Это выполняется ПОСЛЕ рендера и обновления DOM
  useEffect(() => {
    console.log('useEffect: count =', count)
  }, [count])
  
  return <div>{count}</div>
}

Порядок выполнения

Читать полностью ->
Map модифицирует исходный массив или создает новый
1.0 Junior🔥 30💬 1

Map: модифицирует или создает новый массив?

Map создает новый массив и НЕ модифицирует исходный. Это критически важное поведение для функционального программирования в JavaScript и одна из основных причин, почему map столь популярен. За 10+ лет разработки я вижу, что правильное понимание этого различия - основа чистого и безошибочного кода.

Основное поведение

Array.prototype.map() создает новый массив:

const numbers = [1, 2, 3, 4, 5];

const doubled = numbers.map(num => num * 2);

console.log(doubled);  // [2, 4, 6, 8, 10]
console.log(numbers);  // [1, 2, 3, 4, 5] (НЕ изменился!)

console.log(doubled === numbers); // false (разные массивы)

Это чистая функция - она не имеет побочных эффектов.

Почему это важно: Immutability (Неизменяемость)

Функциональное программирование предпочитает неизменяемость:

// ❌ Плохо: mutating the array (side effects)
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
Читать полностью ->
Умеешь ли верстать
1.0 Junior🔥 30💬 1

Умение верстать и создавать разметку

Да, верстка (HTML + CSS) — это фундаментальный навык Frontend Developer. Верстка включает создание структурированной разметки и стилизацию компонентов.

Компетенции в верстке

1. Семантическая HTML разметка

Верстка начинается с правильной HTML структуры:

<!-- Плохо: не семантично -->
<div class="header">
  <div class="logo">Logo</div>
  <div class="menu">
    <div>Home</div>
    <div>About</div>
  </div>
</div>

<!-- Хорошо: семантично -->
<header>
  <h1>Logo</h1>
  <nav>
    <a href="/">Home</a>
    <a href="/about">About</a>
  </nav>
</header>

Семантические теги улучшают SEO, доступность и читаемость кода.

2. CSS Flexbox

Flexbox — основной инструмент для создания макетов:

Читать полностью ->
Какие плюсы и минусы Composition API по сравнению с Options API?
1.6 Junior🔥 30💬 1

Composition API vs Options API в Vue

Vue 3 представил новый подход к написанию компонентов. Composition API похож на React hooks, в то время как Options API — старый синтаксис Vue 2. Оба работают в Vue 3, но имеют разные преимущества.

Options API (старый способ)

export default {
  data() {
    return {
      count: 0,
      message: 'Hello'
    };
  },
  computed: {
    doubled() {
      return this.count * 2;
    }
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  watch: {
    count(newVal) {
      console.log('Count changed:', newVal);
    }
  },
  mounted() {
    console.log('Component mounted');
  }
};

Composition API (новый способ)

import { ref, computed, watch, onMounted } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const message = ref('Hello');

const doubled = computed(() => count.value * 2);

const increment = () => {
      count.value++;
    };
Читать полностью ->
Для чего нужен Package.json?
1.0 Junior🔥 30💬 1

Для чего нужен Package.json

Package.json — это метаданные и конфигурация Node.js проекта. Это один из самых важных файлов в JavaScript/TypeScript экосистеме. Без него npm/yarn не может управлять зависимостями и скриптами проекта.

Основное назначение

Package.json описывает:

  1. Информацию о проекте (имя, версия, описание)
  2. Зависимости (dependencies и devDependencies)
  3. Scripts — команды для запуска проекта
  4. Конфигурацию инструментов (engines, browserslist, etc)
  5. Метаданные для публикации в npm (если это библиотека)

Структура package.json

Читать полностью ->
Для чего нужен UseState?
1.0 Junior🔥 30💬 1

Для чего нужен UseState?

useState - это хук React, который позволяет добавлять состояние (state) в функциональные компоненты. Это одна из самых важных функций современного React.

Основное назначение

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

const [count, setCount] = useState(0);

Синтаксис

const [value, setValue] = useState(initialValue);

value - текущее значение состояния setValue - функция для обновления состояния initialValue - начальное значение (опционально)

Простой пример

function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>Счётчик: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Увеличить
      </button>
    </div>
  );
}

Управление различными типами данных

Читать полностью ->
Slice или splice мутирует массив
1.0 Junior🔥 30💬 1

Slice или splice мутирует массив

Ответ: SPLICE мутирует, SLICE не мутирует

Это критически важное различие для понимания работы с массивами в JavaScript:

  • slice() — создаёт новый массив, исходный не меняется (immutable)
  • splice() — модифицирует исходный массив (mutable)

Сравнение методов

МетодМутирует оригиналВозвращаетСинтаксис
slice❌ НетНовый массивarray.slice(start, end)
splice✅ ДаУдалённые элементыarray.splice(start, deleteCount, ...items)

slice() — безопасный метод

const original = [1, 2, 3, 4, 5];

// slice() возвращает новый массив
const sliced = original.slice(1, 4);

console.log(sliced);    // [2, 3, 4]
console.log(original);  // [1, 2, 3, 4, 5] — не изменился!
Читать полностью ->
Зачем нужен state в React?
1.3 Junior🔥 30💬 1

Зачем нужен state в React?

State (состояние) — это один из ключевых концептов React. Это объект, который содержит данные, изменяемые во время жизни компонента. Понимание state — необходимо для создания интерактивных приложений.

Основное определение

State — это локальные данные компонента, которые контролируют его поведение и внешний вид. Когда state изменяется, React автоматически перерендеривает компонент, отражая эти изменения в интерфейсе.

Зачем нужен state?

1. Управление динамическими данными

State позволяет компонентам хранить и управлять данными, которые меняются со временем:

function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

Без state каждое нажатие кнопки не повлияло бы на интерфейс.

2. Реактивность пользовательского интерфейса

Читать полностью ->