Frontend Tasks Flashcards

(153 cards)

1
Q
A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Как работает браузер при вводе запроса и этапы рендера

A

Поиск в кэше: Браузер проверяет свой кэш, чтобы узнать, есть ли уже соответствие между доменом и IP-адресом.
Если в кэше браузера нет записи, запрос отправляется в операционную систему. ОС проверяет файл hosts, который может содержать статические записи доменов и IP-адресов.
Запрос к DNS серверу: Если и в файле hosts нет записи, браузер отправляет запрос на DNS-сервер, чтобы получить соответствие домену. DNS-сервер возвращает IP-адрес, который браузер сохраняет в кэш на определённое время.
Установка соединения через TCP (трехстороннее рукопожатие)
рукопожатие (TCP handshake):
SYN: Клиент отправляет запрос на установление соединения с сервером.
SYN-ACK: Сервер отвечает подтверждением на запрос клиента.
ACK: Клиент подтверждает получение ответа, соединение установлено.
Это согласование позволяет установить параметры соединения, такие как скорость и размер пакетов.
Отправка HTTP-запроса
Когда соединение установлено, браузер отправляет HTTP GET-запрос на сервер для получения запрашиваемого ресурса (обычно HTML-документа).
Получение и парсинг HTML
Когда сервер отправляет HTML-документ в ответ на запрос, браузер начинает его парсить и строить DOM (Document Object Model) дерево — структуру, представляющую HTML-страницу как объектную модель.

Загрузка и парсинг CSS и JS
CSS: В процессе парсинга HTML браузер начинает загружать и парсить файлы CSS, создавая CSSOM (CSS Object Model) — модель стилей, которая содержит информацию о том, как стили применяются к элементам на странице.

JS: Когда браузер встречает тег

, он должен выполнить JavaScript код. Скрипты могут блокировать дальнейший рендеринг страницы, так как они могут изменять DOM или CSSOM, поэтому JavaScript код выполняется синхронно до продолжения рендеринга.

Важно: Если скрипты добавляются с атрибутом async или defer, они не блокируют рендеринг, так как выполняются после загрузки страницы.

Формирование Render Tree (Дерево рендеринга)
На основе DOM и CSSOM браузер строит render tree — дерево рендеринга, которое описывает, как элементы будут отображаться на экране. Это дерево включает в себя визуальные элементы (например, блоки, изображения, текст), но не включает элементы, которые не отображаются (например, <head>, display: none).

Layout (Позиционирование элементов)
На этом этапе браузер рассчитывает расположение каждого элемента на странице:

Браузер вычисляет положение элементов (например, с помощью моделей коробок — box model) и их размеры (ширина, высота).
Рассчитываются отступы (margin), границы (border), внутренние отступы (padding), а также позиционирование элементов на странице.
Этап layout необходим для того, чтобы точно определить, где и как должны располагаться элементы на экране.

Painting (Отрисовка)
На этапе painting браузер “рисует” каждый элемент на экране, основываясь на данных из дерева рендеринга. Это включает в себя отображение цветов, текстур, шрифтов, границ и других визуальных свойств.

Каждый элемент “рисуется” с учётом его стилей, а текст может быть нарисован как отдельные строки или блоки.
Composition (Составление слоёв)
Когда элементы страницы нарисованы, браузер переходит к последнему этапу — composition. Здесь происходит составление слоёв:

Браузер группирует элементы в слои (layers), чтобы эффективно обработать их. Эти слои могут быть отрисованы независимо, что позволяет ускорить рендеринг.
Важные стили, такие как transform или opacity, могут использоваться для переноса элементов на GPU для дальнейшей обработки, чтобы разгрузить процессор.
На этом этапе браузер может оптимизировать рендеринг, отправив слои на видеокарту для отрисовки.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Отличия any и unknown в TypeScript

A

Тип any используется, когда вы хотите указать, что значение может быть любым типом.
Преимущества использования any
Гибкость:
Удобство:
Недостатки использования any
Потеря типовой безопасности:
Усложнение поддержки кода

Тип unknown — это более безопасная альтернатива any. С unknown вы по-прежнему можете работать с переменной любого типа, но для этого необходимо проверить её тип перед выполнением операций с ней. То есть, в отличие от any, с переменной типа unknown не получится выполнять операции без проверки её типа.

