Frontend разработчик

Логотип телеграм канала @frontend_1 — Frontend разработчик F
Актуальные темы из канала:
Event
Asynchronous
Реклама
Id
F
E
Ff
Def
Broadcast
Performance
All tags
Логотип телеграм канала @frontend_1 — Frontend разработчик
Актуальные темы из канала:
Event
Asynchronous
Реклама
Id
F
E
Ff
Def
Broadcast
Performance
All tags
Адрес канала: @frontend_1
Категории: Технологии
Язык: Русский
Количество подписчиков: 11.06K
Описание канала:

Полезные материалы для фронтендера по HTML, CSS, JS, React.js, Angular.js, Vue.js, TypeScript, Redux, MobX, JavaScript, NodeJS.
По всем вопросам @evgenycarter
РКН clck.ru/3KoFrk

Рейтинги и Отзывы

2.00

2 отзыва

Оценить канал frontend_1 и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

1


Последние сообщения

5 дней назад
Хватит проверять isMounted в useEffect

Вы наверняка видели (или писали) такой код, чтобы избежать ошибки "Can't perform a React state update on an unmounted component":


// Антипаттерн
useEffect(() => {
let isMounted = true;
fetchData().then(data => {
if (isMounted) setState(data);
});
return () => { isMounted = false; };
}, []);



Это «мусорный» код. Запрос все равно происходит, трафик тратится, промис висит в памяти.
Вместо ручных флагов используйте стандартный браузерный API - AbortController.

Как сделать правильно:


useEffect(() => {
const controller = new AbortController();

fetch('/api/data', { signal: controller.signal })
.then(res => res.json())
.then(setData)
.catch(err => {
// Важно: не считаем отмену запроса ошибкой
if (err.name !== 'AbortError') {
console.error(err);
}
});

// При размонтировании или перезапуске эффекта запрос реально отменится браузером
return () => controller.abort();
}, []);



Бонус-фича: Очистка Event Listeners
AbortController умеет удалять и слушатели событий. Больше не нужно выносить функцию-хендлер в отдельную переменную, чтобы передать её в removeEventListener.


const controller = new AbortController();

// Передаем signal в опции
window.addEventListener('resize', (e) => handleResize(e), {
signal: controller.signal
});

// Одним вызовом удаляем слушатель (или группу слушателей с одним сигналом)
controller.abort();



Мы в MAX

@frontend_1
1.06K views11:00
Подробнее
Поделиться:
Открыть/Комментировать
20 янв
any - это ложь, которую вы говорите сами себе

Давайте честно: когда у вас горят дедлайны, а TypeScript ругается на несовпадение типов, рука сама тянется написать : any.

«Я потом поправлю», - говорите вы.
Спойлер: не поправите.

Использование any превращает ваш строгий TypeScript проект обратно в анархичный JavaScript, но с лишним этапом сборки. Вы просто отключаете компилятор.

Почему это плохо:
Вы теряете автокомплит, рефакторинг становится русской рулеткой, а баг undefined is not a function вернется к вам в самый неподходящий момент.

Что делать вместо any?

1. Если вы реально не знаете, что прилетит:
Используйте unknown. Это безопасный аналог any. Он скажет: "Я не знаю, что это, но я не дам тебе с этим работать, пока ты не проверишь тип".


// Плохо
const processData = (data: any) => {
data.toUpperCase(); // Может упасть, если data — число
}

// Хорошо
const processData = (data: unknown) => {
if (typeof data === 'string') {
data.toUpperCase(); // TS теперь знает, что это строка
}
}




2. Если лень описывать огромный ответ бэкенда:
Используйте утилиты для генерации типов из Swagger/OpenAPI. Не пишите интерфейсы руками, мы же не в каменном веке.

Уважайте свои нервы. Типизируйте нормально.

#typescript #cleancode #safety

Мы в MAX

@frontend_1
1.23K views10:39
Подробнее
Поделиться:
Открыть/Комментировать
19 янв
Советы по HTML

Знаете ли вы, что с помощью элемента HTML можно легко создать модал?

