Пульс веб-платформы 02.05.2025


Новости

  • зарелизился Firefox 138:
    • в сам браузер добавили профили пользователей, а также раскатили на всех группы табов
    • добавили поддержку Import Attributes (теперь поддерживается везде), а также Error.isError
    • как и обещали, поправили дефолтную стилизацию вложенных элементов <h1>
  • а так же радостная новость: в FF 139 (уже есть в ночной сборке 140) появится поддержка View Transition API (теперь будет поддерживаться везде!)
  • вышел Nuxt 3.17:
    • докрутили фетч данных: теперь при использовании useAsyncData или useFetch запросы будут шарить один и тот же реф на данные по одинаковому ключу между всеми компонентами
    • в нескольких компонентах, использующих одинаковый источник данных, рефетч будет происходить только один раз при изменении зависимостей
    • в качестве ключей в запросах теперь можно использовать реактивные примитивы (рефы, computed-ы или геттеры)
  • вышла бета Storybook 9: в инструмент вовсю интегрируют запуск всевозможных тестов (UI, интерактивность, доступность, скриншоты), сынтегрировались с Vitest, поддержали React Native
  • в Chrome передумали блокировать 3rd-party куки по умолчанию (не смогли со всеми договориться), всё останется как есть сейчас (можно вручную отказаться в настройках браузера), а также пообещали в Incognito-режиме добавить маскировку IP-адреса устройства
  • и ещё про Chrome: в грядущей принудительной продаже браузера покупателем может стать OpenAI (если так случится, то скорость изменения индустрии ещё больше ускорится)
  • вышел GSAP 3.13: на удивление, фаундеры и ментейнеры до их покупки Webflow, никуда не ушли, а продолжают пилить проект; с этим релизом в GSAP сделали все ранее платные плагины бесплатными, а заодно и дропнули премиальный клуб GSAP
  • со стороны Microsoft поступило предложение расширить console методом context(), чтобы иметь возможность группировать и стилизовать в консоли дев-тулзов портянку разносортных логов
  • для V8 (начиная с Chrome 136) внутри JS-файлов можно указывать спец-коммент для компилятора //# allFunctionsCalledOnLoad, чтобы явно указать движку, что этот скрипт нужно распарсить и скомпилировать сразу же при первой встрече, а не тогда, когда потребуется выполнение определённой функции из этого скрипта

Проекты

  • kermit-font — прикольный «детский» шрифт в духе Comic Sans (поддерживается кириллица, есть вариативность)
  • unbuilt.app — реверс-сервис, находящий по артефактам в коде сайтов, какие технологии использовались для их создания
  • srvx — универсальный сервер с единым синтаксисом для Deno, Bun, Node.js
  • component-template — если уж теперь LLM расширяют наши возможности, почему бы не попробовать начать писать веб-компоненты? Вот как раз и стартовый шаблон подходящий нашелся.

Статьи, мнения, туториалы

JS/TS

  • из всех способов вывести что-то как строку, менее подверженный ошибкам — {}.toString.call(v), но в большинстве случаев подойдёт String(v), но он, в свою очередь, не выведет содержимое объекта; для этого подходит JSON.stringify(), но тоже со своими ограничениями
  • возьмём дерево компонентов в React: обход и рендер происходит начиная с родителей «вглубь» детей, а применение эффектов (useEffect) — на «обратном» пути обхода, «вверх» от детей к родителям
  • если вам для управления зависимостями в package.json недостаточно dependencies и devDependencies и хочется добавить категории, можно использовать PNPM Catalogs для группировки: хоть фича изначально для монореп, но она помогает разделить пакеты и внутри одного репо по категориям (test, frontend, types, lint…)
  • рецепт, как просто на коленке, без сторонних зависимостей хранить дизайн-токены в JSON, а транслировать в CSS в виде переменных в :root {}
  • устанавливать пакеты из JSR вместо npm, уже умеет pnpm 10.9+ и yarn 4.9.0+
  • рубрика «что хотел сказать автор» от Дэна Абрамова про RSC продолжается: директива 'use client' делает компонент доступным серверу через <script>, чтобы он мог его предвыполнить, а 'use server' экспортирует серверные функции на клиент, чтобы их можно было вызвать асинхронно в RPC-стиле
  • все эти ваши сайты — это для людей, а для машин достаточно склеенной текстовой портянки (пример от Bun)
  • парочка кандидатов на переопределение в дефолтных настройках TanStack Query:
    • количество ретраев по умолчанию равно 3, что не всегда ок, например, если используется внутри тестов ошибок (увеличивается время выполнения тестов) → меняем число ретраев на 0
    • время инвалидации кеша по умолчанию небольшое, часто происходит бесполезные перезапросы, а если вы уверены, что ответ от внешнего сервиса точно не будет меняться, перезапросов можно избежать → staleTime: Number.POSITIVE_INFINITY

CSS

  • как подтюнить анимации, чтобы они из просто хороших стали великолепными:
    • не забыть настроить transform-origin с той стороны, откуда анимация визуально начинается
    • подобрать более натуральный изинг: хотя бы ease-out, а лучше кастомную «пружинную» функцию
    • при реализации динамического выделения табов лучше применить clip-path, чем просто менять цвет текста и заливки
  • единица измерения lh хороший (и доступный с 2023 года везде) способ не мучиться с em для задания межстрочных отступов:
p {
margin-block: 1lh;
}
  • скруглённые углы в CSS есть уже давно, но их по-прежнему может не хватать для непрямоугольных форм, тогда в дело вступает давно забытое искусство подставления скруглённых уголочков на фон блока (только вместо png-картинок выступают радиальные градиенты)

HTML

  • для реализации кликабельной картинки-карты с интерактивными областями может подойти древняя пара тегов <map> и <area>, но могут быть проблемы с респонсивом, поэтому то же можно реализовать в чистом SVG (ведь внутрь групп в качестве обёртки для форм в SVG можно включать ссылки <a>)

Платформа

  • ещё один тейк, на этот раз от Addy Osmani, про деградацию скиллов при неразумном использовании AI-тулов: самое плохое — отваливается критическое мышление, не менее неприятное — общения между разработчиками становится меньше
  • для гита можно настроить глобальный игнор-конфиг для всей системы, на маке/линуксе лежит в ~/.config/git/ignore
  • чтобы при табе появление фокуса происходило на инпутах не с левого верхнего угла экрана, а на определённом месте, нужно просто перед табом кликнуть где-то неподалёку