Frontend | Вопросы собесов
Сайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Задачи t.me/+_tcX2w2EmvdmMTgy Вакансии t.me/+CgCAzIyGHHg0Nzky
Больше📈 Аналитический обзор Telegram-канала Frontend | Вопросы собесов
Канал Frontend | Вопросы собесов (@easy_javascript_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 18 296 подписчиков, занимая 7 338 место в категории Технологии и приложения и 36 921 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 18 296 подписчиков.
Согласно последним данным от 11 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -116, а за последние 24 часа — -4, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 9.58%. В первые 24 часа после публикации контент обычно набирает 5.76% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 754 просмотров. В течение первых суток публикация набирает 1 054 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 9.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, браузер, html, border, flex.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky”
Благодаря высокой частоте обновлений (последние данные получены 12 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
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
Ставь 👍 и забирай 📚 Базу знаний:hover — применяется к элементу, когда на него наводят курсор мыши.
a:hover {
color: red; /* Ссылка станет красной при наведении /
}
:focus — применяется к элементу, когда он получает фокус (например, при переходе на элемент с помощью клавиатуры или при клике мыши).
input:focus {
border-color: blue; / Граница инпута станет синей при фокусе /
}
:active — применяется к элементу в момент его активации пользователем (например, во время клика по кнопке).
button:active {
transform: scale(0.98); / Кнопка немного уменьшится при клике /
}
:nth-child() — позволяет стилизовать элементы в зависимости от их порядка среди детей родительского элемента.
li:nth-child(odd) {
background-color: gray; / Заливка каждого нечетного элемента списка /
}
:not() — исключает из выборки элементы, соответствующие указанному селектору.
div:not(.special) {
color: green; / Применяется к каждому div, который не имеет класса special */
}
🚩Зачем нужны псевдоклассы?
Они делают CSS более мощным и гибким, позволяя разработчикам применять стили к элементам на основе их состояния или положения в документе, без изменения HTML-структуры. Это особенно полезно для создания интерактивных и реактивных пользовательских интерфейсов, где визуальное состояние элемента должно меняться в ответ на действия пользователя.
Ставь 👍 и забирай 📚 Базу знанийmain и feature.
В ветке feature вы сделали несколько коммитов.
Вы хотите объединить изменения из feature в main.
git checkout main
git merge feature
🚩Rebase (перебазирование)
Перемещает или переписывает базу текущей ветки на указанную базу другой ветки. Это переписывает историю коммитов, создавая новые коммиты для каждого из оригинальных коммитов.
Предположим, у вас есть две ветки: main и feature.
В ветке feature вы сделали несколько коммитов.
Вы хотите перенести изменения из feature на текущий конец main.
git checkout feature
git rebase main
🚩Основные отличия
🟠История коммитов
Merge: Сохраняет всю историю, включая коммиты слияния. История показывает, когда и как происходили слияния веток.
Rebase: Переписывает историю, делая её линейной. История показывает, как если бы все изменения были сделаны последовательно, без ветвлений.
🟠Коммиты слияния
Merge: Создает новый коммит слияния, который объединяет изменения из двух веток.
Rebase: Не создает коммит слияния. Перебазирование "переносит" коммиты одной ветки на другую.
🟠Конфликты
Merge: Конфликты решаются один раз при слиянии.
Rebase: Конфликты могут возникнуть на каждом коммите, и их нужно решать поэтапно.
🟠Применение
Merge: Хорош для сохранения полного контекста истории разработки, особенно в командной работе.
Rebase: Хорош для поддержания чистой, линейной истории, особенно перед слиянием ветки в основную ветку, например, main или master.
Ставь 👍 и забирай 📚 Базу знанийresolve) или отклонения (reject), он остаётся в этом состоянии навсегда.
Промисы предназначены для представления единственного результата асинхронной операции. Их дизайн не предполагает повторного запуска той же самой асинхронной логики.
const myPromise = new Promise((resolve, reject) => {
resolve('Done!');
});
myPromise.then((result) => console.log(result)); // "Done!"
// Даже если вы попытаетесь вызвать resolve или reject снова, ничего не произойдет
myPromise.then((result) => console.log(result)); // "Done!" (результат уже закеширован)
🚩Что делать, если нужно "перезапустить" асинхронную операцию?
Если вы хотите выполнить операцию заново, вместо "перезапуска" Promise нужно создать новый Promise или использовать функцию, которая возвращает новый Promise каждый раз.
function createPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('Я новый промис!'), 1000);
});
}
// Первый вызов
createPromise().then((result) => console.log(result)); // "Я новый промис!"
// "Перезапуск"
createPromise().then((result) => console.log(result)); // "Я новый промис!" (новый промис создан)
🚩Как это сделать с использованием `async/await`?
Это синтаксический сахар над промисами. Если вам нужно "перезапустить" асинхронную операцию, просто вызовите асинхронную функцию ещё раз.
async function fetchData() {
return new Promise((resolve) => {
setTimeout(() => resolve('Данные загружены!'), 1000);
});
}
async function main() {
const data1 = await fetchData();
console.log(data1); // "Данные загружены!"
const data2 = await fetchData(); // "Перезапуск" fetchData
console.log(data2); // "Данные загружены!"
}
main();
🚩Повторная попытка выполнения промиса (ретрай)
Если вам нужно повторно попытаться выполнить операцию (например, в случае неудачи), можно реализовать "ретрай". Это особенно полезно для операций вроде сетевых запросов.
function fetchDataWithRetry(retries) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.7) { // 70% шансов на ошибку
resolve('Данные успешно загружены!');
} else {
reject('Ошибка загрузки данных');
}
}, 1000);
}).catch((error) => {
if (retries > 0) {
console.log(`Повторная попытка... Осталось: ${retries}`);
return fetchDataWithRetry(retries - 1); // Рекурсивный вызов
} else {
throw error; // Если попытки исчерпаны, выбрасываем ошибку
}
});
}
fetchDataWithRetry(3)
.then((data) => console.log(data))
.catch((error) => console.error(error));
Ставь 👍 и забирай 📚 Базу знанийmax-width вместо width
.container {
width: 100%; /* Контейнер занимает всю ширину */
max-width: 1200px; /* Но не больше 1200px */
margin: auto; /* Центрирование */
}
Использование Flexbox
.container {
display: flex;
flex-wrap: wrap; /* Перенос элементов, если не влезают */
justify-content: space-between;
}
.item {
width: 48%; /* Два элемента в ряд */
}
@media (max-width: 768px) {
.item {
width: 100%; /* Один элемент в ряд на маленьких экранах */
}
}
Использование CSS Grid
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
🟠Медиа-запросы (`@media`)
Изменяют стили в зависимости от ширины экрана.
/* Десктоп (от 1024px) */
body {
font-size: 18px;
}
/* Планшеты (768px – 1023px) */
@media (max-width: 1023px) {
body {
font-size: 16px;
}
}
/* Телефоны (до 767px) */
@media (max-width: 767px) {
body {
font-size: 14px;
}
}
🟠Адаптивные изображения (`srcset`, `sizes`)
Позволяет загружать разные изображения в зависимости от устройства.
<img
src="image-400.jpg"
srcset="image-800.jpg 800w, image-1200.jpg 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
alt="Адаптивное изображение">
🟠Viewport (`meta viewport`)
Управляет масштабированием на мобильных устройствах.
<meta name="viewport" content="width=device-width, initial-scale=1">
🟠CSS-фреймворки (Bootstrap, Tailwind)
Фреймворки содержат готовые адаптивные классы.
Bootstrap (грид-система)
<div class="container">
<div class="row">
<div class="col-md-6 col-sm-12">Контент</div>
<div class="col-md-6 col-sm-12">Контент</div>
</div>
</div>
Tailwind CSS
<div class="grid grid-cols-2 md:grid-cols-3 sm:grid-cols-1 gap-4">
<div class="bg-blue-500">1</div>
<div class="bg-green-500">2</div>
<div class="bg-red-500">3</div>
</div>
Ставь 👍 и забирай 📚 Базу знаний
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