Мы в MAX

@frontend_1
1.32K views04:59
Подробнее
Поделиться:
Открыть/Комментировать
16 янв
CSS :has() - это легальный чит-код в верстке

Мы привыкли называть :has() «селектором родителя», но это определение сильно преуменьшает его мощь. Это инструмент, который позволяет отказаться от JS и лишних классов-модификаторов для управления состоянием UI.

Вот два сценария, где :has() меняет правила игры:

1. Контекстная стилизация (без BEM-модификаторов)
Раньше, чтобы изменить стили карточки в зависимости от контента (например, есть ли внутри картинка или бейдж), мы писали JS-проверку или добавляли класс .card--with-image.

Теперь CSS сам смотрит внутрь:


/* Если внутри карточки есть картинка -> меняем грид */
.card:has(img) {
grid-template-columns: 1fr 1fr;
}

/* Если внутри есть сообщение об ошибке -> красим бордер */
.form-group:has(.error-message) {
border-color: red;
background: #fff0f0;
}



2. Селектор «предыдущего соседа»
В CSS всегда можно было стилизовать элемент, идущий после (h2 + p), но никогда - перед. С :has() это стало возможным.

Трюк: мы выбираем элемент, если за ним следует нужный нам сосед.


/* Стилизуем h2, ТОЛЬКО если сразу за ним идет список ul */
h2:has(+ ul) {
margin-bottom: 0; /* Убираем отступ, чтобы "приклеить" к списку */
color: var(--primary);
}



Поддержка в браузерах уже отличная (Baseline 2023). Если вы всё еще пишете useEffect или вешаете классы просто чтобы поменять стиль родителя при фокусе инпута (:focus-within не всегда хватает) или наличии элемента - удаляйте лишний код и берите :has().

Мы в MAX

@frontend_1
1.59K views05:25
Подробнее
Поделиться:
Открыть/Комментировать
15 янв
Баг, который вы не видите, а пользователи ненавидят

Представьте: пользователь заполнил длинную форму регистрации, свернул приложение, чтобы скопировать код из SMS, возвращается... а экран пустой. Данные исчезли.

Это System-initiated process death. Самая частая причина удаления приложения у пользователей и головная боль разработчиков.

Почему это происходит?
ОС (Android или iOS) всегда не хватает оперативной памяти. Когда ваше приложение уходит в фон, система может «тихо» убить его процесс, чтобы освободить ресурсы для активного окна (например, Камеры).

Ошибка новичка:
«Я храню данные в ViewModel (Android) или в переменной контроллера (iOS), они же живут долго!»
Реальность: ViewModel переживает поворот экрана, но умирает вместе с процессом. Синглтоны тоже сбрасываются.

Как делать правильно (Level Up):

Android:
Перестаньте полагаться только на поля класса. Используйте SavedStateHandle.
Это специальный механизм внутри ViewModel, который сохраняет небольшие кусочки данных (ID, поисковый запрос, ввод пользователя) в системный бандл. Система бережно восстановит его даже после смерти процесса.
Гуглить: SavedStateHandle, Parcelable.

iOS (SwiftUI/UIKit):
В SwiftUI для простых данных (например, выбранная вкладка или текст) используйте обертку @SceneStorage. Она автоматически сохраняет и восстанавливает состояние.
Для сложных данных — сохраняйте их в локальную БД (CoreData/Realm/SwiftData) при каждом изменении, а не при закрытии экрана.

Как проверить себя (Челлендж на 5 минут):
Не верьте эмулятору. Проверьте свой текущий проект прямо сейчас:

1. Запустите приложение и введите данные в любое поле.
2. Сверните приложение (Home).
3. Android: В настройках разработчика включите опцию «Don't keep activities» (Не сохранять действия).
4. iOS: В Xcode нажмите Debug -> Simulate Memory Warning или остановите дебаг и запустите другое тяжелое приложение.
5. Вернитесь в свое приложение.

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

Знали про SavedStateHandle или по старинке сохраняли всё в базу данных?

