← Усі статті

TanStack Table v9: платите лише за ті можливості таблиці, які вмикаєте

Стабільний v9 за чотири роки після v8: модульні можливості, TanStack Store, до 86% менше пам’яті на мільйоні рядків і десять адаптерів фреймворків.

TanStack Table v9: платите лише за ті можливості таблиці, які вмикаєте
Зміст

Коротко

У випуску React Status #486 першою новиною стоїть стабільний TanStack Table v9 — понад чотири роки після v8. Кевін Ван Котт (із 2022 він веде бібліотеку замість Таннера Лінслі) перезібрав ядро: можливості реєструють явно й викидають із бандла, якщо ними не користуєтесь; стан живе на TanStack Store; на мільйоні рядків у замірі команди утримана купа падає приблизно з 2,71 ГБ до ~380 МБ. Безголова модель таблиці та сама; ламається спосіб збірки «системи таблиць» у продукті. Поруч у дайджесті — гід Vercel по Next.js 16.3 і черв’як у пакеті keyv; це тло тижня, не тема релізу таблиці.

Що сталося

Офіційний розбір — у блозі TanStack (4 серпня 2026). Бета два місяці тому обіцяла здебільшого внутрішній каркас. За бету каркас встигли наростити, і в стабільному списку сім блоків.

Адаптери: десять фреймворків плюс @tanstack/table-core. Стан на TanStack Store стикується з нативною реактивністю: сигнали, посилання, руни, computed(). React 18+ дружить із компілятором і дає тонкі підписки через атоми, селектори й table.Subscribe. Є Preact, Vue 3.2+, Solid 1.x (Solid 2 обіцяють до v10), Svelte 5, Angular 19+, Lit, Alpine, Ember 5.8+ і Octane.

Пам’ять: спільні прототипи для API рядка, стовпця, комірки й шапки замість копії методів на кожен екземпляр. На мільйоні рядків × 8 стовпців із посторінковою нарізкою утримана купа у звіті — близько 86% менша, ніж у v8. Середній час обробки: ядро моделі рядків −79%, групування −52%, сортування −37%, фільтри −34%.

Стан як і раніше можна вести через state і on[State]Change або віддати шматки зовнішнім атомам. Типи знають, які можливості зареєстровані: API фільтра не існує в типах, доки фільтр не ввімкнули. Можливості збирають через tableFeatures(): таблиця лише з посторінковою нарізкою не тягне фільтри й групування. Повний пакет зріс приблизно з 14 до 25 КБ у стислому вигляді, але середній бандл застосунку має стати меншим. Для продукту загалом — tableOptions() і createTableHook(): спільна фабрика таблиць уже з прив’язаними можливостями й домовленостями щодо комірок.

Із нового: виділення комірок (прямокутники, перетягування, Shift, кілька діапазонів), об’єднання комірок за рядками й стовпцями, кілька агрегацій на стовпець. Тимчасовий міст для React — useLegacyTable з API v8 поверх v9; він застарів, тягне всі можливості й роздуває бандл — лише щоб переїхати. Для екрана лише з посторінковою нарізкою офіційний приклад реєструє rowPaginationFeature і createPaginatedRowModel() — і більше нічого. Це і є обіцянка v9 на практиці: середній бандл застосунку має стати меншим, навіть якщо повний пакет зріс з ~14 до ~25 КБ.

Чому це важливо

Таблиця в продукті рідко одна. Зазвичай це сітка замовлень, сітка логів, сітка адмінки — і у v8 у бандл часто витікало «все, що вміє бібліотека». Явна реєстрація можливостей змінює економіку: новий стовпець із групуванням платить той екран, якому воно потрібне. Зміна мейнтейнера пояснює, чому чекали так довго; архітектура заточена під те, щоб v10 (зведені таблиці, складні вирази фільтрів, Solid 2) не змушувала всіх тягнути дорожню карту цілком.

Для фронтенду це ще й урок модульності: «безголова бібліотека» у 2026 році — не лише «малюй сам», а й «підключай лише ті алгоритми рядків, які реально ганяєте на клієнті». Якщо сітка віртуалізує сотні тисяч рядків, виграш у пам’яті — не мікрооптимізація, а різниця між вкладкою, яка живе, і вкладкою, яку вбиває браузер. Заміри команди якраз про цей край: на маленьких таблицях економія майже непомітна, на мільйоні рядків — уже сотні мегабайтів і гігабайти.

На практиці

  1. Новий екран одразу пишіть на v9: useTable + явний features, не копіюйте useReactTable зі старих гідів.
  2. Для міграції читайте гід свого фреймворку; useLegacyTable — короткий міст, не цільове API.
  3. Реєструйте лише потрібне: посторінкова нарізка на клієнті — rowPaginationFeature і createPaginatedRowModel(), без «про всяк випадок» фільтрів.
  4. Підписки малюйте через table.Subscribe / селектори, а не через перемальовування всієї сітки на будь-яку зміну стану.
  5. Якщо таблиць у продукті багато, винесіть спільний createTableHook() зі значеннями за замовчуванням, сортуваннями й комірками — окремі екрани залишаться короткими.
  6. Перевірте великі клієнтські набори (сотні тисяч рядків із віртуалізацією): виграш у пам’яті — головний практичний аргумент міняти мажор.
  7. Тло дайджесту: гід Vercel щодо ефективності Next.js 16.3 варто пробігти окремо; пакет keyv і черв’як ланцюжком npm — привід перевірити файл блокувань залежностей, це не частина релізу таблиці.

Підсумок

TanStack Table v9 — фундамент, а не набір «ще кнопок у шапці». Платите за ввімкнені можливості, менше пам’яті на величезних клієнтських сітках, реактивність, близька до фреймворку, десять адаптерів. Переїзд ламає хуки й реєстрацію модулів — зате далі бібліотека може рости, не роздуваючи кожну таблицю в застосунку.