Преимущества использования unknown
Типовая безопасность: хотя unknown позволяет работать с любыми типами, при этом компилятор TypeScript требует, чтобы вы выполнили проверку типа перед тем, как выполнить какие-либо операции с значением.
Является более безопасным выбором:
Не такая гибкость как у any: перед использованием переменной типа unknown требуется выполнить проверку её типа, что добавляет дополнительный код.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Как работает keyof и typeof в TypeScript

A

keyof и typeof — это два оператора в TypeScript, которые используются для работы с типами данных и для улучшения типизации. Они позволяют работать с типами объектов и переменных, а также извлекать ключи и типы из существующих значений.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Строгий режим (strict mode) в JavaScript

A

Строгий режим (strict mode) в JavaScript — это специальный режим работы, который помогает писать более безопасный и качественный код. Включив его, вы активируете дополнительные проверки и ограничения, которые предотвращают распространённые ошибки.
Что меняет строгий режим?
Запрещает использование необъявленных переменных.
Запрещает удаление переменных, функций или объектов.
Ограничивает работу с this в функциях. Без строгого режима:

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Set, Map, WeakSet и WeakMap

A

Set— это коллекция уникальных значений, где каждое значение может появляться только один раз.
Хранит только уникальные значения.
Значения могут быть любого типа.
Неупорядоченная структура
Map — это коллекция пар ключ-значение, где ключи могут быть любого типа.
Упорядоченная структура.
Позволяет использовать объекты в качестве ключей.
WeakSet — это коллекция, в которой хранятся только объекты. Эти объекты являются слабо-ссылаемыми, что позволяет сборщику мусора удалять их, если на них нет других ссылок.
Хранит только объекты.
Нельзя получить размер или перебрать элементы.
Используется для временного хранения объектов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Как работает Event Loop?

A

Event Loop — это механизм в JavaScript, который управляет асинхронными задачами и очередями событий. Он позволяет JavaScript работать в однопоточной модели, обрабатывая асинхронные операции, не блокируя основной поток выполнения.

Как работает Event Loop?
Event Loop — это бесконечный цикл, в котором выполняются обработчики событий. В процессе его работы браузер распределяет задачи по двум основным очередям:

Микротаски — это задачи, такие как промисы, queueMicrotask(), MutationObserver.
Макротаски — это задачи, такие как setTimeout, события, таймеры, запросы fetch.
Основной порядок выполнения
Сначала выполняются все синхронные задачи из стека вызовов (Call Stack).
Затем выполняются все задачи из очереди микротасков. Все микротаски будут выполнены до того, как будет взята следующая макрозадача. Микротаски блокируют Event Loop, пока все не будут выполнены.
После выполнения всех микротасков очередь очищается.
Далее из очереди макротасков берется одна макрозадача и выполняется. Макрозадачи, такие как setTimeout, ждут, пока все синхронные задачи и микротаски будут завершены.
После выполнения макрозадачи проверяется, нужно ли выполнить перерисовку страницы. Если необходимо, браузер выполняет рендеринг.
Повторный цикл. Event Loop продолжает обрабатывать задачи, пока не закончится выполнение всех операций.
Структуры данных
Call Stack (LIFO — Last In, First Out):

Стек вызовов содержит все функции, которые выполняются в текущий момент.
Когда вызывается функция, она добавляется в стек. Если внутри функции вызывается другая функция, она тоже добавляется в стек.
После выполнения функции она удаляется из стека.
Web API:

Асинхронные операции, такие как setTimeout, обработчики событий, запросы fetch, попадают в Web API.
После завершения работы асинхронной задачи, она не сразу попадает в Call Stack. Вместо этого она помещается в Callback Queue (очередь обратных вызовов).
Callback Queue (FIFO — First In, First Out):

Здесь хранятся функции, которые должны быть выполнены после того, как стек вызовов окажется пустым.
Когда стек вызовов очищается, Event Loop перемещает задачи из Callback Queue в Call Stack и выполняет их.
Микротаски vs. Макротаски
Макротаски:

Пример: setTimeout, события (onClick, onChange), запросы fetch.
Эти задачи обрабатываются в порядке очереди, одна за другой, после того как выполняются все синхронные задачи и микротаски.
Микротаски:

