Якщо шукати в цьому місяці одну тему, то це вартість переписування. 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:
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-ку:
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.
Чекліст на тиждень
- Vite нижче 7.3.2 / 8.0.5 оновити без обговорень.
- React 19.3 прогнати в dev зі Strict Mode і подивитися на ефекти під час гідрації.
- Vitest 5 брати окремою гілкою й закладати час на виправлення тестів.
- pnpm 12 і Bun 1.4 можна відкласти, якщо CI не впирається в інсталяцію. Якщо впирається, pnpm 12 — найдешевший приріст місяця.
Головний висновок місяця не в конкретних релізах. Межа між «взяти готове» і «переписати під себе» зсувається, і AI робить це швидше, ніж ми встигаємо вирішити, чи нам це подобається.