- Интерполяция — для вставки текста;
- Property binding — связывает DOM-свойство с данными;
- Event binding — слушает события;
- Two-way binding — синхронизирует данные и интерфейс (комбинация property + event binding).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
color – одно из самых базовых CSS-свойств, которое отвечает за цвет текста и текста в элементах (например, градиентных фонах и SVG). p {
color: red;
}CSS позволяет задавать цвета несколькими способами
Наследование
color наследуется потомками по умолчанию, в отличие от многих других свойств CSS (например, background). body {
color: blue;
}
p {
color: inherit; /* Явное наследование */
}currentColor — скрытое золотоЭто специальное значение, которое означает "используй текущее значение
color". Очень полезно для стилизации border, box-shadow, outline и SVG. button {
color: red;
border: 2px solid currentColor; /* Использует color */
}transparent — особый цветp {
color: transparent;
}Когда
rgba() или hsla() лучшеp {
color: rgba(255, 0, 0, 0.5); /* Полупрозрачный красный */
}color и mix-blend-modeМожно заставить текст взаимодействовать с фоном с помощью
mix-blend-modeh1 {
color: white;
mix-blend-mode: difference;
}color в ::selection и ::placeholderНекоторые элементы (например, выделенный текст или placeholder в input) требуют отдельного указания
color::selection {
background: blue;
color: white;
}
input::placeholder {
color: gray;
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊4
Можем — но потеряем семантику. <div> не несёт смысловой нагрузки. Семантические теги улучшают SEO, доступность и читаемость кода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1💊11👍9🤔2
React.memo — это функция в React, которая используется для оптимизации производительности функциональных компонентов. Она предотвращает ненужные повторные рендеры, если пропсы компонента не изменились. В React каждый раз, когда родительский компонент обновляется, все его дочерние компоненты тоже ререндерятся, даже если их пропсы остались неизменными. Это может негативно сказаться на производительности, особенно если дочерний компонент выполняет сложные вычисления или рендерит большое количество данных.
React.memo решает эту проблему, запоминая (мемоизируя) предыдущий результат рендера и сравнивая его с новыми пропсами. Если пропсы не изменились, компонент просто использует закэшированное представление, а не ререндерится. React.memo — это функция высшего порядка (HOC), которая оборачивает функциональный компонентimport React from "react";
const MyComponent = ({ value }) => {
console.log("Рендер компонента!");
return <div>Значение: {value}</div>;
};
// Оборачиваем компонент в React.memo
const MemoizedComponent = React.memo(MyComponent);
export default MemoizedComponent;
React.memo vs. с React.memo Допустим, у нас есть родительский компонент, который изменяет состояние при каждом клике
import React, { useState } from "react";
import MemoizedComponent from "./MyComponent";
const Parent = () => {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>Увеличить</button>
<MemoizedComponent value="Привет, мир!" />
</div>
);
};
export default Parent;Если компонент всегда ререндерится из-за изменения пропсов – смысла в
memo нет. Если компонент рендерится быстро – оптимизация может быть ненужной, а проверка пропсов даже замедлит работу.
Если пропсы часто изменяются – кэширование теряет смысл, так как все равно ререндерится.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
- Оптимизировать запросы (индексы, EXPLAIN).
- Архивировать старые данные.
- Разбить таблицы на партиции.
- Использовать репликацию и шардинг.
- Выделить отдельную БД под отчёты.
- Переходить на более масштабируемое хранилище (например, ClickHouse для аналитики).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
Браузер использует HTTP-заголовки и механизмы кэширования, чтобы решить, нужно ли сохранять ресурс (HTML, CSS, JS, изображения) и как долго его хранить.
Когда браузер загружает ресурс, сервер может сказать браузеру, как его кешировать, с помощью HTTP-заголовков.
HTTP/1.1 200 OK
Cache-Control: max-age=3600, public
ETag: "abc123"
Определяет, как долго ресурс должен храниться в кэше.
Cache-Control: max-age=86400, public
Определяет конкретную дату, до которой браузер может использовать кэшированный ресурс.
Expires: Wed, 26 Feb 2025 12:00:00 GMT
Позволяет браузеру узнать, изменился ли файл на сервере.
ETag: "abc123"
Если браузер снова запрашивает ресурс, он отправляет заголовок
If-None-Match: "abc123"
Дата последнего изменения ресурса.
Last-Modified: Tue, 25 Feb 2025 15:30:00 GMT
Браузер может отправить запрос с
If-Modified-Since: Tue, 25 Feb 2025 15:30:00 GMT
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Арифметические (+, -, *, /), логические (&&, ||, !), сравнения (==, ===, >, <), присваивания (=, +=), тернарный (?:), побитовые, typeof, instanceof, delete, new, in и др.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍5💊2
🤔 Как методы будут у api?
В API (Application Programming Interface) обычно используются HTTP-методы, которые определяют, какое действие нужно выполнить с ресурсом (данными).
🚩Примеры использования
🟠`GET` – Получение данных
Запрашиваем список пользователей:
Ответ (JSON)
🟠`POST` – Создание нового ресурса
Отправляем данные нового пользователя:
Ответ (201 Created)
🟠`PUT` – Полное обновление ресурса
Заменяем пользователя с ID
🟠`PATCH` – Частичное обновление ресурса
Меняем только имя пользователя
🟠`DELETE` – Удаление ресурса
Удаляем пользователя с ID
Ставь 👍 и забирай 📚 Базу знаний
В API (Application Programming Interface) обычно используются HTTP-методы, которые определяют, какое действие нужно выполнить с ресурсом (данными).
🚩Примеры использования
🟠`GET` – Получение данных
Запрашиваем список пользователей:
GET /users HTTP/1.1
Host: api.example.com
Ответ (JSON)
[
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
🟠`POST` – Создание нового ресурса
Отправляем данные нового пользователя:
POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Charlie",
"email": "charlie@example.com"
}
Ответ (201 Created)
{
"id": 3,
"name": "Charlie",
"email": "charlie@example.com"
}🟠`PUT` – Полное обновление ресурса
Заменяем пользователя с ID
1:PUT /users/1 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Alice Smith",
"email": "alice.smith@example.com"
}
🟠`PATCH` – Частичное обновление ресурса
Меняем только имя пользователя
1, не трогая email:PATCH /users/1 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Alice Johnson"
}
🟠`DELETE` – Удаление ресурса
Удаляем пользователя с ID
2:DELETE /users/2 HTTP/1.1
Host: api.example.com
Ставь 👍 и забирай 📚 Базу знаний
👍9💊2🤔1
🤔 Какие популярные форматы картинок используются в веб-верстке?
- JPEG — для фотографий;
- PNG — для изображений с прозрачностью;
- GIF — для простых анимаций;
- SVG — векторная графика, масштабируется без потери качества;
- WEBP — современный формат с хорошим сжатием и качеством.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- JPEG — для фотографий;
- PNG — для изображений с прозрачностью;
- GIF — для простых анимаций;
- SVG — векторная графика, масштабируется без потери качества;
- WEBP — современный формат с хорошим сжатием и качеством.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥3
🤔 Почему у нас в css нет селектора на родителе?
В CSS нет селектора родителя, потому что это нарушило бы оптимизацию и производительность рендеринга.
🚩Как работают селекторы в CSS?
Обычные селекторы идут от родителя к дочерним элементам.
Что было бы с селектором родителя?
🚩Использовать `:has()` (в современных браузерах)
В CSS4 появился
🚩Использовать Flexbox/Grid вместо селектора родителя
Иногда можно поменять структуру HTML и стилизацию, чтобы избежать проблемы.
🚩Использовать JavaScript
Если нужно изменить родителя динамически, можно использовать JavaScript.
Ставь 👍 и забирай 📚 Базу знаний
В CSS нет селектора родителя, потому что это нарушило бы оптимизацию и производительность рендеринга.
🚩Как работают селекторы в CSS?
Обычные селекторы идут от родителя к дочерним элементам.
.parent .child {
color: red;
}Что было бы с селектором родителя?
.child:has-parent(.parent) {
color: red;
}🚩Использовать `:has()` (в современных браузерах)
В CSS4 появился
:has(), который позволяет изменять родителя, если в нём есть определённый потомок. .parent:has(.child) {
border: 2px solid red;
}🚩Использовать Flexbox/Grid вместо селектора родителя
Иногда можно поменять структуру HTML и стилизацию, чтобы избежать проблемы.
.parent {
display: flex;
gap: 10px;
}🚩Использовать JavaScript
Если нужно изменить родителя динамически, можно использовать JavaScript.
document.querySelectorAll(".child").forEach(child => {
child.parentElement.classList.add("has-child");
});.has-child {
border: 2px solid blue;
}Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Какие бывают коды ответов с сервера?
- 1xx — информационные;
- 2xx — успешные (200, 201, 204);
- 3xx — перенаправления (301, 302);
- 4xx — ошибки клиента (400, 401, 403, 404);
- 5xx — ошибки сервера (500, 502, 503).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- 1xx — информационные;
- 2xx — успешные (200, 201, 204);
- 3xx — перенаправления (301, 302);
- 4xx — ошибки клиента (400, 401, 403, 404);
- 5xx — ошибки сервера (500, 502, 503).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍20🤔2
🤔 Какие есть значения у box-sizing?
Свойство
🚩Возможные значения `box-sizing`
🟠`content-box`
Размеры элемента считаются только по `width` и `height`, без учета
🟠`border-box`
🟠`inherit`
Наследует значение
Ставь 👍 и забирай 📚 Базу знаний
Свойство
box-sizing в CSS управляет тем, как рассчитываются размеры элемента, включая ширину и высоту. Оно определяет, включаются ли в эти размеры внутренние отступы (padding) и границы (border), или же они добавляются отдельно. 🚩Возможные значения `box-sizing`
🟠`content-box`
Размеры элемента считаются только по `width` и `height`, без учета
padding и border. Если добавить padding или border, фактические размеры элемента увеличатся. .box {
width: 200px;
height: 100px;
padding: 20px;
border: 10px solid black;
box-sizing: content-box;
}🟠`border-box`
width и height включают padding и border. Внутреннее содержимое (content) будет автоматически уменьшаться, чтобы уложиться в заданные размеры. .box {
width: 200px;
height: 100px;
padding: 20px;
border: 10px solid black;
box-sizing: border-box;
}🟠`inherit`
Наследует значение
box-sizing от родительского элемента. .parent {
box-sizing: border-box;
}
.child {
box-sizing: inherit; /* Унаследует border-box */
}Ставь 👍 и забирай 📚 Базу знаний
👍9
🤔 Что такое абсолютная ссылка?
Абсолютная ссылка содержит полный путь до ресурса, включая протокол и домен. Она работает независимо от расположения текущего документа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Абсолютная ссылка содержит полный путь до ресурса, включая протокол и домен. Она работает независимо от расположения текущего документа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥9👍6
🤔 Для чего нуден key при работе со списками?
В React при рендере списков (например, через
🚩Почему `key` важен?
React использует виртуальный DOM и при обновлении сравнивает новый список с предыдущим.
Без
Это может привести к неожиданному поведению, например, сбросу состояния или неправильному рендеру.
🚩Как использовать `key` правильно?
🚩Что будет без `key`?
Если не указать
Кроме того, при изменении списка возможны проблемы с перерисовкой
Ставь 👍 и забирай 📚 Базу знаний
В React при рендере списков (например, через
.map()) каждому элементу необходимо передавать уникальный key. Это помогает React оптимизировать перерисовку и правильно отслеживать изменения в списке. 🚩Почему `key` важен?
React использует виртуальный DOM и при обновлении сравнивает новый список с предыдущим.
Без
key React не понимает, какие элементы изменились, удалились или добавились. Это может привести к неожиданному поведению, например, сбросу состояния или неправильному рендеру.
🚩Как использовать `key` правильно?
const users = ["Alice", "Bob", "Charlie"];
function UserList() {
return (
<ul>
{users.map((user, index) => (
<li key={user}>{user}</li> // Хорошо, если `user` уникален
))}
</ul>
);
}
🚩Что будет без `key`?
Если не указать
key, React выдаст предупреждение: Warning: Each child in a list should have a unique "key" prop.
Кроме того, при изменении списка возможны проблемы с перерисовкой
{users.map((user, index) => (
<input key={index} defaultValue={user} />
))}Ставь 👍 и забирай 📚 Базу знаний
👍11💊1
🤔 Как организовать постраничную навигацию в Vue?
Обычно через Vue Router:
1. Создаются маршруты с компонентами.
2. Используется <router-link> для переходов.
3. Для постранички (pagination) можно:
- Передавать параметры (page, limit) через query или params.
- Следить за $route.query и загружать соответствующие данные.
- Обновлять URL при переключении страниц.
Можно использовать UI-библиотеки (например, Element UI, Vuetify) или свои компоненты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Обычно через Vue Router:
1. Создаются маршруты с компонентами.
2. Используется <router-link> для переходов.
3. Для постранички (pagination) можно:
- Передавать параметры (page, limit) через query или params.
- Следить за $route.query и загружать соответствующие данные.
- Обновлять URL при переключении страниц.
Можно использовать UI-библиотеки (например, Element UI, Vuetify) или свои компоненты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥8
🤔 Что такое макро и микро задачи?
Макро- и микро-задачи являются частью механизма асинхронного программирования и внутренней модели выполнения, которые помогают управлять порядком выполнения асинхронных операций. Эти понятия связаны с циклом событий (event loop) и очередью задач. Давайте разберемся, что они собой представляют и как работают.
🚩Микро-задачи (Microtasks)
Это задачи, которые запланированы для выполнения сразу после текущего выполненного скрипта, но до того, как event loop продолжит обрабатывать следующую макро-задачу.
🚩Макро-задачи (Macrotasks)
Это задачи, которые обрабатываются event loop, каждая макро-задача извлекается из очереди и выполняется до конца, прежде чем event loop перейдет к следующей макро-задаче.
I/O операции
Интерактивные действия, такие как клики мыши и нажатия клавиш
🚩Различия и порядок выполнения
Основное различие между макро- и микро-задачами заключается в их приоритете выполнения:
После каждой макро-задачи, перед тем как переходить к следующей макро-задаче, event loop обрабатывает все микро-задачи в очереди микро-задач. Это означает, что микро-задачи выполняются чаще и имеют более высокий приоритет по сравнению с макро-задачами. Если во время выполнения микро-задач добавляются новые микро-задачи, они также будут выполнены в текущем цикле, перед переходом к следующей макро-задаче. Это может привести к "голоданию" макро-задач, если микро-задачи постоянно добавляются.
Ставь 👍 и забирай 📚 Базу знаний
Макро- и микро-задачи являются частью механизма асинхронного программирования и внутренней модели выполнения, которые помогают управлять порядком выполнения асинхронных операций. Эти понятия связаны с циклом событий (event loop) и очередью задач. Давайте разберемся, что они собой представляют и как работают.
🚩Микро-задачи (Microtasks)
Это задачи, которые запланированы для выполнения сразу после текущего выполненного скрипта, но до того, как event loop продолжит обрабатывать следующую макро-задачу.
then, catch, finallyqueueMicrotask()🚩Макро-задачи (Macrotasks)
Это задачи, которые обрабатываются event loop, каждая макро-задача извлекается из очереди и выполняется до конца, прежде чем event loop перейдет к следующей макро-задаче.
setTimeoutsetIntervalsetImmediate (Node.js)I/O операции
Интерактивные действия, такие как клики мыши и нажатия клавиш
🚩Различия и порядок выполнения
Основное различие между макро- и микро-задачами заключается в их приоритете выполнения:
После каждой макро-задачи, перед тем как переходить к следующей макро-задаче, event loop обрабатывает все микро-задачи в очереди микро-задач. Это означает, что микро-задачи выполняются чаще и имеют более высокий приоритет по сравнению с макро-задачами. Если во время выполнения микро-задач добавляются новые микро-задачи, они также будут выполнены в текущем цикле, перед переходом к следующей макро-задаче. Это может привести к "голоданию" макро-задач, если микро-задачи постоянно добавляются.
setTimeout(() => console.log('Макро-задача 1'), 0);
Promise.resolve().then(() => console.log('Микро-задача 1'));
setTimeout(() => console.log('Макро-задача 2'), 0);
Promise.resolve().then(() => console.log('Микро-задача 2'));Ставь 👍 и забирай 📚 Базу знаний
👍9
🤔 Чем SPA отличается от классического сайта?
SPA (Single Page Application) не перезагружает страницу при переходах, а подгружает данные динамически через JS. Классический сайт перезагружает всю страницу при переходе по ссылке. SPA быстрее работает и даёт ощущение приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
SPA (Single Page Application) не перезагружает страницу при переходах, а подгружает данные динамически через JS. Классический сайт перезагружает всю страницу при переходе по ссылке. SPA быстрее работает и даёт ощущение приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍16🔥8💊3
🤔 Что такое flexbox?
Flexbox (Flexible Box Layout) – это модель размещения элементов в CSS, которая делает макет гибким и удобным для адаптивной верстки.
Главные особенности
🟠Гибкое выравнивание
элементов в строку или колонку
🟠Равномерное распределение
пространства между элементами
🟠Упрощает адаптивную верстку
без
🟠Легкое центрирование
элементов
🚩Основные термины Flexbox
Когда включается
Flex-контейнер → родительский элемент (
Flex-элементы → дочерние элементы контейнера
Главная ось (main axis) → ось, вдоль которой расположены элементы
Поперечная ось (cross axis) → перпендикулярная ось
🚩Основные свойства Flexbox
🟠`display: flex;`
Включает Flexbox для контейнера.
🟠`flex-direction` – направление оси
Определяет, как располагаются элементы (по горизонтали или вертикали).
🟠`justify-content` – выравнивание по главной оси
🟠`align-items` – выравнивание по поперечной оси
🟠`flex-wrap` – перенос элементов на новую строку
🟠`align-content` – выравнивание строк (если `flex-wrap: wrap;`)
Работает, когда элементы занимают несколько строк.
🚩Управление отдельными элементами (`flex`-элементы)
Ставь 👍 и забирай 📚 Базу знаний
Flexbox (Flexible Box Layout) – это модель размещения элементов в CSS, которая делает макет гибким и удобным для адаптивной верстки.
Главные особенности
🟠Гибкое выравнивание
элементов в строку или колонку
🟠Равномерное распределение
пространства между элементами
🟠Упрощает адаптивную верстку
без
float и position 🟠Легкое центрирование
элементов
🚩Основные термины Flexbox
Когда включается
display: flex;, элементы внутри него становятся флекс-элементами. Flex-контейнер → родительский элемент (
display: flex;) Flex-элементы → дочерние элементы контейнера
Главная ось (main axis) → ось, вдоль которой расположены элементы
Поперечная ось (cross axis) → перпендикулярная ось
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.container {
display: flex;
}🚩Основные свойства Flexbox
🟠`display: flex;`
Включает Flexbox для контейнера.
.container {
display: flex;
}🟠`flex-direction` – направление оси
Определяет, как располагаются элементы (по горизонтали или вертикали).
.container {
flex-direction: row; /* По умолчанию: слева направо */
}
/* Другие значения */
.container {
flex-direction: column; /* В столбик */
flex-direction: row-reverse; /* Справа налево */
flex-direction: column-reverse; /* Вниз-вверх */
}🟠`justify-content` – выравнивание по главной оси
.container {
justify-content: flex-start; /* По умолчанию, слева направо */
justify-content: center; /* Центр */
justify-content: flex-end; /* Справа налево */
justify-content: space-between; /* Равномерное распределение */
justify-content: space-around; /* С отступами */
justify-content: space-evenly; /* Равномерные промежутки */
}🟠`align-items` – выравнивание по поперечной оси
.container {
align-items: stretch; /* По умолчанию (растягивает) */
align-items: center; /* Центр по вертикали */
align-items: flex-start; /* Вверх */
align-items: flex-end; /* Вниз */
align-items: baseline; /* По базовой линии текста */
}🟠`flex-wrap` – перенос элементов на новую строку
.container {
flex-wrap: nowrap; /* По умолчанию – все в одной строке */
flex-wrap: wrap; /* Элементы переносятся */
flex-wrap: wrap-reverse; /* Перенос в обратном порядке */
}🟠`align-content` – выравнивание строк (если `flex-wrap: wrap;`)
Работает, когда элементы занимают несколько строк.
.container {
align-content: flex-start; /* Вверх */
align-content: flex-end; /* Вниз */
align-content: center; /* По центру */
align-content: space-between; /* Равномерное распределение */
align-content: space-around; /* С отступами */
align-content: stretch; /* Растянуть (по умолчанию) */
}🚩Управление отдельными элементами (`flex`-элементы)
flex-grow – рост элемента .item {
flex-grow: 1; /* Растянется, если есть место */
}flex-shrink – сжатие элемента .item {
flex-shrink: 0; /* Не уменьшаться */
}flex-basis – начальный размер элемента.item {
flex-basis: 200px; /* Фиксированный размер */
}Ставь 👍 и забирай 📚 Базу знаний
👍16
Каналы с Junior IT вакансиями
и стажировками
Подписывайся и забирай свой оффер
1. Стажировки и вакансии по России и миру
2. IT вакансии по СНГ
3. IT стажировки по СНГ
4. ИИ-ассистент для автооткликов
5. DIGITAL и IT стажировки и вакансии
6. IT стажировки в топовых компаниях мира
7. Удалённые IT вакансии и стажировки
8. Python вакансии и стажировки
9. БИГТЕХ вакансии и стажировки
10. Design вакансии и стажировки
11. QA вакансии и стажировки
12. Junior вакансии и стажировки
13. Frontend вакансии и вопросы собесов
14. Вакансии и стажировки для аналитиков
15. Вакансии в русских стартапах за границей
16. Вакансии и стажировки для DevOps
17. Вакансии, которых нет на ХХ.РУ
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Для чего нужен CDN?
CDN улучшает:
- скорость загрузки сайта за счёт геораспределения;
- устойчивость к нагрузке;
- снижение нагрузки на основной сервер;
- защиту от DDoS-атак и кэширование контента.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
CDN улучшает:
- скорость загрузки сайта за счёт геораспределения;
- устойчивость к нагрузке;
- снижение нагрузки на основной сервер;
- защиту от DDoS-атак и кэширование контента.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥7👍3