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

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

Не размещаю рекламу в своём канале. Даже за деньги. Даже большие.
Download Telegram
llms.txt

Если готовить сайты для поисковиков мы уже давно научились (SSR, sitemap.xml, robots.txt и прочее), то для LLM пока только учимся.

Полина Гуртовая поделилась интересной ссылкой на пропозал 2024 года. Если сайт хочет быть обработанным LLM-краулером, то достаточно в корень сайта положить файл /llms.txt с текстовым представлением всего, что нужно знать о сайте. Оформлять можно в Markdown, роботы с ним очень хорошо работают.

Пока что это пропозал от отдельного комьюнити, формально в процесс стандартизации от W3C или WHATWG его даже тяжело поместить, так как сфера AI ещё слишком юная, стандарты придумываются на ходу. Но тем не менее даже без стандарта наличие такого файла не повредит. Скоро SEO превратится в LLMEO, можно начать готовиться.

https://llmstxt.org/
💯26👍16👏94🤨4🤩1🌚1
Блобы на CSS

Не уверен, как корректнее перевести Blob. Капля, пятно, клякса? Пусть будет блоб.

Хуан Диего Родригез делится тремя способами сделать блобы на CSS.

1. С использованием border-radius. На всякий случай напомню, что в это свойство можно передать аж 8 значений для разных осей, таким образом можно создать что-то похожее на пятно. Но оно всегда будет выпуклое, впуклости таким образом не нарисовать.

2. SVG-фильтры. Популярный рецепт: рисуете фигуры любым способом, добавляете размытие по Гауссу и фильтр контрастности. Размытие уберёт чёткие границы, а контрастность придаст блобу форму.

3. Новая функция shape(). Тут всё просто: как нарисуете, так и будет выглядеть.

Мне пока больше всего нравится способ №2 для анимаций, когда на фоне капли сливаются и перемещаются. Но устройства от таких анимаций начинают греться. А способ №3 пока не везде работает, нужно ждать Baseline Widely Available, чтобы не бояться.

https://css-tricks.com/css-blob-recipes/
👍219😱1
WebVM

Если что, это не название очередного формата видео или изображений, а Web Virtual Machine. Linux x86 в браузере.

То есть где-то есть сервер на Linux, на котором запущен сайт, в котором открывается виртуальная машина Linux, на которой можно запустить сайт...

На самом деле, это хороший пример того, как современные возможности браузеров и WebAssembly в частности позволяют запускать в вебе почти что угодно. В 2022 году, когда я первый раз услышал про WebVM, в нём работал только консольный режим. А сейчас есть полноценная графическая оболочка и поход в сеть. Впечатляет.

Из полезных применений:
- Обучение основам Linux без установки ОС.
- Удобный дебаг линуксового в Windows и не только.
- REPL для кода без боязни сломать систему.

Если захотелось внедрить к себе, внимательно ознакомьтесь с лицензией на CheerpX, который, как я понимаю, всё-таки платный для коммерческого использования.

https://github.com/leaningtech/webvm
🔥29😱84👍2💯2❤‍🔥1🐳1
TypeScript 5.9 Beta

Команда TypeScript занимается не только миграцией на Go, но и добавляет новые функции.

- Обновили поведение tsc --init. Если раньше создавался tsconfig.json с избыточным количеством опций, то теперь по умолчанию собирается компактный конфиг с несколькими закомментированными блоками. Если нужно добавить ещё, можно изучить опции на сайте.

- Поддержали import defer * as … from …; — новую возможность EcmaScript по отложенному выполнению модуля.

- Для совместимости с особенным поведением модулей в Node.js 20 добавили флаг --module node20. Напомню, в 20-й ноде можно через require() импортировать ES-модули внутри CommonJS-модулей.

- Для DOM API рядом со ссылкой на документацию в MDN добавили краткое саммари, основанное на этой документации. Удобно, меньше отвлечений в состоянии потока.

https://devblogs.microsoft.com/typenoscript/announcing-typenoscript-5-9-beta/
🔥18👍135
Satisfies в TypeScript

Адам Ракис на примерах объясняет пользу ключевого слова satisfies в TypeScript.

Если коротко, это что-то вроде assert для типов. Представьте, что у вас есть тип с опциональным полем.


type Item = {
name: string;
denoscription?: string;
};

function insertItems(items: Item[]) {}

insertItems(
backendItems.map(item => {
return {
name: item.item_name,
denoscription_new: item.item_denoscription,
};
})
);


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

Как словить эту ошибку вовремя? Помимо явного указания типов вообще везде, где только можно вписать тип, можно сделать так:


insertItems(
backendItems.map(item => {
return {
name: item.item_name,
denoscription_new: item.item_denoscription,
} satisfies Item;
})
);


Здесь TS проверит реальное соответствие типу и ругнётся на лишнее поле. При этом автовыведение типов всё ещё работает.

