Loading...
← Back to blog

Вересень 2026 у фронтенді: React стабілізувався, тулінг переписали на Rust, а AI змінює правила гри

Якщо шукати в цьому місяці одну тему, то це вартість переписування. Bun, pnpm і навіть шматок Vite за кілька тижнів з'явилися в новій реалізації, а Evan You прямо сказав, що AI скоро зробить власний форк залежності нормою. На цьому тлі React тихо закрив дві давні experimental-історії, а Vitest 5 пообіцяв швидкість і водночас зламав кілька звичних поблажок.

Нижче те, що з цього реально стосується щоденної роботи.

React 19.3: анімації й Fragment refs без прапорців

Реліз вийшов 9 вересня, і головне в ньому давно знайоме тим, хто стежив за React Labs. <ViewTransition> та Fragment refs тепер stable.

<ViewTransition> загортає частину дерева й анімує її через браузерний View Transition API. Спрацьовує він лише на оновленнях, позначених як Transition: startTransition, розкриття <Suspense>, useDeferredValue. Звичайний setState анімації не запускає. На мою думку, це правильне рішення: термінові апдейти мають з'являтися одразу.

Fragment refs вирішують стару проблему. Раніше, щоб повісити IntersectionObserver на групу сусідніх елементів, доводилося додавати обгортку-div і ламати верстку. Тепер ref на <Fragment> дає FragmentInstance з focus, addEventListener, observeUsing і scrollIntoView, які працюють на дітях як на групі.

Для SSR-проєктів найцікавіша дрібниця — browser з react-dom:

tsx
import { Suspense, use, ViewTransition } from 'react';
import { browser } from 'react-dom';

function TimeZone() {
  use(browser());
  return <p>{Intl.DateTimeFormat().resolvedOptions().timeZone}</p>;
}

export function Clock() {
  return (
    <ViewTransition update="auto" default="none">
      <Suspense fallback="…">
        <TimeZone />
      </Suspense>
    </ViewTransition>
  );
}

На сервері компонент суспендиться й у HTML потрапляє fallback. На клієнті після гідрації рендер іде звичайно. Патерн const [mounted, setMounted] = useState(false), який я бачив у кожному другому Next.js-проєкті, нарешті має офіційну заміну.

Що може неприємно здивувати після апдейту: у Strict Mode ефекти тепер подвійно викликаються і під час гідрації. У dev це підсвітить ефекти без нормального cleanup. Не баг React, але готуйтеся до кількох «раптом зламалося».

Rust-хвиля: Bun, pnpm і чужий dev-сервер

Bun 1.4 (20 серпня) переписано із Zig на Rust. Команда додала 1 517 тестів з Node.js test suite і заявляє про вп'ятеро менше idle CPU та до 35% менше пам'яті. Це цифри вендора, але методика в пості розписана докладно. Перш ніж оновлюватися, прочитайте розділ breaking changes. Bun тепер видає себе за Node.js 26 (NODE_MODULE_VERSION 147, тож нативні аддони треба перезібрати), Bun.YAML читає yes/no/on/off як рядки, а нові монорепо отримують isolated linker.

pnpm 12 (26 серпня) теж на Rust, і тут переїзд майже безболісний: команди, налаштування й lockfile переносяться. Єдина пастка в тому, що latest у npm досі вказує на 11-ку:

sh
pnpm self-update latest-12

У CI можуть вистрілити дві речі: невідомі ключі в pnpm-workspace.yaml тепер помилка (при пінованій версії), а git-залежності з GitHub/GitLab/Bitbucket резолвляться лише через HTTPS. Якщо приватні репо тягнулися по SSH, знадобиться git config url.insteadOf.

А тепер найцікавіше. Lovable переписала на Rust шар dev-сервера Vite під назвою OJ для своїх preview-пісочниць, яких у них близько мільйона на день. Заявлені результати: медіанний час отримання sandbox скоротився з 14,5 до 3 секунд, пам'ять зменшилася приблизно в 6,5 раза.

Evan You бенчмарк оскаржив, і слушно. Lovable порівнювала свій bundled-режим з unbundled Vite. У чесному порівнянні холодний старт майже однаковий: 1 315 мс проти 1 528 мс. А от пам'ять справді відрізняється разюче: 115 МБ проти 1 751 МБ. Для компанії, яка пакує пісочниці на хости, це і є головна метрика.

Цікавіший за цифри висновок самого Evan. Реімплементація різко дешевшає завдяки AI, тож замість тисяч сміттєвих PR в апстрім кожна компанія може підтримувати власний «slop fork» під свої обмеження. Він сам не певен, чи це добре. Я теж. Для open source це означає фрагментацію: форк не отримує автоматично security-фікси з апстріму. Для команд це означає, що аргумент «переписувати дорого» слабшає щомісяця.

Vitest 5: швидше, але без поблажок

