Когда мы пишем приложения, важно обеспечить их стабильность, расширяемость и простоту поддержки. В этом посте узнаем про принципы SOLID, которые помогают с этим)
Используя SOLID-принципы, вы пишете код, который легче тестировать, поддерживать и развивать.
SOLID — это аббревиатура, которая объединяет 5 принципов:
S - Single Responsibility Principle (Принцип единой ответственности)
Каждый класс или компонент должен отвечать только за одну задачу. Это упрощает тестирование и отладку, потому что если что-то идет не так, вы точно знаете, какой класс или компонент за это отвечает. Такой подход также облегчает расширение приложения, так как изменение в одном месте не затронет другие части.
O - Open/Closed Principle (Принцип открытости/закрытости)
Классы должны быть открыты для расширения, но закрыты для модификации. Это означает, что вы можете добавлять новый функционал, не изменяя существующий код. Это достигается через использование абстракций, таких как интерфейсы и наследование.
L - Liskov Substitution Principle (Принцип подстановки Лисков)
Объекты базового класса должны быть заменяемыми объектами производного класса без нарушения корректности программы. Другими словами, наследуемые классы должны вести себя как их базовые классы, чтобы не ломать логику приложения.
I - Interface Segregation Principle (Принцип разделения интерфейсов)
Не стоит создавать универсальные интерфейсы, которые будут иметь множество методов, не используемых в разных классах. Лучше создавать несколько более специализированных интерфейсов. Это уменьшает зависимость классов и облегчает поддержку кода.
D - Dependency Inversion Principle (Принцип инверсии зависимостей)
Высокоуровневые модули не должны зависеть от низкоуровневых, а обе эти категории должны зависеть от абстракций. Это позволяет сделать код гибким и менее зависимым от конкретных реализаций.
Применение этих принципов поможет писать более чистый и поддерживаемый код, который будет легко расширяться и адаптироваться под изменения.
#BestPractices
Используя SOLID-принципы, вы пишете код, который легче тестировать, поддерживать и развивать.
SOLID — это аббревиатура, которая объединяет 5 принципов:
S - Single Responsibility Principle (Принцип единой ответственности)
Каждый класс или компонент должен отвечать только за одну задачу. Это упрощает тестирование и отладку, потому что если что-то идет не так, вы точно знаете, какой класс или компонент за это отвечает. Такой подход также облегчает расширение приложения, так как изменение в одном месте не затронет другие части.
O - Open/Closed Principle (Принцип открытости/закрытости)
Классы должны быть открыты для расширения, но закрыты для модификации. Это означает, что вы можете добавлять новый функционал, не изменяя существующий код. Это достигается через использование абстракций, таких как интерфейсы и наследование.
L - Liskov Substitution Principle (Принцип подстановки Лисков)
Объекты базового класса должны быть заменяемыми объектами производного класса без нарушения корректности программы. Другими словами, наследуемые классы должны вести себя как их базовые классы, чтобы не ломать логику приложения.
I - Interface Segregation Principle (Принцип разделения интерфейсов)
Не стоит создавать универсальные интерфейсы, которые будут иметь множество методов, не используемых в разных классах. Лучше создавать несколько более специализированных интерфейсов. Это уменьшает зависимость классов и облегчает поддержку кода.
D - Dependency Inversion Principle (Принцип инверсии зависимостей)
Высокоуровневые модули не должны зависеть от низкоуровневых, а обе эти категории должны зависеть от абстракций. Это позволяет сделать код гибким и менее зависимым от конкретных реализаций.
Применение этих принципов поможет писать более чистый и поддерживаемый код, который будет легко расширяться и адаптироваться под изменения.
#BestPractices
🔥15👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15 5
Всем привет!
Начнем эту неделю с мемов и настроимся на продуктивную рабочую неделю🖥
А я начну неделю с дейоффа😀
Начнем эту неделю с мемов и настроимся на продуктивную рабочую неделю
А я начну неделю с дейоффа
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🔥3
Сегодня у нас очередная задача с собеседования, связанная с рекурсией)
Задача:
Нужно распарсить вложенный объект, чтобы получить значение самого глубокого уровня.
Пример вызова функции:
Решение:
1.
2. Берём первое значение —
3. Если это значение — не объект, возвращаем его.
4. Если это объект, вызываем
Для кого-то эта задача может показаться совсем простой, но на практике некоторые мидлы задумываются над ней.
#interview #JavaScript
Задача:
Нужно распарсить вложенный объект, чтобы получить значение самого глубокого уровня.
Пример вызова функции:
const obj = { red: { fast: { fancy: { car: "lamba" } } } };
console.log(objParse(obj)); // "lamba"
Решение:
function objParse(obj) {
const [value] = Object.values(obj); // 1, 2
if (typeof value !== "object") { // 3
return value;
}
return objParse(value); // 4
}
1.
Object.values(obj) возвращает массив всех значений объекта. 2. Берём первое значение —
value.3. Если это значение — не объект, возвращаем его.
4. Если это объект, вызываем
objParse рекурсивно.Для кого-то эта задача может показаться совсем простой, но на практике некоторые мидлы задумываются над ней.
#interview #JavaScript
🔥9👍4
Работа с API, кэширование, обновление данных и обработка ошибок — всё это неизбежно возникает в любом приложении. На выбор у нас есть много подходов и инструментов. Один из таких — React Query.
Что такое React Query?
Это библиотека для управления данными в React-приложениях. Она помогает работать с запросами и решает типичные задачи, связанные с их загрузкой, кэшированием, обновлением и обработкой ошибок.
Какие проблемы решает?
1. Вместо написания шаблонного кода для запросов, состояний и обработки ошибок — можно использовать готовые хуки.
2. Данные автоматически кэшируются, и повторные запросы выполняются только при необходимости.
3. Готовые состояния и возможность легко повторить запрос.
4. Минимизирует количество запросов к API за счет кэширования и умной стратегии обновления.
5. Реализация сложных сценариев становится проще.
Как использовать React Query?
1. Установите библиотеку в проект:
2.Оберните приложение в
3. Используйте хуки:
Преимущества React Query
- Автоматическое кэширование и минимизация запросов.
- Простая обработка ошибок и состояний.
- Гибкость и удобство настройки под любые задачи.
Когда использовать React Query?
- Если проект работает с API.
- Если нужно кэшировать данные и минимизировать количество запросов.
#react #api
Что такое React Query?
Это библиотека для управления данными в React-приложениях. Она помогает работать с запросами и решает типичные задачи, связанные с их загрузкой, кэшированием, обновлением и обработкой ошибок.
Какие проблемы решает?
1. Вместо написания шаблонного кода для запросов, состояний и обработки ошибок — можно использовать готовые хуки.
2. Данные автоматически кэшируются, и повторные запросы выполняются только при необходимости.
3. Готовые состояния и возможность легко повторить запрос.
4. Минимизирует количество запросов к API за счет кэширования и умной стратегии обновления.
5. Реализация сложных сценариев становится проще.
Как использовать React Query?
1. Установите библиотеку в проект:
npm install @tanstack/react-query
2.Оберните приложение в
QueryClientProvider:
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<Component />
</QueryClientProvider>
);
}
3. Используйте хуки:
useQuery для загрузки данных:
const { data, isLoading, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
});
useMutation для изменения данных:
const { mutate } = useMutation({
mutationFn: updateTodo,
});
mutate({ id: 1, text: 'Updated Todo' });
Преимущества React Query
- Автоматическое кэширование и минимизация запросов.
- Простая обработка ошибок и состояний.
- Гибкость и удобство настройки под любые задачи.
Когда использовать React Query?
- Если проект работает с API.
- Если нужно кэшировать данные и минимизировать количество запросов.
#react #api
👏7👍3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Вы наверняка видели OTP-поля для ввода кодов. А знаете, как они делаются?
Сегодня разберёмся, как они делаются с помощью атрибута
Что делает атрибут size?
Атрибут
Поле будет визуально рассчитано примерно на 6 символов.
Пример
Один из частых кейсов — OTP-поля. Мы хотим, чтобы каждое поле занимало ровно одно место:
1. Атрибут
2.
Демо: CodePen
Ограничения и фишки:
1. Работает с типами:
2. Не ограничивает ввод — для этого есть
3. CSS
#HTML #CSS #BestPractices
Сегодня разберёмся, как они делаются с помощью атрибута
size.Что делает атрибут size?
Атрибут
size указывает примерное количество видимых символов в поле ввода. Это влияет только на ширину, но не ограничивает количество вводимых символов.
<input type="text" size="6">
Поле будет визуально рассчитано примерно на 6 символов.
Пример
Один из частых кейсов — OTP-поля. Мы хотим, чтобы каждое поле занимало ровно одно место:
<input type="text" size="1" maxlength="1">
<input type="text" size="1" maxlength="1">
<input type="text" size="1" maxlength="1">
<input type="text" size="1" maxlength="1">
1. Атрибут
size="1" делает поле под один символ. 2.
maxlength="1" ограничивает ввод до одного символа.Демо: CodePen
Ограничения и фишки:
1. Работает с типами:
text, search, tel, url, email, password2. Не ограничивает ввод — для этого есть
maxlength3. CSS
width перекроет size, если задать оба#HTML #CSS #BestPractices
👍9❤2
Использовали атрибут inert?
Этот атрибут позволяет отключить часть интерфейса от взаимодействия — элементы становятся недоступными для клика, фокуса и скринридеров.
Что делает inert?
Атрибут удаляет элемент из порядка навигации — кликнуть, сфокусироваться или ввести данные внутри него нельзя.
Поведение похоже на
—
— В отличие от
💻 Пример использования:
Стилизация элементов🖼️
Делаем элементы чуть прозрачными, чтобы показать, что они неактивны.
Добавляем через JS🖼️
Когда использовать?
1. Модальные окна — чтобы отключить остальной интерфейс при открытой модалке
2. Загрузка данных — временно блокировать зону, пока грузятся данные
3. Сложные формы — делать часть формы неактивной до выполнения условий
Поддержка браузерами: CanIUse
#HTML #accessibility
Этот атрибут позволяет отключить часть интерфейса от взаимодействия — элементы становятся недоступными для клика, фокуса и скринридеров.
Что делает inert?
Атрибут удаляет элемент из порядка навигации — кликнуть, сфокусироваться или ввести данные внутри него нельзя.
Поведение похоже на
disabled, но есть важные отличия:—
inert можно применить к любым элементам— В отличие от
disabled, текст внутри inert нельзя выделить, и он не реагирует на кастомные эффекты наведения или фокуса
<main inert>
<!-- Здесь всё будет неактивно -->
</main>
Стилизация элементов
inert не влияет на стили по умолчанию — нужно самостоятельно делать элементы визуально неактивными, например:
[inert] {
opacity 0.7;
}
Делаем элементы чуть прозрачными, чтобы показать, что они неактивны.
Добавляем через JS
const element = document.body;
// Добавляем inert
element.inert = true;
// Удаляем inert
element.inert = false;
Когда использовать?
1. Модальные окна — чтобы отключить остальной интерфейс при открытой модалке
2. Загрузка данных — временно блокировать зону, пока грузятся данные
3. Сложные формы — делать часть формы неактивной до выполнения условий
Поддержка браузерами: CanIUse
#HTML #accessibility
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3👏1
Недавно мы разбирали(тык) работу с ошибками в JS.
Сегодня рассмотрим создание кастомных ошибок. Они позволяют точнее описывать, что именно пошло не так, и обрабатывать ошибки более точечно.
Вместо обычного
Что происходит?
1. Мы наследуемся от встроенного
2. Функция
3. В блоке
4. В блоке
Зачем это нужно?
1. Проще различать типы ошибок
2. Можно точечно обрабатывать нужные ошибки с помощью
3. Можно сделать более детальные ошибки.
#JavaScript #BestPractices
Сегодня рассмотрим создание кастомных ошибок. Они позволяют точнее описывать, что именно пошло не так, и обрабатывать ошибки более точечно.
Вместо обычного
Error можно создать свой класс, унаследованный от него:
class ValidationError extends Error { // 1
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
function validateUser(user) { // 2
if (!user.name) {
throw new ValidationError("Поле 'name' обязательно");
}
}
try {
validateUser({}); // 3
} catch (error) {
if (error instanceof ValidationError) { // 4
console.error("Ошибка валидации:", error.message);
} else {
throw error;
}
}
Что происходит?
1. Мы наследуемся от встроенного
Error, чтобы определить новый тип ошибки — ValidationError.2. Функция
validateUser проверяет, есть ли у объекта поле name. Если его нет — выбрасывает кастомную ошибку ValidationError с понятным сообщением.3. В блоке
try вызываем validateUser, передавая объект без name.4. В блоке
catch ловим ошибку и проверяем, является ли она экземпляром ValidationError с помощью instanceof.Зачем это нужно?
1. Проще различать типы ошибок
2. Можно точечно обрабатывать нужные ошибки с помощью
instanceof.3. Можно сделать более детальные ошибки.
#JavaScript #BestPractices
👍11🔥3👏1
Привет! Начнем эту 3-дневную рабочую неделю с небольшой алгоритмической задачи.
Задача
Напишите функцию, которая возвращает массив уникальных значений, отсортированных:
1. по количеству повторений (по убыванию),
2. если количество совпадает — по алфавиту.
Пример входных данных:
Ожидаемый результат:
Решение:
Разбор:
1. Сначала считаем количество повторений через объект
2. Сортируем ключи — по убыванию количества, а при равенстве — по алфавиту.
Часто в подобных задачах просят не только написать решение, но и посчитать сложность алгоритма.
Предлагаю вам самим попробовать оценить её и, если есть желание, поделиться в комментариях или в нашем чате)
#interview #JavaScript
Задача
Напишите функцию, которая возвращает массив уникальных значений, отсортированных:
1. по количеству повторений (по убыванию),
2. если количество совпадает — по алфавиту.
Пример входных данных:
const words = [
'banana', 'grapefruit', 'banana', 'grapefruit',
'banana', 'orange', 'banana', 'grapefruit',
'grapefruit', 'grapefruit'
];
Ожидаемый результат:
['grapefruit', 'banana', 'orange']
Решение:
function getSortedUnique(words) {
const freq = {};
for (let word of words) {
freq[word] = (freq[word] || 0) + 1;
}
return Object.keys(freq).sort((a, b) => {
if (freq[b] !== freq[a]) {
return freq[b] - freq[a]; // по убыванию частоты
}
return a.localeCompare(b); // по алфавиту
});
}
Разбор:
1. Сначала считаем количество повторений через объект
freq.2. Сортируем ключи — по убыванию количества, а при равенстве — по алфавиту.
Часто в подобных задачах просят не только написать решение, но и посчитать сложность алгоритма.
Предлагаю вам самим попробовать оценить её и, если есть желание, поделиться в комментариях или в нашем чате)
#interview #JavaScript
👍10🔥4🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
Когда-нибудь использовали CSS-функцию
Что это такое?
Раньше она работала только в
Пример:
Полный пример можно посмотреть на CodePen(тык)
Поддержка в других свойствах
Есть экспериментальная поддержка использования
Функция принимает до 3 параметров:
1. Имя атрибута
2. Тип единицы измерения
3. Опциональное значение по умолчанию
Поддержка в content: CanIUse
Поддержка во всех свойствах: CanIUse
#CSS #HTML
attr? С помощью этой функции мы можем подставлять значения HTML-атрибутов прямо в стили.Что это такое?
attr() — CSS-функция, которая извлекает значение HTML-атрибута и подставляет его в стиль или содержимое. Раньше она работала только в
content, теперь экспериментально доступна и в других свойствах.Пример:
<button class="tooltip-btn" data-tooltip="Удалить файл">Удалить</button>
.tooltip-btn::after {
content: attr(data-tooltip);
}
Полный пример можно посмотреть на CodePen(тык)
Поддержка в других свойствах
Есть экспериментальная поддержка использования
attr в таких свойствах, как width, height, margin и др. Пример:
<div data-width="150" data-height="150"></div>
div {
width: attr(data-width px, 100px);
height: attr(data-height px, 100px);
}
Функция принимает до 3 параметров:
1. Имя атрибута
2. Тип единицы измерения
3. Опциональное значение по умолчанию
Поддержка в content: CanIUse
Поддержка во всех свойствах: CanIUse
#CSS #HTML
🔥9👍4
Привет! Отдохнули? Начнем неделю с 🖼️
Каждый из нас работает с TypeScript, но не все знают про оператор
Пример
- Проверяет, что
- Сохраняет конкретный тип значения и позволяет работать с ними без дополнительных проверок
Пример без satisfies:
Тут мы тоже проверяем объект на соответствие интерфейсу, но мы вынуждены использовать дополнительную проверку или явно указывать значение, так как в значении у нас будет тип из объединения.
Это реально крутой оператор, который позволяет работать с конкретными значениями и при этом обеспечивает полноценную проверку типов. Обязательно попробуйте использовать его в своём коде)
#typescript
Каждый из нас работает с TypeScript, но не все знают про оператор
satisfies. Он помогает гарантировать, что объект соответствует нужному типу, сохраняя при этом точный тип значения.Пример
type ButtonTypes = 'primary' | 'secondary';
type ButtonSizes = 'small' | 'big' | number;
interface ButtonConfig {
type: ButtonTypes;
size: ButtonSizes;
}
const button = {
type: 'primary', // тип "primary"
size: 'big' // тип "big"
} satisfies ButtonConfig;
const button2 = {
type: 'secondary', // тип "secondary"
size: 100 // тип "number"
} satisfies ButtonConfig;
console.log(button.size);
console.log(button2.size.toFixed(0));
- Проверяет, что
type и size соответствуют интерфейсу ButtonConfig- Сохраняет конкретный тип значения и позволяет работать с ними без дополнительных проверок
Пример без satisfies:
type ButtonTypes = 'primary' | 'secondary';
type ButtonSizes = 'small' | 'big' | number;
interface ButtonConfig {
type: ButtonTypes;
size: ButtonSizes;
}
const button: ButtonConfig = {
type: 'primary', // тип "ButtonTypes"
size: 'big' // Тип "ButtonSizes"
};
if (typeof button.size === 'number') {
console.log(button.size.toFixed(0));
}
Тут мы тоже проверяем объект на соответствие интерфейсу, но мы вынуждены использовать дополнительную проверку или явно указывать значение, так как в значении у нас будет тип из объединения.
Это реально крутой оператор, который позволяет работать с конкретными значениями и при этом обеспечивает полноценную проверку типов. Обязательно попробуйте использовать его в своём коде)
#typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡8👍5❤2
В CSS появилось новое экспериментальное свойство:
Что и для чего?
Свойство
Мы указываеем точку привязки, а другие элементы могут позиционироваться относительно неё.
Пример работы
1. Якорь объявляется на элементе:
2. Позиционируемый элемент связывается с этим якорем:
3. Чтобы задать положение относительно якоря, применяется функция
Важно
— Якорь должен быть объявлен раньше в DOM, чем элемент, который к нему привязывается.
— Якорь должен быть видимым и доступным визуально.
Поддержка браузерами: CanIUse
#CSS
anchor-name. Оно позволяет задавать якорь, к которому можно привязывать другие элементы через CSS.Что и для чего?
Свойство
anchor-name позволяет задать якорь для элемента. Этот якорь может быть использован другими элементами для позиционирования.Мы указываеем точку привязки, а другие элементы могут позиционироваться относительно неё.
Пример работы
1. Якорь объявляется на элементе:
.anchor { anchor-name: --info; }
2. Позиционируемый элемент связывается с этим якорем:
.tooltip {
position: absolute;
position-anchor: --info;
}
3. Чтобы задать положение относительно якоря, применяется функция
anchor
.tooltip {
left: anchor(right);
top: anchor(top);
}
Важно
— Якорь должен быть объявлен раньше в DOM, чем элемент, который к нему привязывается.
— Якорь должен быть видимым и доступным визуально.
Поддержка браузерами: CanIUse
#CSS
🔥7
Закончим неделю на CSS 🖼️
Иногда нужно стилизовать элемент только если он единственный в родителе. В CSS это можно сделать с помощью псевдокласса
Как он работает?
Это псевдокласс выбирает элемент, если он единственный потомок родителя.
Пример:
Стиль применится только если в блок с классом
Стилизация родителя
Псевдокласс
Стиль применитсяк родителю, если у него только один потомок.
Поддержка:
-
-
В этом посте я привёл только один вариант комбинации, но их намного больше. Пробуйте и экспериментируйте🗒
#CSS
Иногда нужно стилизовать элемент только если он единственный в родителе. В CSS это можно сделать с помощью псевдокласса
:only-child.Как он работает?
Это псевдокласс выбирает элемент, если он единственный потомок родителя.
Пример:
.parent > div:only-child {
background-color: blue;
}
Стиль применится только если в блок с классом
.parent будет один div.Стилизация родителя
Псевдокласс
:only-child позволяет находить потомков, но иногда нам нужно стилизовать их родителя. Для этого можно комбинировать с псевдоклассом :has().
.parent:has(:only-child) {
background-color: red;
}
Стиль применитсяк родителю, если у него только один потомок.
Поддержка:
-
:only-child: Can I Use-
:has: Can I UseВ этом посте я привёл только один вариант комбинации, но их намного больше. Пробуйте и экспериментируйте
#CSS
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5👏1
Привет! Начнем неделю с задачи которой со мной поделился коллега.
Задача:
Написать порядок вывода в консоль и объяснить.
Решение:
Всего у нас будет 2 рендера, так как в коде есть
1.
2.
3.
4.
5.
6.
7.
8.
Такой порядок из-за работы React:
-
-
- Функции очистки вызываются перед повторным выполнением эффекта или при размонтировании компонента.
#react #interview
Задача:
Написать порядок вывода в консоль и объяснить.
Решение:
Всего у нас будет 2 рендера, так как в коде есть
useEffect, который меняет состояние после первого рендера.1.
App — компонент рендерится, выводится лог.2.
useLayoutEffect — этот эффект срабатывает синхронно после обновления DOM.3.
useEffect — эффект после отрисовки интерфейса.4.
App — повторный рендер компонента из-за обновления состояния.5.
useEffect cleanup — очистка эффекта useEffect с предыдущего рендера.6.
useLayoutEffect cleanup — очистка эффекта useLayoutEffect с предыдущего рендера.7.
useLayoutEffect — повторное выполнение синхронного эффекта с обновлённым состоянием.8.
useEffect — повторное выполнение асинхронного эффекта с обновлённым состоянием.Такой порядок из-за работы React:
-
useLayoutEffect вызывается после обновления DOM, но до того, как браузер нарисует изменения на экране.-
useEffect выполняется после отрисовки.- Функции очистки вызываются перед повторным выполнением эффекта или при размонтировании компонента.
#react #interview
👏13👍6🔥1
На фронтенде производительность — ключевой фактор для хорошего пользовательского опыта. Чем быстрее загружается и работает приложение, тем лучше.
Одним из инструментов оптимизации является динамический импорт. Он позволяет загружать модули только тогда, когда они действительно нужны.
Как это?
Вместо статического импорта:
Используем динамический:
Здесь модуль
Зачем?
- Ускоряет загрузку.
- Уменьшает размер основного бандла.
Импорт в React
В React для динамической загрузки компонентов есть
Здесь
Когда стоит использовать?
Например, если в приложении есть библиотека для работы с PDF, которую что-то делает по клику на кнопку, то нет смысла грузить её сразу. Такие библиотеки обычно тяжёлые, и динамическая загрузка позволяет сэкономить время и ресурсы.
Не забывайте, что никто не любит ждать. Если ваш сайт долго загружается, пользователь просто уйдёт к конкурентам
#BestPractices #react #JavaScript
Одним из инструментов оптимизации является динамический импорт. Он позволяет загружать модули только тогда, когда они действительно нужны.
Как это?
Вместо статического импорта:
import { heavyFunc } from './heavyModule.js';
button.addEventListener('click', () => {
heavyFunc();
});
Используем динамический:
button.addEventListener('click', async () => {
const module = await import('./heavyModule.js');
module.heavyFunc();
});
Здесь модуль
heavyModule.js загрузится только после клика по кнопке, а не сразу при загрузке страницы. Зачем?
- Ускоряет загрузку.
- Уменьшает размер основного бандла.
Импорт в React
В React для динамической загрузки компонентов есть
React.lazy.
import React, { Suspense } from 'react';
const LazyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
);
}
Здесь
MyComponent загрузится только при первом рендере LazyComponent.Когда стоит использовать?
Например, если в приложении есть библиотека для работы с PDF, которую что-то делает по клику на кнопку, то нет смысла грузить её сразу. Такие библиотеки обычно тяжёлые, и динамическая загрузка позволяет сэкономить время и ресурсы.
Не забывайте, что никто не любит ждать. Если ваш сайт долго загружается, пользователь просто уйдёт к конкурентам
#BestPractices #react #JavaScript
🔥7❤3👍3