#android #ios #bugs #middle #architecture #обучение

@developer_mobila
1.29K views20:52
Подробнее
Поделиться:
Открыть/Комментировать
13 янв
TypeScript: Почему satisfies круче обычного объявления типа?

Многие по привычке пишут так: const config: Config = { ... }.
Это работает для валидации, но у этого подхода есть минус - Type Widening (расширение типов). Вы теряете точность выведенного типа в угоду соответствию интерфейсу.

Начиная с TS 4.9, оператор satisfies решает эту проблему. Он проверяет, что объект соответствует типу, но сохраняет его точную структуру.

В чем разница?

Классический подход (потеря точности):


type Routes = Record;

// Мы явно указали тип Routes
const nav: Routes = {
home: "/",
admin: ["/users", "/posts"]
};

// TS думает, что nav.home — это 'string | string[]'
// ОШИБКА: Property 'toUpperCase' does not exist on type 'string | string[]'
nav.home.toUpperCase();



Используем satisfies (сохраняем контекст):


const nav = {
home: "/",
admin: ["/users", "/posts"]
} satisfies Routes;

// Теперь TS знает:
// 1. nav соответствует Routes (опечатки не пропустит)
// 2. nav.home — это конкретно string
// 3. nav.admin — это конкретно string[]

// РАБОТАЕТ!
nav.home.toUpperCase();
nav.admin.map(path => path);



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

Мы в MAX

@frontend_1
1.3K views18:15
Подробнее
Поделиться:
Открыть/Комментировать
12 янв
SPA умеют почти все. А вот интерфейс, который живёт в реальном времени, без перезагрузок и костылей, обычно ломает даже уверенных фронтендеров.

На открытом вебинаре OTUS вы соберёте мини-биржу на Vue: поднимем локальный WebSocket-сервер с мок-данными, подключим подписку на стрим, выведем список валют, изменения цен и индикаторы роста/падения. Добавим живые графики (ApexCharts или Chart.js) и обновления.

Разберём архитектуру real-time интерфейсов: реактивные данные, управление соединением, обработка событий и потоков, обновления без перезагрузки. Покажем, как после урока заменить мок-источник на реальный WebSocket-поток.

Встречаемся 14 января в 20:00 МСК в преддверие старта курса «Vue.js-разработчик». Регистрация открыта: https://vk.cc/cTkUVz

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1.57K views08:03
Подробнее
Поделиться:
Открыть/Комментировать
12 янв
Знаете ли вы, что можно изменить метод формы в HTML-форме, указав атрибут formMethod на кнопке?

Мы в MAX

@frontend_1
1.47K views05:37
👍 8
Подробнее
Поделиться:
Открыть/Комментировать
11 янв
Перестаньте пихать всё в useEffect. Серьезно.

Вижу это на каждом код-ревью. Джуны (и иногда уставшие мидлы) используют useEffect для синхронизации стейта. Это выстрел себе в ногу.

Как делать не надо:
У вас есть firstName и lastName, и вы создаете эффект, чтобы обновить fullName.


const [firstName, setFirstName] = useState('Alex');
const [lastName, setLastName] = useState('Dev');
const [fullName, setFullName] = useState('');

useEffect(() => {
setFullName(`${firstName} ${lastName}`);
}, [firstName, lastName]);



Почему это плохо?

1. Лишний рендер. Компонент рендерится, запускается эффект, обновляется стейт -> компонент рендерится снова.
2. Сложность отладки. Попробуйте отследить цепочку из 5 таких эффектов в большом компоненте.

Как надо (Derived State):
Вычисляйте значение прямо во время рендера.


const fullName = `${firstName} ${lastName}`;



Если вычисления тяжелые, используйте useMemo. Но в 90% случаев вам не нужен ни эффект, ни стейт.

Правило большого пальца: Если вы можете вычислить что-то из уже имеющихся пропсов или стейта - не создавайте для этого новый стейт.

#react #bestpractices #performance

Мы в MAX