Пример: промисы, queueMicrotask(), MutationObserver.
Микротаски выполняются сразу после выполнения синхронных операций и до выполнения макротасок.
Все микротаски из очереди выполняются перед следующими макрозадачами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Промисы в JavaScript

A

Promise — это функция-конструктор, которая используется для создания промисов в JavaScript. Промис представляет собой объект, который позволяет работать с асинхронными операциями и выполнять их без блокировки основного потока выполнения.
Promise.all() используется для выполнения нескольких промисов параллельно и возвращает новый промис, который выполнится, когда все промисы из массива завершатся успешно. Если хотя бы один промис отклонится, результат будет отклонен с ошибкой того промиса, который отклонился.
Promise.race() принимает массив промисов и возвращает новый промис, который завершится как только завершится первый из промисов в массиве (независимо от того, был ли он выполнен успешно или с ошибкой).
Promise.allSettled() выполняет все промисы в массиве и возвращает результат для каждого, независимо от того, были ли они выполнены или отклонены.
Promise.any() возвращает новый промис, который выполнится, как только первый промис из массива завершится успешно. Если все промисы отклоняются, он отклонится с ошибкой.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое проваливание промисов (Promise Chaining)

A

— это механизм, при котором каждый .then() возвращает новый промис, позволяя выстраивать цепочку асинхронных операций.

fetch(“/user.json”)
.then(response => response.json()) // промис №1
.then(user => fetch(/users/${user.id})) // промис №2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое прототип?

A

— это объект, к которому обращается любой другой объект в случае, если у него нет искомого свойства или метода. Если при обращении к свойству его нет в самом объекте, интерпретатор будет «подниматься» снизу-вверх по цепочке прототипов (prototype chain), пока не найдёт нужное свойство или не достигнет объекта null.
— это механизм, позволяющий одним объектам наследовать свойства и методы других объектов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое объект Proxy в JavaScript

A

Proxy — это встроенный объект в JavaScript, позволяющий перехватывать и переопределять поведение других объектов. Вы можете «обернуть» объект и управлять доступом к его свойствам, их изменением, удалением, вызовом функций и многим другим.

Проще говоря, Proxy — это как «прослойка» между объектом и его использованием.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Лексическое окружение (Lexical Environment) в JavaScript

A

Лексическое окружение (Lexical Environment) — это внутренняя структура, которая используется движком JavaScript для хранения переменных, объявленных в определённой области видимости, а также для определения того, где и как эти переменные можно использовать.

Каждая функция, блок {}, и глобальная область создают своё лексическое окружение при выполнении.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Статические методы в JavaScript (Static Methods)

A

— это методы, которые определяются на уровне класса и доступны только через сам класс, а не через его экземпляры. Такие методы предназначены для реализации функциональности, которая не зависит от состояния конкретного объекта, и обычно используются для утилитарных операций,

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое каррирование (Currying)

A

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

Зачем нужно каррирование?
Переиспользуемость: можно заранее зафиксировать часть аргументов.
Чистота функций: каррированные функции легче тестировать и комбинировать.
Функциональный стиль: часто применяется в функциональном программировании.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Отличие event.target и event.currentTarget

A

event.target — элемент, на котором фактически произошло событие. Это может быть вложенный элемент.
event.currentTarget — элемент, на котором висит обработчик события

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Разница между оператором in и методом hasOwnProperty()

A

in — оператор, проверяющий всё (включая унаследованные свойства).
.hasOwnProperty() — метод объекта, проверяющий только собственные свойства.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Что такое делегирование событий?

A

— это техника в JavaScript, при которой обработчик события навешивается на родительский элемент, а не на каждый дочерний элемент отдельно.

<ul>
<li>Главная</li>
<li>О нас</li>
<li>Контакты</li>
</ul>

const menu = document.getElementById(“menu”);

menu.addEventListener(“click”, (event) => {
const target = event.target;

if (target.tagName === “LI”) {
console.log(“Вы кликнули по пункту:”, target.textContent);
}
});

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое генераторы в JavaScript?

A

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

Генераторы определяются с помощью function* и управляются через метод .next().

Синтаксис генератора

function* generatorFunction() {
yield ‘Первое значение’;
yield ‘Второе значение’;
return ‘Финал’;
}

const gen = generatorFunction();