Вимоги: Vite 6.4+ і Node.js 22.12+. Приріст швидкості нерівний, і команда це чесно показує. На застосунку з великою кількістю залежностей у vmThreads час упав на 53%. Там, де все впирається в jsdom з ізоляцією, різниця в межах ±3%.

Більше мене цікавить те, що зламається:

  • clearMocks тепер true за замовчуванням, і мок не тягне історію викликів між тестами;
  • незаавейчений expect(promise).resolves більше не попередження, а падіння тесту;
  • локатори в Browser Mode строгі: getByText('Item') вже не знайде Item 1.

Усе це зміни на краще. Але в старому проєкті вони гарантовано підсвітять тести, які роками проходили випадково. Оновлюйте окремою гілкою. Приємні бонуси: Trace View для покрокового перегляду browser-тестів і vitest doctor, який проганяє suite з різними конфігами й підказує швидший.

Tailwind Labs іде в Shopify

Оголошення 9 вересня. Tailwind CSS лишається під MIT, команда продовжує його вести, але нових клієнтів у Tailwind Plus і ui.sh більше не приймають. Користувачам фреймворку поки нічого не загрожує. Якщо ж ви планували купувати Plus для команди, план треба міняти.

Safari 27 нарешті полагодив top-level await

Модульний лоадер Safari роками стояв на покинутому proposal, звідси загадкові «cannot access before initialization». У Safari 27 його переписали з нуля. Тепер top-level await стабільно працює у всіх основних браузерах, і можна прибирати обгортки в async IIFE, які жили в коді «про всяк випадок».

AI: не лише «напиши компонент»

Найбільше дискусій зібрав текст Nolan Lawson про «астероїд», що влетів у фронтенд. Кілька його спостережень важко заперечити. Фронтенд-код менш ризиковано віддати агенту без нагляду, ніж міграцію БД. Cursor і Viget мігрували на React, бо агенти знають React найкраще, тож «досвід агента» починає переважувати DX. Вихід він бачить у трьох речах: навчати агентів обирати MPA на кшталт Astro замість SPA, робити сайти зручними для агентів і розгрібати навайбкоджені проєкти як консультант.

Із тезою про React у training data я згоден: сам бачу, як агент тягне SPA туди, де вистачило б Astro. З песимізмом щодо освіти погоджуюся менше. Агент добре відповідає на питання, але правильне питання досі треба вміти поставити.

Зворотний бік AI-буму видно з OpenJS Foundation. Їхній CNA з 17 вересня по 6 жовтня ставить на паузу всю security-роботу, бо волонтери вигоряють від потоку LLM-згенерованих звітів про вразливості. До паузи приєднався Express. На активно експлуатовані вразливості обіцяють реагувати.

З інструментів:

  • Transformers.js 4.3 додав structured output (JSON) і WebGPU у Safari 26+, тож локальні моделі в браузері тепер працюють і на iPhone;
  • @shadcn/lint — лінтер «для агентів»: забороняє сирі кольори й рестайл <Button> ззовні, повертаючи модель до ваших токенів;
  • Linear розповів, як агенти роздули тести й рахунок за CI, а переписування type-aware ESLint-правил на прості AST-перевірки скоротило лінт на 55%.

Безпека: дві речі, які варто перевірити

Атакувальники масово сканують відкриті Vite dev-сервери, щоб через обхід server.fs.deny витягти .env. Фікс є у Vite 7.3.2 і 8.0.5. Якщо ви запускаєте dev-сервер з --host на спільному стенді, оновіться сьогодні.

npm додав stage-only токени: CI готує реліз, а мейнтейнер підтверджує його з 2FA. Це розумний проміжний крок для тих, хто ще не переїхав на trusted publishing.

Що ще варто знати

  • Remix 3 у RC вже зовсім без React; фінальний реліз заплановано на 2 жовтня.
  • htmx 4.0 перейшов на Fetch API, успадкування атрибутів тепер opt-in.
  • Firefox 154 вивів sibling-index() і sibling-count() у Baseline.
  • TC39 у Токіо розглядає join, includes і chunking для iterator helpers на Stage 4.

Чекліст на тиждень

  1. Vite нижче 7.3.2 / 8.0.5 оновити без обговорень.
  2. React 19.3 прогнати в dev зі Strict Mode і подивитися на ефекти під час гідрації.
  3. Vitest 5 брати окремою гілкою й закладати час на виправлення тестів.
  4. pnpm 12 і Bun 1.4 можна відкласти, якщо CI не впирається в інсталяцію. Якщо впирається, pnpm 12 — найдешевший приріст місяця.

Головний висновок місяця не в конкретних релізах. Межа між «взяти готове» і «переписати під себе» зсувається, і AI робить це швидше, ніж ми встигаємо вирішити, чи нам це подобається.

Джерела