mefody.dev – Telegram
mefody.dev
5.31K subscribers
14 photos
1 video
3 files
425 links
Доброжелюбный бородач про фронтенд, тимлидство, спикерство.
Автор — @dark_mefody

Канал про работу: @mefody_work.

Не размещаю рекламу в своём канале. Даже за деньги. Даже большие.
Download Telegram
Удаление бесполезных файлов из проекта

Наткнулся на старый, но эффективный инструмент оптимизации исходного кода. Он проходится по файлам в директории и убирает неиспользуемые. Применять, конечно, стоит осторожно, некоторые файлы всё-таки могут быть важными, автоматика может ошибаться.

https://github.com/anandundavia/thanos-js
😁40👍9🤩4🌚3🥴21👏1🐳1😐1
Декларативный веб-пуш

Сервис-воркеры позволяют показывать в веб-приложениях пуши, как в нативных приложениях. Это те самые нотификации, которые шлёт приложение в операционную систему, чтобы вы могли на что-то отреагировать, пока приложение не активно.

Оставим за скобками, что этот механизм часто используют маркетологи для не самых чистых паттернов привлечения внимания. Мне всё таки во многих приложениях веб-пуши помогают. Например, я очень хочу, чтобы разные AI-боты, которые научились в размышления, прислали пуш в тот момент, когда они уже закончили «думать». Или когда идёт долгая операция, результат которой мне нужен, но смотреть на вечный спиннер не готов.

Необходимость сервис-воркера для работы нотификаций, к сожалению, иногда ломает бизнес-логику. В том же Safari есть механизм полной очистки всего, связанного с веб-приложением, через какое-то длительное время. Чистят куки, localStorage, в том числе прибивают сервис-воркеры. При этом ломаются и нотификации.

Apple в iOS 18.4 выкатили Declarative Web Push, который не нуждается в сервис-воркерах. Механизм получения нотификаций остался тем же, но регистрация происходит по-новому, через window.


const subnoscription = await window.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: arrayForPublicKey
});


Ну и если раньше для показа нотификации нужно было обработать полученное извне сообщение и вызвать showNotification, то теперь Push Manager если получает сообщение в нужном JSON-формате, сразу же его и показывает, без JavaScript.

В блоге WebKit говорится, что это более энергоэффективно и надёжно, при этом не мешает privacy пользователей.

С одной стороны, действительно полезное внедрение. Не нужно целиком переписывать существующий механизм, достаточно привести формат сообщений от сервера к стандарту, добавить новый способ подключения. С другой — это же то, на что постоянно жалуются про Chrome. Стандарта ещё нет, есть только эксплейнер на гитхабе, а оно уже в проде.

Новинку можно потестировать на iOS и iPadOS 18.4.

https://webkit.org/blog/16535/meet-declarative-web-push/
24👍8🎉6🔥3😐32🌚2
Про цвет и контраст

Нашёл золото в архивах. Когда-то давно Юля Миоцен скидывала ссылку, отложил на «почитать попозже», через три года добрался.

Интерактивный гайд про цвета и контраст. Нейт Болдуин собрал много знаний и демок про различные аспекты цвета и его восприятия:
- как работает глаз;
- какие есть особенности восприятия цветов у людей;
- что такое адаптация;
- из чего состоит цвет;
- как смешивать цвета;
- цветовые модели и цветовые пространства;
- как использовать цвет для графиков.

И ещё много всего. Времени на полное прочтение надо больше, на чтение одной статьи, конечно, но оно того стоит, если вам интересно и важно уметь работать с цветом, а теории не хватает.

https://colorandcontrast.com/
🔥32👍8💯32
Записи докладов MinskJS #12

Видео выходного дня. Опубликовали записи докладов с недавнего митапа одним плейлистом.

Напомню, о чём говорили:
- Лёша Назаренко рассказал, что такое веб-компоненты в современном фронтенде.
- Глеб Казачинский показал, как писать веб-компоненты на популярных фреймворках.
- Настя Котова научила разбираться, откуда берутся ошибки node-gyp при установке npm-зависимостей.

https://www.youtube.com/playlist?list=PL-whh3wS8xsKuQdPIESXp0xR1A7tinzkT
🔥229👍3❤‍🔥1🎉1
User Agent Plus

Мануэль Матузович собрал «другой» reset.css, цель которого — улучшить существующие стили юзер-агентов (браузеров). Каждый селектор подробно объясняется. Есть как привычное выставление box-sizing: border-box; всему на странице, так и хитрый тюнинг привычных вещей. Например, осознанное усиление атрибута hidden.

Мне здесь понравилось умелое использование селектора :where(), который никак не увеличивает специфичность. Это такой умный дефолт, который очень легко переопределить при необходимости.

https://fokus.dev/tools/uaplus/
👏29👍10🎉32🔥2👌1
Упрощаем шаринг прогрессивным улучшением и встроенными API

Энди Белл по шагам собирает блок шаринга для страницы. В нём две кнопки: Share и Copy URL. Всё это обёрнуто в веб-компонент, который можно легко под себя адаптировать. Посмотреть за ходом мысли автора, как он идёт от выключенного JavaScript к готовому компоненту, точно будет полезно.

От себя добавлю, что компонент скорее удобен для мобильных ОС, потому что на них нативный шаринг более-менее удобный и привычный. А вот на macOS нативное меню шаринга — какое-то недоразумение. На Windows тоже смотрится странно. Для десктопа я бы переделал как тут: https://mefody.dev/chunks/social-sharing-html-only/.

https://piccalil.li/blog/simplify-sharing-with-built-in-apis-and-progressive-enhancement/
👍174🤔1
Стилизация счётчиков и списков в CSS

Хуан Диего Родригез собрал большой гайд по тому, как стилизовать маркеры списков, создавать свои счётчики, соединять счётчики и списки. Всё это с указанием браузерной поддержки и примерами.

Современные счётчики и списки умеют много всего. Это уже давно не просто список предустановленных маркеров с арабскими и римскими числами, буквами и геометрическими фигурами. Директиву @counter-style, например, крайне рекомендую к ознакомлению.

https://css-tricks.com/styling-counters-in-css/
👍24🔥141
Express@5.1.0: теперь LTS и дефолт при установке

Сразу две новости в одной.

Во-первых, теперь при установке npm install express без фиксации версии будет приходить версия 5.1.0+. До 1 апреля всё ещё приходила версия 4, потому что 10 лет без мажорного релиза — это достаточно долго, чтобы осторожничать. За что команде Express спасибо.

Во-вторых, версия 5 получает статус LTS, а 4-я версия уходит в поддержку до 1 октября 2026 года. Повод обновиться.

Подробнее, что же изменилось в Express и зачем стоит обновить мажор в активных проектах, по ссылке.

https://expressjs.com/2025/03/31/v5-1-latest-release.html
👍18🥴9🙏2🌚2🤣2💔1
Никогда не проигрывай битву с z-index

Мануэль Матузович делится вредным, но рабочим советом. Если вам надо сделать так, чтобы элемент был по z-index выше остальных, а с контекстами наложения разбираться лень — z-index: calc(infinity) в помощь. Всё лучше, чем выбирать между 9999 и 99999.

Тут же Мануэль подсвечивает, что z-index: 2147483647 всё-таки может оказаться выше, чем z-index: calc(infinity), если в DOM идёт позже в том же родителе. Потому что это 2^32-1, верхний предел значения свойства по его типу данных

Почему совет вредный: потому что если вам приходится задумываться о таких решениях, то явно пора разобраться с тем Z-Index Hell, который у вас в проекте развёлся. Для меня сигналом разобраться часто является уже z-index: 2.

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

https://matuzo.at/blog/2025/never-lose-a-z-index-battle-again
👍33😁24💯71
fetchLater API

В Chrome 135 вышла из Origin Trial интересная апишка. Появился метод fetchLater, который принимает почти все те же аргументы, что и обычный fetch, но браузер отправит запрос попозже, а точнее в самое раннее из наступивших событий:
- документ уничтожен;
- прошло заданное пользователем время;
- браузер решил, что пора отправлять.

Третий пункт, конечно, самый интересный, но в эксплейнере буквально так и написано, конкретных подробностей найти не смог.

Для чего это может быть полезно? Маячки, замена sendBeacon. Иногда нужно отправить запрос, не обрабатывая его результат. Например, для продуктовой аналитики или сбора метрик перфоманса. Частый кейс: нужно отправить на сервер событие, когда пользователь закрыл вкладку. И тут мы научились картинки быстро вставлять в DOM на beforeunload, и fetch дёргать на веру, и специальным методом sendBeacon пользоваться. Но все эти методы не дают вообще никакой гарантии, что запрос будет отправлен. А хочется иметь специальное место в жизненном цикле страницы, где запрос всё-таки будет отправлен в любом случае.

Вот для этого и придумали fetchLater. Причём это не самоуправство Chrome мимо спецификаций, а вполне себе коллективная работа всех мажорных браузеров, Firefox и WebKit эксплейнер одобрили.

Но спеки, справедливости ради, пока нет. Есть черновой черновик спецификации, эксплейнер на гитхабе и дизайн-документ для Chromium. Тем не менее в эксплейнере есть хорошие примеры, как новый API можно применять — их можно расширить под ваши нужды аналитики.

https://chromestatus.com/feature/4654499737632768
👍44🔥153🤬3
Сбалансированные строки для японского и корейского языков

Мы в подкасте периодически обсуждаем, какой text-wrap: balance хороший для заголовков. Я к себе в блог это свойство затащил почти сразу, как про него узнал.

А вот Келли Чойс-Дван подсвечивает интересную проблему. Для языков, где есть пробелы как разделители слов, text-wrap: balance и правда хорош. Но есть языки, где пробелы либо не используются вовсе, либо есть разные подходы, в том числе и без пробелов. Например, в японском и корейском языках тексты без пробелов — вполне себе норма.

Допустим, у вас есть текст на японском, что-то вроде «Замечательный текст». И наведение красоты приводит к двум строчкам «Замечател / ьный текст». Что делать?

В Chromium-браузерах есть word-break: auto-phrase. Такая конструкция просит браузер проанализировать текст и не вставлять разрывы посреди слов. Под капотом у этого свойства machine learning, поддерживает далеко не все языки.

Как фолбек можно применить word-break: keep-all. Это специальное значение как раз для CJK-текстов (Chinese/Japanese/Korean), которое выключает разрывы слов для них в принципе.

Ну а вообще интересно было бы поизучать опыт японских или корейских пользователей. Ведь мы же как-то читаем сайты с дефисами-переносами для длинных слов, hyphens: auto, все дела. Возможно, если для удобства чтения сайта важно сохранять фразы на одной строке, то надо расставить переносы строк руками, а не доверять это дело автоматике, заточенной под англоязычный мир.

https://ryelle.codes/2025/04/typography-troubles-balancing-in-japanese-korean/
👍19❤‍🔥2😐21
Nikita_Dubko_-_Loading_-_Dump2025.pdf
53.4 MB
«Идёт загрузка…», или Как доставлять нужное вовремя

Только что прочитал на Dump 2025 в Екатеринбурге доклад про то, на что можно обратить внимание, если хочется или нужно оптимизировать загрузку сайта. Постарался собрать большой список интересностей, про которые можно почитать подробнее по ссылкам из слайдов. Делал упор не на стандартные «включите gzip, ужмите картинки, разделите бандл», а на то, про что говорят реже.

Собственно, сами слайды прикреплены к посту. А видео доклада выложу сразу же, как со мной им поделятся организаторы.
81🔥473
Перевод строки как часть атрибута

Как-то я никогда особо не задумывался, а вот Теренс Иден взял и задумался, как ведёт себя перевод строки в HTML-атрибутах.

Кажется, что символ новой строки должен вести себя как пробельный символ. Потому что я видел похожие записи, которые работали:


<a href="/" class="
link
link--active
space-between
">Some text</a>


И да, для классов это работает. Как и для многих других атрибутов. Селектор по классу сработает, стилизация применится.

Для атрибутов noscript и placeholder перевод строки сохраняется, ни на что не заменяется. Что тоже логично, потому что это «визуальные» атрибуты, их контент каким-то образом показывается пользователю, поэтому менять в них что-то автоматически было бы неправильно.

А вот для id уже есть нюанс.


<p id="test
">Hello</p>


Здесь селектор не test, а test\n. То есть банальная опечатка сломает стили. Ну или не опечатка, а странное форматирование кода в проекте. Надо быть внимательнее.

https://shkspr.mobi/blog/2025/04/html-oddities-is-a-newline-just-another-whitespace-in-attribute-values/
👍35🤔12🤯85🥴4
Что делает "use client"

Дэн Абрамов на примерах объясняет, чем отличаются директивы 'use client' и 'use server' в React. Я думал, что понимал, как оно приблизительно работает под капотом, а оказалось, что не до конца понимал.

Напомню, в React 19+ добавили такую сущность, как React Server Components. И если вы хотите явно разделить логику на серверную-клиентскую, то можно добавить «магические» директивы 'use client' и 'use server', компилятор их особым образом обработает, расставит правильные импорты-экспорты по коду, обмажет абстракциями, а потом оно у вас всё вместе в теории возьмёт и заработает.

Понравилось сравнение Дэна этих директив с дверьми: они соединяют один мир с другим. И примеры кода понятные и простые.

https://overreacted.io/what-does-use-client-do/
👍26🥴13🤯5❤‍🔥41
GSAP теперь бесплатный*

Есть такой крайне мощный инструмент для работы со сложными анимациями, называется GSAP. Расшифровывается как GreenSock Animation Platform. И с ним всегда были нюансики по коммерческому использованию, нужно было покупать лицензию за $99 в год или дороже, чтобы всё было честно. В целом, за то обилие функций, которые GSAP позволяет применять, цена вполне нормальная.

В октябре прошлого года их купил Webflow. И вот на днях они объявили, что теперь GSAP на 100% бесплатный, в том числе для коммерческого использования. Очень крутая новость для всей индустрии, имхо. Заодно бесплатными стали плагины, которых у GSAP много.

Но не просто так в заголовке поставил звёздочку. Лицензия у GSAP никуда не делась, соблюдать её правила всё ещё нужно. И там есть пара пунктов, которые всё равно стоит учесть, прежде чем радостно тащить в коммерческий проект:
- Ваш продукт не должен выдавать что-то похожее на визуальный редактор как у Webflow.
- В любой момент Webflow оставляет за собой право изменить лицензию. Правда, обещают что любое обновление не должно ухудшить ваш опыт использования GSAP, что бы это ни значило.

В общем, хороший повод попробовать поиграться с библиотекой, если до этого вас сдерживала только цена на лицензию.

https://webflow.com/blog/gsap-becomes-free
🔥53👍12🤯61👏1
Тени для подскролла через Scroll-Driven анимации

Часто в интерфейсах встречается такой приём: если есть скролл на внутреннем элементе страницы, то чтобы пользователь на устройствах с невидимым скроллом осознал его наличие, рисуют тень. Раньше-то всё просто было: показывается здоровенная колбасина скролла на карусельке — значит, тут можно подскроллить. А теперь скролл на мобилках сам прячется, на macOS и разных линуксах — тоже, нужно пользователям как-то намекать, что блок не обрезан, а скроллится.

Такой приём требует понимания, когда показывать тень. Обычно для этого используется простенький JS-скрипт, который проверяет позицию скролла. Кевин Хеймер же предлагает использовать исключительно CSS и относительно новое свойство animation-timeline. Например, можно завести кастомное свойство --left-fade для левой горизонтальной тени, а внутри анимации, привязанной к скроллу, менять его значение на что-то, что показывает или прячет тень. Привязаться к скроллу можно так:


.scrollable {
overflow-x: scroll;
animation: scrollfade;
animation-timeline: --scrollfade;
scroll-timeline: --scrollfade x;
}


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

https://css-tricks.com/modern-scroll-shadows-using-scroll-driven-animations/
👍30🔥11🌚411🤨1
ARIA Notify в Microsoft Edge

Сел я, значит, оформлять пост про интересную апишку, которую Edge у себя за флагом внедряет, отвлёкся на работу, а Лёша Назаренко за это время написал пост у себя, подробный и с примерами.

Попробую коротко описать. Для зрячих пользователей есть привычный паттерн привлечения внимания — нотификации. Случилось что-то — рисуем всплывашку на половину вьюпорта, чтобы пользователь точно про это узнал. А незрячим сложнее, у них где-то стоит фокус курсора, а что вы там в DOM обновляете/добавляете/убираете, скринридер не озвучивает.

Есть специальный атрибут aria-live, который помечает DOM-узел так, чтобы скринридер за ним подглядывал. Поменялся внутри контент — случилась озвучка. Легальный способ озвучить нотификации. Но не очень удобный с точки зрения DX.

В Edge же за фичефлагом добавили метод ariaNotify("Some text", { "priority":"high" }), который позволит делать то же самое, но удобнее.

А подробнее — в посте у Лёши.

https://news.1rj.ru/str/alexnozer_dev/235
👍286🔥3
Маленькие помощники

Нашёл в закладках классный сайт от Стефана Джадиса. На нём собраны различные онлайн-инструменты, которые могут быть полезны веб-разработчикам. Один инструмент — одна функция, почти без комбайнов и швейцарских ножей.

Когда добавлял сайт в закладки очень давно, там было меньше сотни инструментов. Сейчас их аж 645. И вы можете добавить новые, там кнопка для этого есть.

https://tiny-helpers.dev/
❤‍🔥43👍14👏21
Цвета для людей и машин

Шикарная статья Полины Гуртовой на MDN про то, что такое цвет с точки-зрения веб-разработки:
- Как цвета работают для глаза и мозга.
- Почему существующие цветовые модели и цветовые пространства такие, какие они есть.
- Что такое YUV.
- Как камеры воспринимают свет и превращают его в файлы.
- Чем отличаются HDR и SDR.
- Белочки.

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

https://developer.mozilla.org/en-US/blog/color-models-humans-devices/
👍31🔥116
Event Loop крутится, Node.js мутится

Цикл статьей от Анастасии Котовой про то, как устроен Event Loop, с фокусом на Node.js:
- Часть 1. Браузер VS сервер
- Часть 2. Нюансы работы Event Loop
- Часть 3. За пределами Event Loop
- Часть 4. HTTP-сервер
- Часть 5. Настоящая многопоточность
- Часть 6. Профилировать и замерять

Я последний раз погружался в особенности Event Loop довольно давно, для рабочих задач знаний хватало. До качественного профилирования так и не добрался. А тут Настя накинула хороших советов, рекомендую.

Кстати, можно подписаться на её канал, годнота: https://news.1rj.ru/str/startpoint_dev
❤‍🔥52🔥20👍83😁2