@frontend_1
1.59K views19:58
👍 8 1 👎 1 😁 1
Подробнее
Поделиться:
Открыть/Комментировать
5 янв
Советы по Javascript

Мы в MAX

@frontend_1
1.86K views06:17
Подробнее
Поделиться:
Открыть/Комментировать
1 янв
Дорогие друзья, с Новым Годом!!!
1.34K views21:14
Подробнее
Поделиться:
Открыть/Комментировать
31 дек 2025
Node получил возможность запускать файлы TypeScript напрямую!

Мы в MAX

@frontend_1
1.35K views05:45
Подробнее
Поделиться:
Открыть/Комментировать
29 дек 2025
Совет по CSS

Легко создайте полосатый прогресс-бар без использования сторонних библиотек

Мы в MAX

@frontend_1
1.38K views06:19
Подробнее
Поделиться:
Открыть/Комментировать
22 дек 2025
Я увидел эту замечательную технику CSS Video Masking на сайте iPad.

Довольно аккуратное использование CSS - не то, что я ожидал!

Мы в MAX

@frontend_1
1.81K views19:04
Подробнее
Поделиться:
Открыть/Комментировать
18 дек 2025
Совет по JavaScript

Используйте параметр rest вместо объекта arguments для приема переменного количества аргументов

Мы в MAX

@frontend_1
1.19K views07:48
Подробнее
Поделиться:
Открыть/Комментировать
17 дек 2025
Пишете на JavaScript, но всё ещё завязаны на фреймворки и готовые компоненты? Хотите понимать, как работает браузер, и создавать свои элементы, а не только использовать чужие?

На открытом уроке разберём, как JavaScript взаимодействует с DOM, как с помощью классов и ООП собирать структурированные компоненты и что такое Web Components на практике. Шаг за шагом создадим кастомный HTML-тег с нуля и подключим его к странице так, чтобы элемент можно было переиспользовать.

Урок будет полезен начинающим фронтенд-разработчикам и тем, кто хочет уйти от фреймворков к осознанному пониманию браузерного API. Вебинар проходит в преддверие старта курса «JavaScript Developer. Basic».

Встречаемся 22 декабря в 20:00 МСК.

Регистрация открыта: https://vk.cc/cSrCOI

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1.12K views07:01
Подробнее
Поделиться:
Открыть/Комментировать
16 дек 2025
Совет по CSS

Полезный сниппет, позволяющий скрыть содержимое, но сохранить его доступным для пользователей программ для чтения

Мы в MAX

@frontend_1
977 views09:19
Подробнее
Поделиться:
Открыть/Комментировать
14 дек 2025
Совет по улучшению UX адреса электронной почты

Мы в MAX

@frontend_1
1.1K views07:20
Подробнее
Поделиться:
Открыть/Комментировать
11 дек 2025
Совет по CSS

:user-invalid

Мы в MAX

@frontend_1
1.43K views06:35
Подробнее
Поделиться:
Открыть/Комментировать
9 дек 2025
Совет по Javascript

Знаете ли вы, почему мы не можем создавать новые инстансы из arrow function?

Мы в MAX

@frontend_1
1.38K views19:16
Подробнее
Поделиться:
Открыть/Комментировать
4 дек 2025
Совет по CSS

Пользовательский Range Slider с всплывающей подсказкой

Всплывающая подсказка будет менять свою форму, чтобы оставаться в границах ползунка. Даже радиус будет меняться, когда подсказка будет приближаться к углам.

https://codepen.io/t_afif/pen/vYweZQa

Мы в MAX

@frontend_1
963 views18:06
Подробнее
Поделиться:
Открыть/Комментировать
4 дек 2025
event: VK Apps & Games Dev Night

date: 13.12

place: Санкт-Петербург, офис ВКонтакте у Красного моста

vibe: кинопремия, вечеринка и нетворк


Что будет:
• Расскажут о продуктовых и технологических изменениях VK Mini Apps
• Подведут итоги VK Dev Grants и наградят победителей
• Поделятся идеями, как делать мини-приложения лучше, быстрее и как развивать свои проекты;

+ Нетворк и вечеринка в стиле кинопремии

Один вечер, чтобы узнать всё самое важное и пообщаться с командой платформы. Присоединяйтесь онлайн или офлайн.
901 views15:02
Подробнее
Поделиться:
Открыть/Комментировать
4 дек 2025
Используйте сгенерированный CSS clip-path, чтобы получить более тонкую форму


.squircle {
clip-path: polygon(
100.00% 50.00%, 99.95% 62.53%, 99.80% 67.70%, ...
);
}


Мы в MAX

@frontend_1
882 viewsedited  08:04
Подробнее
Поделиться:
Открыть/Комментировать
3 дек 2025
Совет по Javascript

Возможно, вы не знаете об этом простейшем способе таймаута запроса на выборку.

Мы в MAX

@frontend_1
894 views07:23
Подробнее
Поделиться:
Открыть/Комментировать
2 дек 2025
Если JavaScript у вас пока живёт в консоли и учебных задачках, самое время вытащить его в «настоящий мир». На открытом вебинаре соберём мини-приложение, которое очень похоже на реальный продуктовый интерфейс: каталог с карточками, фильтрами и поиском по данным с внешнего API.

Что будем делать на вебинаре:
- Подключим внешний API и загрузим реальные данные — без фейковых «заглушек».
- Построим каталог с карточками: изображение, название, описание — как в интернет-магазинах или сервисах подбора.
- Добавим поиск, фильтры и индикатор загрузки, чтобы интерфейс выглядел и вёл себя живо.
- Покажем, как обрабатывать ошибки и показывать корректные UI-состояния, а не просто «ничего не происходит».
- Разберём структуру приложения на чистом JS: где хранятся данные, где бизнес-логика, как устроен рендеринг.

9 декабря, 20:00 МСК.
Открытый урок проходит в преддверии старта курса «JavaScript Developer. Basic».

Регистрация открыта: https://vk.cc/cRSuQh

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
914 views09:04
Подробнее
Поделиться:
Открыть/Комментировать
1 дек 2025
Отзывчивый инвертированный раскрывающийся скроллер с CSS

img {
position: fixed;
animation: clip;
animation-timeline: --section;
animation-range: exit;
}
@​keyframes clip { to { clip-path: inset(100% 0 0 0); }

Мы в MAX

@frontend_1
956 views09:06
Подробнее
Поделиться:
Открыть/Комментировать
29 ноя 2025
Angular SSR за час: превращаем SPA в ракету
Подходит разработчикам JavaScript/TypeScript, Junior/Middle разработчикам, желающим освоить Angular, Frontend-разработчикам на других фреймворках (React, Vue)

На открытом уроке 2 декабря в 20:00 мск мы освоим внедрение SSR в приложение: серверный рендеринг, SEO-метаданные, работа с API и базовое понимание hydration:

На вебинаре разберем:
1. Понимание базовой архитектуры SSR в Angular.
2. Понимание поведения приложения до и после hydration.

В результате на практике изучите и освоите умение подключить SSR к существующему приложению, работу с серверным рендерингом данных и настройку SEO-метаданных.

Регистрация на урок и подробности о курсе Angular Developer: https://vk.cc/cRMPnv

Все участники открытого урока получат скидку на курс "Angular Developer" с промокодом ANGULAR12

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1.06K views08:33
Подробнее
Поделиться:
Открыть/Комментировать
28 ноя 2025
Генератор паролей на тему хакеров с использованием HTML, CSS и JavaScript

https://learning.atheros.ai/ui-components/password-checker-12

Мы в MAX

@frontend_1
1.14K views05:05
Подробнее
Поделиться:
Открыть/Комментировать
27 ноя 2025
Метаданные в Next.js (статические и динамические)

Мы в MAX

@frontend_1
1.17K views08:34
Подробнее
Поделиться:
Открыть/Комментировать
24 ноя 2025
Layout vs Template в Next.js

Мы в MAX

@frontend_1
1.49K views05:52
Подробнее
Поделиться:
Открыть/Комментировать