console.log(gen.next()); // { value: ‘Первое значение’, done: false }
console.log(gen.next()); // { value: ‘Второе значение’, done: false }
console.log(gen.next()); // { value: ‘Финал’, done: true }
Как работает генератор
yield — ключевое слово, приостанавливает выполнение и возвращает значение.
.next() — возобновляет выполнение с места последнего yield.
done: true — указывает, что генератор завершён.
Отличия от обычных функций
Особенность Обычные функции Генераторы
Возврат значений Только один return Много yield
Промежуточные состояния Нет Да
Управление потоком Нет Да
Использование for..of Нет Да

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое полифил (polyfill)?

A

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

Другими словами: это «заплатка», которая добавляет поддержку нового API там, где её ещё нет.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Зачем нужен оператор instanceof

A

Оператор instanceof в JavaScript проверяет, принадлежит ли объект определённому классу (или функции-конструктору) в его цепочке прототипов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

requestAnimationFrame и requestIdleCallback

A

requestAnimationFrame — это метод браузера, который позволяет выполнить функцию перед следующим перерисовыванием кадра. Используется в основном для создания плавных анимаций и оптимизации рендеринга.
requestIdleCallback — это метод, который позволяет выполнять задачи, когда браузер “свободен” — в периоды простоя.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

CSS Разница между script, async и defer

A

script (без атрибутов)
Скачивается и выполняется сразу, как только до него дойдет парсер HTML.
Блокирует парсинг HTML до завершения выполнения скрипта.
Подходит только для маленьких скриптов в конце страницы.
script async
Скрипт загружается асинхронно и выполняется сразу, как только загрузился.
Не гарантирует порядок выполнения (если несколько async-скриптов).
Подходит для сторонних скриптов (аналитика, реклама).
Поведение:

Не блокирует HTML-парсинг во время загрузки.
Может блокировать рендеринг при выполнении.
script defer
Скрипт загружается асинхронно, но выполняется после полной загрузки HTML.
Сохраняет порядок подключения скриптов.
Идеально для большинства современных приложений.

Поведение:

Не блокирует HTML.
Выполняется после завершения парсинга HTML, но до события DOMContentLoaded.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Что такое Prop Drilling

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

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

A

Жизненный цикл компонента в React — это последовательность этапов, через которые проходит компонент от его создания до удаления из DOM.

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

Этапы жизненного цикла
Жизненный цикл делится на 3 ключевых фазы:

Фаза Описание
Mounting Момент появления компонента в DOM
Updating Обновление компонента при изменениях
Unmounting Удаление компонента из DOM
Методы Mounting-фазы
Метод Когда вызывается
constructor В момент создания компонента
static getDerivedStateFromProps До рендера (редко используется)
render Обязательный метод, возвращает JSX
componentDidMount После монтирования в DOM
Методы Updating-фазы
Метод Когда вызывается
static getDerivedStateFromProps При обновлении пропсов
shouldComponentUpdate Перед ререндером (можно отменить его)
render При каждом обновлении
getSnapshotBeforeUpdate Снимок DOM до обновления
componentDidUpdate После обновления компонента
Метод Unmounting-фазы
Метод Когда вызывается
componentWillUnmount Перед удалением компонента из DOM
Аналоги в функциональных компонентах
Функции-хуки позволяют повторить поведение жизненного цикла:

Классовый метод Хук в функции
componentDidMount useEffect(() => {}, [])
componentDidUpdate useEffect(() => {…}, [dep])
componentWillUnmount useEffect(() => { return () => {…} }, [])
shouldComponentUpdate React.memo() + useCallback, useMemo

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Что такое Portal в React
Portal (портал) — это механизм в React, который позволяет рендерить компонент вне основного DOM-дерева, но при этом он всё равно остаётся частью React-иерархии. Это удобно, когда нужно отобразить модальные окна, тултипы, дропдауны, которые не должны быть вложены в родительские стили (например, overflow: hidden, z-index, transform). Как создать портал? React предоставляет специальный метод: ReactDOM.createPortal(children, container) children — элемент, который нужно отрисовать container — DOM-элемент, в который будет помещён JSX вне текущего дерева Пример использования портала import { createPortal } from 'react-dom'; function Modal({ children }) { return createPortal(
{children}
, document.getElementById('modal-root') // вне корня приложения ); } HTML
Теперь компонент Modal не будет обёрнут родительскими стилями #root, но React по-прежнему будет управлять его состоянием и жизненным циклом.
26
Что такое React.PureComponent
— это специальный тип классового компонента в React, который автоматически реализует метод shouldComponentUpdate() с поверхностным сравнением props и state. Если входные данные (props или state) не изменились, компонент не перерисовывается.
27
React.lazy и Suspense — ленивые компоненты в React
React.lazy и Suspense — это инструменты в React, которые позволяют лениво загружать компоненты, т.е. только тогда, когда они действительно нужны. Это называется code splitting (разделение кода), и оно помогает улучшить производительность приложения. Зачем это нужно? Сокращает время первой загрузки приложения Делит код на отдельные чанки Загружает тяжёлые компоненты по мере необходимости Особенно важно для SPA и мобильных пользователей React.lazy Это функция, которая позволяет динамически импортировать компонент и возвращать его как обычный React-компонент. Синтаксис: const LazyComponent = React.lazy(() => import('./MyComponent')); Что такое Suspense? Так как загрузка ленивого компонента может занять время, React предлагает компонент Suspense, в котором указывается fallback — что показать, пока компонент загружается. Пример Suspense import React, { Suspense } from "react"; const LazyComponent = React.lazy(() => import("./MyComponent")); function App() { return (
Загрузка...
}>
); } Пример с маршрутизацией import { BrowserRouter, Routes, Route } from "react-router-dom"; import React, { lazy, Suspense } from "react"; const Home = lazy(() => import("./pages/Home")); const About = lazy(() => import("./pages/About")); function App() { return ( Загрузка страницы...

}> } /> } />
); } Важно знать Работает только для компонентов по умолчанию. Для других случаев (функции, модули) — используйте import() напрямую. Suspense пока не поддерживает данные (например, загрузку API) — для этого используют React Query, Relay, RSC, или Suspense for data (в будущем). Можно обернуть сразу несколько компонентов в один Suspense. Польза для производительности Без lazy С lazy Загрузка кода Загружается весь бандл Загружаются только нужные части Скорость старта Долгая загрузка Быстрый старт Оптимизация Много неиспользуемого кода Только необходимый код
28
Что такое React.memo и зачем он нужен
— это функция высшего порядка (Higher Order Component, HOC) в React, которая позволяет мемоизировать функциональные компоненты. Она предотвращает лишние ререндеры, если пропсы не изменились. Когда использовать React.memo? Полезен, если: Компонент часто получает одни и те же props Он тяжёлый по вычислениям (например, содержит вложенные списки, графики) Вы хотите избежать лишних ререндеров Не нужен, если: Компонент маленький и простой Props всегда разные (например, функция создаётся заново каждый раз без useCallback) Нет проблем с производительностью
29
Как работает useMemo
— это хук в React, который позволяет мемоизировать значение, то есть сохранить результат вычислений между рендерами, чтобы не пересчитывать его заново без необходимости. Он особенно полезен, если вычисление ресурсоёмкое или зависит от переменных, которые редко меняются. Зачем нужен useMemo Реакт заново вызывает компонент при каждом ререндере, и все вычисления выполняются заново, даже если результат будет тот же. Если функция тяжёлая — это снижает производительность. Важно: useMemo не гарантирует кэш — он может очиститься при низком ресурсе памяти. Это подсказка для оптимизации, а не жёсткое хранилище.
30
Как работает useCallback
— это хук в React, который позволяет мемоизировать (запоминать) функцию между рендерами компонента. Он возвращает ту же версию функции, если зависимости не изменились, и предотвращает создание новой функции при каждом рендере.
31
Зачем нужен useImperativeHandle в React
useImperativeHandle — это хук в React, который позволяет управлять тем, какие методы и свойства будут доступны родителю при использовании ref на дочернем компоненте. Он используется в паре с forwardRef, чтобы настроить внешний интерфейс доступа к внутренним функциям/значениям компонента. Синтаксис useImperativeHandle(ref, () => ({ // методы, которые будут доступны извне someMethod() { // ... }, }), [dependencies]); ref — ссылка, переданная через forwardRef. Функция () => ({...}) возвращает объект с публичным API. [dependencies] — список зависимостей для обновления объекта. Когда нужен useImperativeHandle Когда вы хотите ограничить доступ к внутренним функциям компонента (инкапсуляция). Когда нужно экспонировать методы дочернего компонента родителю (например, focus, reset, scrollToTop и др.). Когда работаете с нестандартными или сложными DOM-элементами, кастомными компонентами, модальными окнами и т.д.
32
Как работает useLayoutEffect в React и чем он отличается от useEffect?
useLayoutEffect — это хук в React, который похож на useEffect, но с одной ключевой разницей: он выполняется сразу после изменений DOM, но до того, как браузер применит изменения и отобразит их на экране. Как работает useLayoutEffect? Синхронный эффект. В отличие от useEffect, который выполняется асинхронно после рендера, useLayoutEffect выполняется синхронно сразу после того, как React обновит DOM, но до того, как браузер нарисует изменения на экране. Это может быть полезно, если вам нужно измерить DOM или выполнить действия, которые могут повлиять на отрисовку. Для работы с DOM. Этот хук чаще используется, когда необходимо сделать что-то с DOM напрямую (например, измерить размеры элементов или применить стили до того, как браузер отобразит обновления). Отличия от useEffect Время выполнения: useEffect выполняется асинхронно после того, как браузер завершит рендеринг и отрисует изменения. useLayoutEffect выполняется синхронно сразу после изменений DOM, но до того, как браузер применит изменения и отобразит их. Использование: useEffect подходит для большинства побочных эффектов, таких как запросы данных или подписки. useLayoutEffect используется, когда необходимо синхронно работать с DOM, например, для измерений или изменений, которые должны произойти до отрисовки. Производительность: useEffect не блокирует рендеринг, так как выполняется после того, как браузер отобразит изменения. useLayoutEffect может блокировать рендеринг, если он выполняет сложные вычисления или операции, которые требуют времени.
33
Что такое Web Workers?
Web Worker — это механизм в JavaScript, который позволяет запускать фоновый поток для выполнения тяжёлых или длительных операций без блокировки основного UI. С помощью Web Workers можно: выполнять сложные вычисления, обрабатывать большие массивы данных, работать с canvas или WebAssembly, и при этом не замораживать интерфейс. Что не умеет Web Worker? Не имеет доступа к DOM Не может обращаться к window, document, alert, localStorage Может работать только через сообщения (message passing)
34
Что такое Service Worker?
Service Worker — это фоновый скрипт, который работает отдельно от основного потока браузера, перехватывает сетевые запросы, управляет кэшированием и обеспечивает офлайн-работу веб-приложений. Он не имеет доступа к DOM, но может: кэшировать ресурсы, обрабатывать сетевые запросы, показывать push-уведомления, выполнять фоновую синхронизацию данных. Зачем нужен? Service Workers используются для: Офлайн-доступа (Progressive Web Apps) Ускорения загрузки через кэш Обработки push-уведомлений Фоновой синхронизации данных Имитации серверного поведения (Mock API) Жизненный цикл Установка (install) — сервис-воркер загружается и подготавливает кэш. Активация (activate) — очищаются старые данные, создаётся новый кэш. Работа (fetch) — перехват и обработка всех запросов, управление кэшем. Удаление — когда не используется, удаляется из браузера.
35
Что такое прогрессивный рендеринг в веб-разработке
— это техника, при которой части контента страницы отображаются по мере их загрузки, а не после полной загрузки всего документа. Цель — сделать сайт или приложение воспринимаемо быстрым: пользователь видит что-то полезное как можно раньше. Почему это важно? Пользователь может начать взаимодействовать со страницей ещё до полной загрузки: Уменьшается First Contentful Paint (FCP) Улучшается восприятие скорости Повышается UX, особенно в условиях плохой сети Основные техники прогрессивного рендеринга Lazy Loading (отложенная загрузка) Загружаем только видимый контент, остальное — по мере прокрутки или запроса. Применяется к изображениям, видео, heavy-компонентам. ... В React: React.lazy, Suspense, dynamic import(). Streaming (HTML Streaming, SSR Streaming) Сервер постепенно отправляет HTML в браузер. Позволяет начать рендер до того, как весь контент будет готов. // Пример в React 18 с SSR streaming import { renderToPipeableStream } from "react-dom/server"; Очень полезно в SSR и больших приложениях. Skeletons и Placeholder'ы Вместо пустых блоков показываются скелеты или заглушки, пока идёт загрузка данных. {isLoading ? : } Progressive Hydration В React/Next.js можно гидратировать только нужные части страницы сначала, остальное позже.