Telegram Web
🎯 CSS tip: как избавиться от :last-child и упростить отступы

Когда нужно задать отступ между элементами, но не последнему, часто пишут:


.item:not(:last-child) {
margin-bottom: 16px;
}


Но есть современный способ без селекторов и костылей 👇

Используй gap с flex или grid:


.container {
display: flex;
flex-direction: column;
gap: 16px;
}


📌 Преимущества:
– Нет нужды в :last-child
– Чище HTML и CSS
– Работает одинаково в любом направлении (row, column)
– Поддерживается во всех современных браузерах


Итог: если ты всё ещё пишешь :not(:last-child) — пришло время обновить подход.

👉 @frontend_1
🎯 HTML attributes vs DOM properties

Разница между атрибутами и свойствами в HTML/DOM может быть запутанной, особенно когда названия совпадают. Кратко:

* Атрибут — часть HTML.
* Свойство — часть DOM-объекта.

Пример:


<input value="Hello">



const input = document.querySelector('input');
console.log(input.getAttribute('value')); // "Hello"
console.log(input.value); // "Hello"
input.value = 'World';
console.log(input.getAttribute('value')); // "Hello"


Значение атрибута остаётся неизменным, даже если свойство обновляется в JS. DOM-свойства могут не синхронизироваться с атрибутами после инициализации.

🔹Свойства могут отличаться от атрибутов


<input disabled>



input.hasAttribute('disabled'); // true
input.disabled; // true
input.removeAttribute('disabled');
input.disabled; // false


Свойство disabled — булево. Атрибут disabled работает как флаг: его наличие имеет значение, не важно, какое значение вы ему присвоили.


<input disabled="false">


Это всё равно disabled. Так работает HTML.

🔹Когда использовать атрибуты, а когда свойства?

* Используйте атрибуты, когда:

* Вам нужно установить начальное значение в HTML.
* Вы работаете с HTML-строкой.
* Вы хотите сохранить значение при сериализации (например, outerHTML).

* Используйте свойства, когда:

* Вы работаете с DOM в JS.
* Нужно прочитать или изменить текущее состояние элемента.

🔹Иногда стоит быть осторожнее


input.setAttribute('value', 'New');
console.log(input.value); // "New"


Иногда установка атрибута также влияет на свойство, но не всегда — зависит от элемента и конкретного атрибута/свойства.

https://jakearchibald.com/2024/attributes-vs-properties/

👉 @frontend_1
Хотите собрать первое приложение на React за 60 минут?

Присоединяйтесь к открытому уроку от OTUS. Без скучных теорий и банальных todo-листов: только практика, код и живое общение. Вы узнаете, зачем нужны хуки и как компоненты делают интерфейс «живым», и самостоятельно создадите интерактивную игру.

Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.

Встречаемся 7 мая в 20:00 МСК, регистрируйтесь прямо сейчас, чтобы не пропустить: https://vk.cc/cLEyIM

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
This media is not supported in your browser
VIEW IN TELEGRAM
CSS совет 💡

Для лучшего UX используйте :focus-visible вместо :focus для изменения стиля обводки

👉 @frontend_1
🧩 Трюк с z-index, о котором часто забывают

Если у вас не работает z-index — причина может быть не в его значении, а в контексте наложения (stacking context).

❗️Вот что его создаёт (неочевидное):

* position: fixed | absolute | relative + z-index ≠ auto
* transform, filter, perspective, opacity < 1
* will-change, mix-blend-mode, contain: layout и другие

📦 Пример:


.parent {
transform: translateZ(0); /* создаёт stacking context */
z-index: 10;
}

.child {
position: absolute;
z-index: 999; /* но не выйдет за пределы .parent */
}


🧠 Вывод: z-index работает только внутри текущего контекста наложения. Чтобы перекрыть что-то выше — нужно изменить контекст.

📚 Подробнее: https://developer.mozilla.org/ru/docs/Web/CSS/CSS_positioned_layout/Stacking_context

👉 @frontend_1
🔥 Быстрое сравнение объектов в JS без глубоких сравнений

Иногда не нужен deep equal, а просто надо понять: два объекта точно одинаковы по содержимому?

Вот простой, но мощный трюк на базе JSON.stringify():


const isEqual = (a: object, b: object) =>
JSON.stringify(a) === JSON.stringify(b);


📌 Подходит для:

* Простых объектов без методов и undefined;
* Сравнения кеша/props в memo;
* Быстрой проверки изменений формы.

⚠️ Не подходит:

* Для вложенных объектов с разным порядком ключей ({a:1,b:2} !== {b:2,a:1});
* Когда есть Date, Map, Set, функции, undefined, symbol.

🧠 Альтернатива:
Если важен порядок и типы — используй lodash.isEqual.

👉 Пример использования:


if (!isEqual(prevForm, currentForm)) {
saveChanges();
}


Просто. Эффективно. Для 80% кейсов — 🔥

👉 @frontend_1
🚀 Подборка Telegram каналов для программистов

Системное администрирование, DevOps 📌

https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux

1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
https://www.tgoop.com/razrab_1C 1C Разработчик
https://www.tgoop.com/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С

Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия.
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python

Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр

Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов

БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Big Data, Machine Learning

Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.

QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров

Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
https://www.tgoop.com/matgeoru Математика | Геометрия | Логика

Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack

https://www.tgoop.com/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
🔥 Юзаешь React + TypeScript? Тогда вот тебе трюк на миллион — типизация children правильно!

Часто можно увидеть вот так:


type Props = {
children: React.ReactNode;
}


Но это слишком широкий тип. Он допускает что угодно: строки, числа, фрагменты, null…

📌 Лучше — использовать ReactElement:


