TanStack Query построена как модульная библиотека с упором на tree-shaking и разбиение функциональности по уровням абстракции. Размер итогового бандла определяется не только самой библиотекой, но и способом её интеграции в приложение, типом сборщика и структурой импортов.
Основные источники веса в продакшн-бандле:
Современная версия TanStack Query разделена на несколько логических слоёв:
@tanstack/query-core — минимальное ядро@tanstack/react-query — React-обёрткаТакое разделение позволяет сборщику удалять неиспользуемые части, если проект использует ESM-сборку.
Ключевой момент: размер бандла зависит от того, импортируется ли весь пакет или только его части.
Tree-shaking работает эффективно только при соблюдении нескольких условий:
import/export)TanStack Query проектируется с минимальными side effects, что позволяет удалять неиспользуемые части API.
Однако типичная ошибка — импорт из корня пакета без контроля:
import * as Query from "@tanstack/react-query";
Такой подход почти всегда приводит к включению всего пакета.
Barrel imports:
import { useQuery, QueryClient } from "@tanstack/react-query";
Хотя это выглядит корректно, при плохой конфигурации сборщика может подтянуться больше кода, чем необходимо.
Deep imports (в старых версиях или внутренних API):
import { QueryClient } from "@tanstack/query-core/dist/queryClient";
Такие импорты ломают гарантии стабильности и могут обходить оптимизации.
Стандартный импорт из публичного API:
import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
В современных сборках это оптимальный вариант, так как:
DevTools — один из частых источников неожиданного роста бандла.
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
Если этот импорт не обёрнут условием окружения, он попадёт в production-сборку.
Типичная ошибка:
<ReactQueryDevtools initialIsOpen={false} />
без проверки окружения.
Оптимальный подход — разделение по окружению сборки, чтобы DevTools полностью исключались из production chunk.
QueryClient является центральным объектом управления
состоянием кеша.
Он включает:
Хотя сам по себе он не тяжёлый, он тянет query-core,
который содержит основную логику.
Важно учитывать:
TanStack Query хорошо сочетается с динамическими импортами:
const { useQuery } = await import("@tanstack/react-query");
Такой подход позволяет:
Особенно эффективно в SPA с маршрутизацией по страницам.
sideEffects: falseПозволяет визуально определить:
Полезен для Vite-сборок:
dist bundleИспользуется для быстрой оценки:
import * as ReactQuery from "@tanstack/react-query";
Результат: отключение tree-shaking.
Даже если компонент не используется, импорт может попасть в бандл.
Если приложение повторно экспортирует TanStack Query через собственные index.ts:
export * from "@tanstack/react-query";
это усложняет статический анализ.
В монорепо часто возникает ситуация:
Это увеличивает итоговый bundle без видимых причин.
import { useQuery } from "@tanstack/react-query";
без namespace импортов.
{process.env.NODE_ENV !== "production" && (
<ReactQueryDevtools />
)}
npm ls @tanstack/react-queryПереход между major-версиями TanStack Query может влиять на размер:
Особенно важно учитывать переход на scoped пакеты
(@tanstack/*), где изменена модульная структура.
Оценка веса TanStack Query в приложении обычно сводится к трём слоям:
Контроль каждого слоя позволяет предсказуемо управлять итоговым размером сборки и избегать скрытого роста зависимостей.