Подробнее — по ссылке.

https://frontendmasters.com/blog/satisfies-in-typenoscript/
👍469🔥4
Марсианский LaunchKit

Давайте уже признаем, что лендинги технопроектов почти все одинаковые. Сверху Hero-картинка, дальше кнопка большая продающая, затем карточки с иконками и числами, потом FAQ и ссылки на соцсети. Отличается только наполнение. И по мне так это даже хорошо: я сразу знаю, где мне искать нужную мне информацию.

Злые Марсиане собрали готовый шаблон, который можно просто взять и склонировать на GitHub. Статика, в которой достаточно заменить контент — работать будет быстрее любых генераторов React-сайтов. Если нужно изменить стили, в репозитории есть инструкция.

https://launchkit.evilmartians.io/
151🔥26👍10😁4😐2🌚1🏆1
Почему важно знать про перфоманс-плато

Тэмми Эвертс рассказывает о таком эффекте, как плато производительности. Это ситуация, когда вы ускоряете метрики Core Web Vitals, делаете LCP на несколько секунд быстрее (это много) — а метрики бизнеса почти никак при этом не меняются.

Например, есть такая метрика, Bounce Rate — процентное соотношение тех, кто покинул сайт после просмотра первой страницы, к общему количеству посетителей. Ей часто пользуются маркетологи и продакт-менеджеры. Она должна быть низкой.

Так вот, если у вас на сайте LCP был равен 10 секундам, а стал 4 секунды, то Bounce Rate может никак не измениться. Потому что пользователям всё равно слишком медленно. А вот если был 4 секунды, а стал 2 секунды, то может внезапно измениться кардинально. Один и тот же сайт, одни и те пользователи, но после некоторой отметки хуже уже не сделать.

И что вам делать с этой информацией? На самом деле, если вы любите оптимизировать перфоманс страниц, то можно собрать графики на реальных пользовательских данных, на которых совместить метрики Core Web Vitals и продуктовые метрики. Так у вас появится доказательная база, почему в производительность нужно (или не нужно) вкладываться. Ни один адекватный менеджер не проигнорирует собранные данные, по которым будет видно, что вклад ресурсов в быструю загрузку страницы может вырастить бизнесовые метрики без новых доработок продукта.

А дополнительно вы будете знать, почему иногда значительные усилия по оптимизации производительности не приносят значимого результата — потому что нужно ещё больше оптимизировать. Либо у вас и так всё оптимальнее некуда, но это скорее исключение из правил.

https://www.speedcurve.com/blog/web-performance-plateau/
👍264🤔3💯2
new Date("wtf")

Думаете, что знаете, как работает класс Date в JavaScript? Пройдите тест.

Набрал 8/28 верных ответов. И очень радуюсь, что с нами Temporal.

https://jsdate.wtf/
😁60😱23🤬4💔3❤‍🔥11🔥1🌚1
Ленимся с view-transition-old и view-transition-new

Сид Штумпель на демках показывает, как View Transition API помогает делать красивые преобразования списков минимумом кода.

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

Что по дефолту делает View Transition API с элементами, на которые он завязан:
- Считает координаты и размеры элемента до перехода.
- Считает координаты и размеры элемента после перехода.
- Делает плавную анимацию изменения размеров и координат через прозрачность и режимы смешивания во время перехода.

Получается, для красивых анимаций внутри списков вам всего лишь нужно разметить при помощи CSS элементы этого списка как анимируемые (через view-transition-name и подобные свойства). Profit!

https://cydstumpel.nl/being-lazy-with-view-transition-old-and-new/
🔥384❤‍🔥3👍1🥴1
Архитектура Local First для фронтенд-приложений

Видео выходного дня. Андрей Кобец в докладе сравнивает классический клиент-серверный подход с подходом Local First.

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

Проблемы синхронизации распределённых БД — это отдельный вид удовольствия, но вам по сути и не нужно их решать, так как уже есть много готовых инструментов.

Андрей делится примерами, как с такими решениями уже можно работать, в том числе гибридно с классическим Online First подходом, когда для некоторых операций без интернета всё-таки не обойтись.

https://youtu.be/ztygkgtIZYc
1🔥3811❤‍🔥7
State of HTML 2025

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

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

https://survey.devographics.com/ru-RU/survey/state-of-html/2025
🎉13🌚3👍21🐳1
Дружелюбное введение в SVG

Джош Камю с хорошим туториалом для новичков по основам SVG. На интерактивных демках показывает, как рисовать линии, прямоугольники, круги, эллипсы и полигоны. Заодно объясняет отличие атрибутов width и height от viewBox. И не только.

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

https://www.joshwcomeau.com/noscript/friendly-introduction-to-noscript/
👍4212🔥4🎉1🐳1
React Bits

Как написано на сайте, это анимированные React-компоненты для креативных разработчиков.

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

Осторожно: обнаружены WebGL и шейдеры.

https://reactbits.dev/
🔥47👍10🥴9🎉72🤬2🤯1🙏1💔1
Негладко про функции сглаживания

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

С демками на канвасе.

https://www.davepagurek.com/blog/easing-functions/
18💯5👍2
Разбираемся в Performance Extensibility API

Если вам нужно глубоко погружаться в детали перфоманса веб-приложения на клиенте, во вкладке Performance в Chrome DevTools появился Extensibility API.

Гарри Робертс показывает на примерах, как его применять. Например,


performance.measure('cssTime', {
start: 'cssStart',
end: 'cssEnd',
detail: {
devtools: {
track: 'CSS',
color: 'secondary-dark',
tooltipText: 'External CSS fetched and parsed',
properties: [
['URL', `app.css`],
['Transferred Size', `29.3 KB`],
['Decoded Body Size', `311.8 KB`],
['Queuing & Latency', `104 ms`],
['Download', `380 ms`]
]
}
}
});


Такой код создаст в отладочной панели трек CSS, внутри трека — «колбаску» с замером от отметки cssStart до отметки cssEnd тёмного цвета, которая будет подписана лейблом External CSS fetched and parsed. По клику на «колбаску» можно будет посмотреть дополнительные данные, переданные в properties.

По сути старые методы performance.mark() и performance.measure() обрастают возможностями, которые есть у нативных замеров. Теперь разработчик может создать себе заметные визуальные зацепки с деталями, которые сделают отладку производительности ещё более удобной.

https://csswizardry.com/2025/07/the-extensibility-api/
👍28🔥125😐1
Шрифты для вайрфрейминга

Иногда нужно нарисовать прототип, не заморачиваясь с наполнением и текстом. Вайрфрейм.

Крис Койер делится набором шрифтов, которые имитируют текст или заменяют его плейсхолдерами.

https://frontendmasters.com/blog/fonts-for-wireframing/
1👍27🔥52🤯1
Симуляция движущихся рисунков от руки при помощи SVG-фильтров

Знаете такой приём в анимации, когда статический объект слегка меняется текстурно, из-за чего получается эффект движения без движения? В 2d-мультфильмах такое бывает.

Камилло Визини показывает, как сделать такое на SVG-фильтрах:
1. Сначала собираем фильтр feTurbulence, чтобы добавить шум.
2. Затем добавляем feDisplacementMap, который применяет сгенерированный шум на картинке для искажений.
3. Меняем параметры для фильтров из п. 2 и п. 3 по таймеру — анимируем.

Эффект получается классный, для сайтов в стилистике рисунков от руки или презентаций вообще топ.

https://camillovisini.com/coding/simulating-hand-drawn-motion-with-noscript-filters
1🔥31👍6👏32
Проблема с figcaption

Представьте вполне себе привычную, довольно семантичную вёрстку для картинок с подписями.
<figure>
<img src="image.jpg" alt="доступное описание">
<figcaption>Длинный-длинный текст, который по ширине значительно превышает ширину самой картинки</figcaption>
</figure>

Крис Койер задаётся вопросом, как сделать так, чтобы:
1. Картинка могла быть любой ширины, но не превышала размер контейнера.
2. Подпись в figcaption подстраивалась по размеру к ширине картинки.
3. Всей этой конструкции можно было добавить красивую обводку.

Простая на первый взгляд задача на самом деле имеет свои заморочки. В статье есть несколько решений.

https://frontendmasters.com/blog/the-figcaption-problem/
👏164😱2🌚2👍1
Данные о пикселях от энкодеров к декодерам

Полина Гуртовая продолжает понятным языком объяснять, как устроены изображения.

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

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

https://developer.mozilla.org/en-US/blog/image-formats-pixels-graphics/
🎉21👍9❤‍🔥61🤯1
Библиотека визуализации графов: Canvas vs HTML в Gravity UI

Команда дизайн-системы Gravity UI столкнулась с интересной задачей: отрисовать графы с 10000+ интерактивными компонентами, чтобы страница не зависала намертво. Во всяких админках пайплайнов, CI/CD, модных нынче n8n есть такой тип интерфейса, когда вам нужно на холсте нарисовать много всякого кликабельного и двигабельного, чтобы ещё оно всё стрелочками было соединено с подписями.

Андрей Щетинин рассказывает, почему это всё ещё удобно делать на HTML+CSS для маленького числа компонентов, какие проблемы есть при реализации альтернативы на Canvas и зачем пришлось делать свою библиотеку, которая автоматически переключается с HTML+CSS на Canvas и обратно, сохраняя 60 FPS.

На самом деле редко вижу такие интересные технические статьи с подробным разбором плюсов и минусов различных подходов. Обычно про это доклады делают. А здесь и теория, и практика, и демки.

https://habr.com/ru/articles/934562/
2🔥466