import { ReactElement } from 'react';

type Props = {
children: ReactElement;
}


👉 Это значит: ожидаем ровно один React-элемент, и никаких строк/чисел/массивов.

Если нужно несколько элементов — используем:


type Props = {
children: ReactElement | ReactElement[];
}


🎯 Это даёт жёсткую и предсказуемую типизацию, особенно полезно для обёрток и layout-компонентов.

⚠️ А если хочешь прям универсальность — тогда ReactNode ок. Но осознанно.


Пиши типы как профи 💪

👉 @frontend_1
🚨 Осторожно с useEffect: ловушка зависимости на функцию!

В React легко попасть в ловушку, передавая функции внутрь useEffect, не задумываясь об их зависимости.


useEffect(() => {
fetchData(); // ⚠️ Эта функция может пересоздаваться на каждый рендер!
}, [fetchData]);


Если fetchData определена внутри компонента, она будет новой при каждом рендере, и эффект снова выполнится. Это может вызвать бесконечные циклы или лишние вызовы.

🛠 Решения:

1. Вынести функцию наружу, если она не зависит от пропов/стейта.
2. Обернуть в useCallback:


const fetchData = useCallback(() => {
// ...
}, []);


📌 Всегда проверяй зависимости в useEffect. Полагайся на ESLint-плагин react-hooks — он поможет не попасть в ловушку.

👉 @frontend_1
🎯 Современный способ центрирования с place-items

Центрировать элемент — базовая задача, но многие до сих пор пишут лишнее:

Старый способ с Flexbox:


display: flex;
justify-content: center;
align-items: center;


Новый минималистичный способ с Grid:


display: grid;
place-items: center;


📌 place-items — это сокращение для align-items + justify-items. Работает только с CSS Grid, но зато:

* Меньше кода
* Более читаемо
* Идеально для одиночных элементов в контейнере

💡 Подходит для модалок, карточек, лоадеров и др.

⚙️ Поддержка: все современные браузеры (даже IE11 частично поддерживает place-items как -ms-grid)

Пробуй — и забудь про лишние строки!

👉 @frontend_1
Не просто кнопка "Загрузить": Секреты работы с файлами в React

🎓 19 мая в 20:00 — бесплатный вебинар для разработчиков, которые хотят делать удобную и безопасную загрузку файлов в React-приложениях.

Что покажем:
— Drag & Drop, предпросмотр, валидация — всё, что ждали от UX;
— Обработка PDF, Excel и изображений прямо в браузере;
— Как не «положить» интерфейс при загрузке тяжёлых файлов;
— Защита от XSS, проверка MIME-типов и другие нюансы безопасности.

📌 Для фронтендеров и fullstack-разработчиков, которым важна клиентская оптимизация.

В программе — реальные примеры кода, которые можно сразу использовать.
Урок пройдет в преддверии старта курса «React.js Developer». Каждый участник вебинара получит скидку на обучение.

Регистрация: https://vk.cc/cLVH8S

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
This media is not supported in your browser
VIEW IN TELEGRAM
Athena Crisis — это современная реализация тактической стратегии в духе Advance Wars, написанная на Rust с использованием движка Bevy.

Особенности:

* Сражения в стиле пошаговой стратегии
* Кампания с диалогами и кат-сценами
* Пользовательские карты и редактор уровней
* ИИ-противники
* Полностью кроссплатформенный: работает в браузере, на ПК и мобильных устройствах
* Сохраняемые игры

Проект в активной разработке. Вы можете попробовать демо прямо сейчас в браузере: Играть в демо

https://github.com/nkzw-tech/athena-crisis

👉 @frontend_1
Совет по HTML 💡

Семантический способ выделить часть текста

👉 @frontend_1
🔥 Как дебаунсить useEffect без лишних библиотек

Когда useEffect триггерится слишком часто — например, при вводе в input — можно легко добавить дебаунс. Без lodash, только setTimeout.


import { useEffect } from 'react'

function useDebouncedEffect(effect: () => void, deps: any[], delay: number) {
useEffect(() => {
const handler = setTimeout(() => effect(), delay)

return () => clearTimeout(handler)
}, [...deps, delay])
}


📌 Использование:


useDebouncedEffect(() => {
fetch(`/api/search?q=${query}`)
}, [query], 500)


Плюсы:
– Простой и читаемый хук
– Не надо тащить lodash
– Управляемый debounce прямо в useEffect

⚠️ Важно: deps должны быть стабильны. Заворачивай колбэки в useCallback при необходимости.

👉 @frontend_1
This media is not supported in your browser
VIEW IN TELEGRAM
CSS-совет 💡

Возможно, ты не знал о единице измерения lh в CSS

👉 @frontend_1
Как мы строим новое облако MWS — рассказываем в технических статьях «под капотом».
Читайте и берите идеи в свои проекты.

➡️ Сетевая телеметрия для облака — от протоколов до продакшена

Про BFD, TWAMP и STAMP, зачем нам push-модель и gNMI, и что происходит, когда Telegraf не дружит с Kafka.

➡️ Как мы наливаем Kubernetes на железо и управляем десятками кластеров

Рассказываем про платформу собственной разработки — Piñata.

➡️ IAM в облаке: от логина до сервисных агентов

RBAC, сервисные учётки, HMAC-ключи — и почему у нас нет «режима бога».

➡️ Как устроен Compute: декларативный API, реконсиляция и немного геймдева

Рассказываем про архитектуру Compute в MWS и наш подход к его разработке.

🔗 Подпишись на облачный хаб MWS
⏩️Там регулярно рассказываем, как строим новое облако с нуля.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/05/23 20:12:54
Back to Top
HTML Embed Code: