FWFrontend WeeklyПоддержи
На главную

Еженедельный дайджест #59: Новости фронтенда

Как читать этот дайджест
  • Начните с заголовков статей, чтобы получить общее представление о содержании
  • Быстро пробегитесь по первым абзацам, чтобы понять актуальность материалов именно для вас
  • Выберите наиболее интересные или полезные темы под текущие задачи
  • Планируйте чтение: выделите, например, 15 минут утром и 15 минут вечером
  • Не пытайтесь прочитать всё сразу — возвращайтесь к дайджесту в удобное время
  • При повторном просмотре читайте выбранные статьи более вдумчиво, делая заметки
  • Не сожалейте, если прочитали лишь часть: ценность в качестве, а не в количестве
  • Используйте закладки для сохранения интересных материалов
  • Делитесь инсайтами и ссылками с коллегами — так информация лучше усвоится
Фронти на связи — выпуск #59! 🗞️
Веб-платформа учится диагональному скроллу и предупреждает об обновлениях Baseline. 🧪
CSS украшает текст, упрощает темную тему и снова рисует заставку Pipes. 🎨
Deno экспериментирует с QuickJS, а Bun готовит рывок в совместимости. 🦕
Yelp перенес 1,4 миллиона строк с Flow на TypeScript. 📘
React Native 0.87, GTKX для Linux и быстрые переходы в Next.js. ⚛️
TanStack переписал Form и сделал Table быстрее и экономнее. 🧱
Node.js 26.7, Fastify 6 alpha и важные сигналы о памяти и устаревших API. ⚙️
WebMCP, Kitesurf и stateless MCP готовят веб к работе с агентами. 🤖
Инструменты недели: Vite+, scriptc, TermDOM, Hucre и мастерская для медиа. 🧰
Фронти - маскот дайджеста

🧪 HTML и веб-платформа

Браузеры разрешат отключать блокировку прокрутки по одной оси

Новое CSS-свойство scroll-axis-lock: none включает немедленную диагональную прокрутку. Обычно браузер определяет главное направление жеста и временно «приклеивает» движение к вертикальной или горизонтальной оси. Для обычной страницы это удобно, но на карте, большой схеме или холсте мешает свободно двигаться в любую сторону.

Пока свойство работает только в Chromium 153 и новее, но неподдерживающие браузеры просто проигнорируют его. В дополнительном разборе scroll-axis-lock собраны подходящие сценарии и описана обнаруженная при тестировании ошибка.

Baseline помогает

Как с помощью Baseline найти лишние полифилы и сократить JavaScript. Автор предлагает проверять зависимости группами — интернационализацию, HTTP-клиенты, UI-примитивы и утилиты — и предупреждает, что современная замена не всегда легче старой: например, переход с Day.js на Temporal в некоторых проектах увеличит бандл.

  • В эксперименте с HTML поверх WebSocket сервер отправляет готовые фрагменты интерфейса в обе стороны соединения. Так можно построить приложение с обновлениями в реальном времени и небольшим количеством клиентского JavaScript.
  • Разбор масштабирования крошечных JPEG в Chrome объясняет, почему маленькая картинка может выглядеть в браузере иначе, чем ожидается, и какие этапы декодирования и растягивания влияют на результат.

🎨 CSS и дизайн

Пять CSS-свойств для более выразительной типографики

В практической подборке показаны приемы оформления текста через background-clip, box-decoration-break, letter-spacing и другие свойства. Из отдельных небольших эффектов можно собрать заголовки с градиентной заливкой, аккуратно оформить многострочный текст и точнее управлять расстоянием между буквами.

Переключателю темной темы достаточно двух состояний

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

♿ Доступность

W3C обновил инструмент для отчетов о доступности

WCAG-EM Report Tool превращает результаты проверки продукта в структурированный отчет: помогает описать область аудита, выбранные страницы, найденные проблемы и общий результат. Инструмент обновили под методологию WCAG-EM 2, которая теперь подходит не только для сайтов, но и для других цифровых продуктов.

  • Able Player — доступный HTML5-плеер для аудио и видео с плейлистами, субтитрами, управлением с клавиатуры и настройкой горячих клавиш.

Заходите в Telegram-канал

Там можно спокойно обсудить выпуск, принести свою ссылку, задать вопрос или просто отметить материал, который пригодился в работе

Заглянуть

📦 JavaScript

jsDelivr расширяет поддержку npm-пакетов в браузерном ESM

Технический разбор показывает, как jsDelivr преобразует npm-пакеты для загрузки через /+esm. Главная сложность — CommonJS: в нем зависимости и экспорты могут определяться динамически, поэтому превратить любой пакет в статический браузерный модуль автоматически не всегда просто.

Сам jsDelivr позволяет подключать библиотеки с CDN без отдельной сборки. Материал помогает понять, что происходит между опубликованным npm-пакетом и кодом, который в итоге выполняет браузер.

🦕 Deno и Bun

Deno 2.9.5 экспериментирует с движком QuickJS

В Deno 2.9.5 появился экспериментальный QuickJS-бэкенд для deno compile и deno desktop. Он дает еще один способ упаковывать JavaScript-программы и настольные приложения, не полагаясь во всех сценариях на V8.

Пока это ранняя возможность, поэтому она интереснее для тестов и оценки размера или скорости запуска, чем для немедленного переноса рабочего проекта.

celld переносит идею Durable Objects в собственное хранилище S3

celld — самохостинговая реализация объектов с состоянием от команды Deno. Она объединяет V8, SQLite и формат репликации LTX, а координацию хранит в S3-совместимом бакете без отдельного слоя консенсуса. Исходный код celld уже доступен для изучения.

📘 TypeScript

Yelp перенес 1,4 миллиона строк с Flow на TypeScript

Инженеры Yelp описали многолетнюю миграцию большого монорепозитория с Flow на TypeScript. Команде пришлось постепенно переводить сотни пакетов и какое-то время запускать оба анализатора типов. В результате покрытие типами выросло с 83% до 96%.

История полезна не только тем, кто еще использует Flow: она показывает, как разбивать масштабный технический переход на этапы и не останавливать разработку продукта. Ранее Yelp похожим образом рассказывал о миграции сборки с webpack на Rspack.

Необязательное поле неожиданно сломало типы middleware

В TypeScript-разборе объясняют, почему добавление второго middleware превратило ожидаемый тип результата в {}. Причиной оказался распространенный способ фильтровать ключи объекта: при необязательных свойствах в вычисления проникал undefined, и дальнейшие условные типы давали неожиданный результат.

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

  • Эксперимент с типом для ссылочной стабильности позволяет компоненту требовать заранее созданный массив или функцию и отклонять новый литерал при каждом рендере.
  • scriptc компилирует TypeScript и JavaScript в нативные исполняемые файлы и WebAssembly, а неподдерживаемые динамические участки при необходимости запускает во встроенном QuickJS.
  • tsnapi делает снимки экспортов и деклараций типов публичного API пакета, чтобы случайное несовместимое изменение обнаруживалось в тестах.

⚛️ React, Next.js и React Native

React Native 0.87 сделал строгий TypeScript API основным

В React Native 0.87 публичный JavaScript API теперь описывается через Strict TypeScript API, типы для которого генерируются прямо из исходников. Это уменьшает риск расхождения между реальным поведением фреймворка и ручными декларациями.

Сборщик Metro обновился до версии 0.87 и стал компактнее, а для iOS появилась экспериментальная интеграция со Swift Package Manager.

GTKX запускает React-интерфейсы как нативные Linux-приложения

GTKX 1.0 преобразует JSX в настоящие виджеты GTK4 и Adwaita без WebView. Приложение работает в обычном процессе Node.js, может использовать npm-пакеты и поддерживает Fast Refresh. Репозиторий GTKX содержит код и примеры.

Следом вышел GTKX 1.1 с командой gtkx deploy, которая собирает Flatpak, пакеты .deb и .rpm, а также AppImage для распространения приложения.

Next.js проверяет мгновенность переходов до ответа сети

Next.js 16.3 добавил Playwright-помощник instant(), а команда Vercel рассказала, как с его помощью ускорила навигацию в v0. Тест фиксирует то, что успело появиться на экране до завершения сетевого запроса, поэтому можно проверить не только итоговый результат, но и ощущение мгновенности интерфейса. Сам конструктор v0 использовали как рабочий пример.

  • Preact 11 RC дает разработчикам возможность заранее проверить совместимость приложений с будущей основной версией.
  • Biome 2.5.8 получил правило useReactCompiler, которое запускает React Compiler в режиме проверки и показывает несовместимые компоненты и хуки до включения компилятора.
  • Обзор сканирования штрихкодов в React Native сравнивает доступные библиотеки, подходы к камере и ограничения платформ.
  • React Native Connection пройдет 24 сентября в Париже и будет посвящена разработке мобильных приложений на React Native.
  • Rollipop — экспериментальная замена Metro для React Native с прицелом на производительность и интеграцию с Rollup и Rolldown.
  • kbar 1.0 добавляет в React-приложение палитру команд и поиска по нажатию Cmd+K; стабильный релиз поддерживает React 18 и 19.
  • Liquid Gooey собирает готовые плавные «жидкие» эффекты для React-компонентов.
  • React Hook Form 7.85 поддержал компонент <Activity> из React 19.2.
  • В Motion 13.1 компонент Reorder научился переставлять элементы в нескольких измерениях, определять ось и учитывать RTL-направление; примеры библиотеки доступны на сайте Motion.
  • Next.js 16.3.1 исправил повторные циклы prefetch, слишком раннее удаление кеша и устаревшие данные из headers() после большого релиза Next.js 16.3.
  • Sonner 2.0.8 стал первым за год обновлением популярного компонента уведомлений; внешний вид и поведение можно проверить в демо Sonner.
  • Набор Dot Matrix содержит больше 55 индикаторов загрузки на React и Tailwind, а исходники можно подключать через реестр shadcn.
  • TermUI Registry предлагает больше 110 терминальных React-компонентов в стиле shadcn для библиотеки Ink.

🧱 TanStack

TanStack Table v9 стал модульнее и экономнее

TanStack Table v9 перешел на архитектуру, из которой сборщик может удалить неиспользуемые части. Состояние теперь хранится в TanStack Store, а точечная реактивность позволяет обновлять только зависимые части интерфейса.

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

TanStack Form v2 полностью перестроил валидацию

TanStack Form v2 вышел в alpha после года обратной связи по первой версии. Вместо отдельного обработчика для каждого события проверки теперь образуют конвейер, где правило само указывает условие и момент запуска.

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

🛰️ Другие фреймворки и UI

  • SolidStart v2 готовит для SolidJS полнофункциональный слой приложений с маршрутизацией, серверным рендерингом и загрузкой данных.
  • Astro 7.2 обновил фреймворк для контентных сайтов и серверных приложений.
  • Svelte Select 6.0 обновил компонент выбора, автодополнения и поиска и теперь требует Svelte 5.
  • Mantine Vue переносит большую библиотеку компонентов Mantine из React в Vue 3.
  • ScrollX UI собирает доступные компоненты на Next.js, TypeScript, Tailwind и Motion для сайтов с выразительной прокруткой и анимациями.
  • Стартовый набор astro-shopify соединяет Astro с Shopify через Storefront Web Components и добавляет готовые страницы магазина.
  • spartan предлагает Angular-приложениям доступные нестилизованные UI-примитивы с signals, SSR и работой без Zone.js.
  • Vengence UI содержит эффекты наведения, анимированные подсказки и макеты со scroll-driven animations для маркетинговых страниц.
  • Registry Directory помогает искать сторонние реестры компонентов и блоков, совместимых с shadcn/ui.
  • isolet упаковывает компонент React, Solid, Svelte или обычного JavaScript в самостоятельный изолированный виджет.

⚙️ Node.js

Node.js 26.7 добавил трассировку Perfetto и расширил покрытие тестов

В Node.js 26.7 Current появилась начальная поддержка трассировки Perfetto и флаг --test-coverage-include-all, который учитывает в отчете покрытия даже не загруженные тестами файлы. Релиз также исправляет сбои в FFI и SQLite.

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

Fastify 6 вышел в alpha и требует Node.js 24

Первая alpha Fastify 6 в основном очищает накопившийся API и повышает минимальную версию Node.js до 24. Стабильные приложения пока не стоит переводить на нее без необходимости, но авторам плагинов уже полезно начать тестирование.

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

В Node.js 27 могут усилить устаревание node:domain

Модуль node:domain помечен устаревшим в документации с 2015 года, а теперь для Node.js 27 обсуждается предупреждение уже во время выполнения. Если старое приложение все еще использует domains для обработки ошибок, пора запланировать переход на современные механизмы.

Одновременно пользователи сообщают о падениях из-за нехватки памяти после обновления с Node.js 24.18.1 до 24.19.0. Причина еще не подтверждена, поэтому пострадавшим проектам стоит приложить воспроизводимый пример или временно отложить обновление.

  • Руководство по отладке зависшего процесса Node.js показывает, как найти синхронную работу, которая надолго блокирует event loop и не отдает управление.
  • Vercel добавил обновление устаревшей версии Node.js одной кнопкой; новые сборки на Node.js 20 перестанут проходить после 1 октября.
  • Подборка пяти полезных команд через npx напоминает, как запускать одноразовые проверки орфографии, чистку проекта и другие утилиты без глобальной установки.
  • Статья про паттерн Outbox в Node.js объясняет, как согласовать запись в базу данных с отправкой события в очередь и не потерять одну из операций при сбое.
  • unbash — быстрый парсер Bash без зависимостей, выделенный из инструмента Knip. Он строит типизированное AST для анализа разрешений, классификации и переписывания команд.
  • njsscan 1.0 ищет в Node.js-приложениях XSS, SSRF, опасный eval, ошибки JWT и NoSQL-инъекции с помощью набора правил Semgrep.
  • NodeBB 4.15 исправил ошибки и улучшил интеграцию форума с fediverse; готовую установку можно посмотреть на демо-сайте NodeBB.
  • smol-toml 1.8 — небольшой быстрый парсер и сериализатор стандарта TOML 1.1.
  • BullMQ 6.1 обновил распределенную очередь задач, которая может работать поверх Redis или PostgreSQL.
  • swift-node 0.1.2 позволяет писать нативную часть модуля Node.js на Swift.

🤖 ИИ и агенты

Kitesurf запускает браузер для агентов в изолятах Cloudflare

Kitesurf — браузерный движок, рассчитанный на программных агентов, а не на отображение страниц человеку. Каждая страница работает в отдельном V8 isolate на Cloudflare Workers. По данным команды, движок использует в 3–7 раз меньше процессора и памяти, чем Chromium, хотя выполняет задачи медленнее.

Проект пока находится в beta, но его уже можно попробовать в интерактивной версии. В будущем Cloudflare планирует открыть исходный код.

WebMCP превращает функции страницы в инструменты для агента

Экспериментальный хук use-webmcp-tool помогает React-приложению публиковать функции страницы через WebMCP. Вместо имитации кликов агент сможет вызвать явно описанное действие, например поиск товара или добавление позиции в корзину.

Стандарт еще разрабатывается, поэтому API может измениться. Но сам подход делает интеграцию надежнее: сайт заранее определяет допустимые действия и схему их параметров.

MCP научился работать без состояния между запросами

Спецификация MCP от 28 июля 2026 года добавила stateless-режим: серверу больше не обязательно сохранять привязку клиента к одной сессии и держать открытый поток. Это упрощает масштабирование за балансировщиком и восстановление после сбоев.

Cloudflare подготовил обзор изменений MCP и руководство по миграции, где объясняет, что нужно поменять существующим серверам и клиентам.

🛡️ Безопасность и надежность

Почти весь трафик небольшого сайта оказался ботами

Автор подробно описал год борьбы с ботами, создававшими 99% трафика сайта. Он показывает, как менялось поведение автоматических запросов и какие правила Cloudflare помогли снизить нагрузку.

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

Слабый генератор случайных чисел в старой crypto-js привел к краже средств

Расследование показало, как уязвимый псевдослучайный генератор старых версий crypto-js использовали для восстановления секретов и опустошения криптокошельков. Проблема существовала много лет, но затрагивала создание ключей версиями до 4.0.0.

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

🔨 Сборка и качество кода

pnpm 12 почти завершил перенос на Rust

pnpm 12 вышел в release candidate. Большая часть менеджера пакетов переписана на Rust, но для пользователя команда постаралась сохранить поведение pnpm 11: заметных несовместимых отличий осталось всего несколько.

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

  • vlt 1.0 предлагает совместимую с npm установку пакетов и команду vlt query с более чем 60 CSS-подобными селекторами для анализа графа зависимостей, включая проверки безопасности.
  • Vite+ объединяет runtime, менеджер пакетов, сборку и другие части фронтенд-стека в одной цепочке команд.
  • eslint-package-json добавляет правила ESLint для проверки и автоматического исправления package.json.
  • Vitest 5 RC позволяет заранее проверить тесты и плагины перед стабильным релизом новой основной версии.
  • branchyard собирает утилиты для уборки старых Git-веток и поддержания рабочего окружения в порядке.

⚒️ Инструменты и библиотеки

TermDOM переносит HTML, CSS и DOM в терминал

TermDOM реализует DOM, каскад и движок раскладки, который рисует интерфейс прямо в терминале. Приложение можно писать на обычном JavaScript или любом UI-фреймворке и запускать в Node.js, Bun или Deno без нативных и WebAssembly-зависимостей.

Проект похож по назначению на React-библиотеку Ink, но не требует React. В качестве демонстрации автор запустил TodoMVC с заменой только таблицы стилей; сам разработчик ранее создал Crank.js.

Hucre читает и создает таблицы без внешних зависимостей

Hucre 1.0 — движок электронных таблиц для JavaScript. Он умеет читать и записывать распространенные форматы, работать со встроенными изображениями, ссылками, защитой паролем и сводными таблицами.

Библиотека поддерживает tree shaking, поэтому сборщик может не включать в приложение неиспользуемые возможности. Это пригодится при импорте и экспорте таблиц прямо в браузере или Node.js.

Инструменты для изображений, звука и интерфейсов

  • Morphicons плавно превращает одну контурную иконку в другую с пружинной анимацией и работает с React, Vue и Svelte.
  • VidStudio обрезает, масштабирует и сжимает медиа, добавляет субтитры и выполняет обработку локально в браузере.
  • Dither накладывает на изображение эффект дизеринга, дает настроить алгоритм, палитру и градиент и экспортирует результат в SVG или PNG.
  • soundcn содержит сотни звуков интерфейса, распределенных по категориям и доступных через реестр shadcn.
  • BulkPicTools пакетно сжимает, конвертирует, обрезает и редактирует больше 200 изображений локально, не отправляя файлы на сервер.
  • 3dsvg превращает SVG в интерактивный трехмерный React-компонент и предоставляет визуальный редактор.
  • CATAAS отдает через REST API случайные изображения котов, GIF и картинки с заданным цветом или текстом — удобно для прототипов и заглушек.
  • Nutrepedia ищет пищевую ценность продуктов и блюд на нескольких языках и показывает данные на порцию или грамм.