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


Новости

  • закрывается браузер Arc: создатели переключились на другой браузер (с AI) Dia, под капотом тоже Chromium и проприетарная платформа для создания браузеров, которую опенсорсить не собираются
  • также закрывается проект Glitch (браузерный редактор веб-приложений + хостинг) после 10 лет работы
  • в ESLint провели ретроспективу выкатки flat-config-а с 2019 по 2024, выявили основные ошибки: слишком много ломающий изменений за раз, слишком много документации и отсутствие тулинга автомиграции, медленное впитывание новой версии экосистемой, отказ от двойных конфигов (надо было поддержать, востребовано авторами плагинов)
  • господа из React Router поддержали в RR React Server Components, а также решили воскресить Remix (в лучших традициях рестлинга) да не просто так, а сделать его полностью независимым, даже от React (внутри будет форк Preact): теперь стало понятно, что этот проект — экспериментальная площадка, чтобы проверять крейзи-фичи и затем интегрировать их в «стабильный» RR
  • вышел Chrome 137:
    • поддержали функцию if() в CSS: background-color: if(style(--color: white): black; else: white)
    • внедрили свойства reading-flowreading-order для указания порядка чтения элементов скринридерами в флекс-/грид-лейаутах
    • заработала функция shape() для указания направления в свойстве offset-path
    • для SVG-элементов теперь можно управлять трансформацией через атрибут transform
    • добавили значение view-transition-name: match-element, чтобы автогенерировать название вью-транзишна вместо хардкода или задания из JS
  • вышел Firefox 139.0:
    • из коробки работает Temporal proposal (прикол в том, что для движка SpiderMonkey поддержку реализовал один чел, опенсорсный контрибьютор, который не работает в Mozilla)
    • поддержали атрибут hidden=until-found
    • в экспериментальных фигах за флагом приехали: View Transition API, scheduler.yield()
  • вышла новая версия Bun v1.2.14:
    • позаимствовали фичу catalogs: из pnpm для создания алиасов для группы зависимостей
    • добавили флаг bun init --react для быстрого разворачивания шаблона React-проекта и дев-сервером на Bun
  • вышла новая версия JSPM 4.0 (import map package manager): внутри команды для безконфиговой сборки и сервинга проекта, поддержка нативного TS «со стриппингом», импортмапы средствами браузера — звучит знакомо? да, потому что контрибьютор JSPM и ES Module Shims — один и тот же человек, Guy Bedford
  • вышел Angular 20:
    • стабилизированы реактивные фичи effectlinkedSignal и toSignal
    • добавлена экспериментальная поддержка фетчера httpResource()
    • причёсан SSR

Проекты

  • ForesightJS — либа для предсказания действия пользователя по движению курсора (префетч ресурсов по ховеру — слишком поздно, а по вьюпорту — запрашивается лишнее; с этой либой можно префетчить раньше и более точечно)
  • snapdom — либа для снятие скриншота с DOM-ноды, как в дев-тулзах, только отдельной либой (и без папеттира внутри)
  • icons — бесплатные анимированные SVG-иконки для React с использованием motion
  • enum-converter — пример работы  TypeScript Transform API — конвертер Enum в type alias

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

JS/TS

  • реактовский useSyncExternalStore можно использовать не только для хранения каких-то бизнес-данных (типичный стор), но и для «UI»-информации, например, данных о window.matchMedia: подписываемся на 'change' состояния экрана, записываем в «стор», в React-компоненте юзаем этот стор
  • как избегать проблемы циклических импортов между компонентами с помощью здравого смысла, а также инверсии зависимостей (меняем прямое использование на пропы) на примере методологии FSD
  • в связи с начавшейся раскаткой Temporal в браузерах (FF — первый) пора знакомиться, если ещё не, тем более, есть полифилл
  • краткая история JS с уклоном в Райана Даля, Node и Deno: в 2025 JS исполнилось 30 лет, JSDoc — 26 лет, JSON — 24, Safari — 22, MDN — 20, jQuery — 19, Chrome — 17, CommonJS, Node.js, CoffeeScript — 16, npm, AngularJS, Backbone — 15, Webpack, TypeScript — 13, React — 12, ES6 — 10, Next.js — 9, Bun — 2

CSS

  • помимо именования view-transions с ними есть ещё одна проблема: так как транзишн применяется к document, одновременно может выполняться только один транзишн, поэтому невозможно запустить конкурентные транзишны + есть проблема с z-index, когда транзишнящийся элемент перекрывает всё вокруг; решение — будущий Scoped View Transitions, то есть возможность запуска транзишна на конкретном элементе element.startViewTransition()
  • эффект «фонарика в темноте»: что прикольно, так это, что можно задавать любую форму светлому участку благодаря filter или mix-blend-mode, например, «решётка» из градиентов сильно смазанная и переконтращенная filter: blur(1em) contrast(100) становится движущейся «кляксой»