angular-query-experimental: `import * as ng` in pending-tasks-compat pulls all of @angular/core into the initial bundle
Los mantenedores suelen responder en 1 día
@benjavicente ya está trabajando en esto.
Desde el 25/10/2026.
- #12386 de @mixelburg — cerrado sin fusionar
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 52/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- angular, typescript
- Área
- frontend, performance
Línea de trabajo
Start with packages/angular-query-experimental/src/pending-tasks-compat.ts, then trace how create-base-query and inject-mutation import it. Compare production bundle output for the Angular 22 lazy route described in the issue, with and without the compat module. Done means injectQuery and injectMutation no longer prevent tree shaking of @angular/core, while builds remain compatible with Angular 16–18.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
packages/angular-query-experimental/src/pending-tasks-compat.ts reads PendingTasks through a namespace import:
import * as ng from '@angular/core'
// …
const token = Reflect.get(ng, 'PendingTasks')
Because the namespace object is accessed dynamically, esbuild (Angular's application builder) can't tree-shake @angular/core. create-base-query (injectQuery, injectInfiniteQuery) and inject-mutation import this module, so using them, even only in a lazy-loaded route, puts most of @angular/core into the initial chunk.
This was reported before in #11614. Its author closed it a few minutes later because they were working around it locally. It still reproduces on the latest release (5.104.5, same dist/pending-tasks-compat.mjs), so I'm opening a new issue to track it.
How to reproduce
Angular 22 app with the application builder (esbuild), production build:
provideTanStackQuery(new QueryClient())inapp.config.ts.- A lazy route (
loadComponent) whose component callsinjectQuery(...). ng buildand compare the initial bundle with and without step 2.
Numbers (our admin app, @tanstack/angular-query-experimental 5.104.1, Angular 22.2)
main-*.js |
Initial total | |
|---|---|---|
| As published | 512.14 kB | 515.56 kB |
pending-tasks-compat.mjs patched to a named import |
327.05 kB | 330.46 kB |
Almost all of the difference is @angular/core (raw, from esbuild stats: 140 kB → 409 kB in main). The app code is ~4 kB in both builds.
Expected behavior
Using injectQuery/injectMutation shouldn't stop @angular/core from being tree-shaken.
Notes / possible directions
We know the namespace access is there because the peer range is @angular/core >=16 and PendingTasks only exists from v19, so a plain import { PendingTasks } would break builds on 16–18. Some options:
- Drop the compat shim when the minimum supported Angular becomes 19 (named import, no
Reflect.get). - Until then, keep the shim behind a separate entry point or build condition, so apps on ≥19 get the named import.
Workaround we use for now (Angular 22): a pnpm patch that replaces the namespace import with import { InjectionToken, PendingTasks, inject } from "@angular/core" and inject(PendingTasks, { optional: true }).
Versions
- @tanstack/angular-query-experimental: 5.104.1 (also checked 5.104.5)
- @angular/core: 22.2.3, application builder (esbuild)
- Lenguaje dominante
- TypeScript
- Estrellas
- 50.5k
- Forks
- 4.2k
- Merge medio
- 8 h 14 min
- PR fusionados (30 d)
- 632
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de TanStack/query
-
solid-query: STRICT_READ_UNTRACKED on Solid 2 — client()/options() read in component body (useMutation, useBaseQuery)Quizá libre de nuevo @LeonxLJX la tomó hace 53 días y no hay ningún pull request abierto. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
TanStack/query#11358 · 2 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
useBaseQuery fetches the old query key when an <Activity> tree is revealedPosiblemente ocupada @lazerg la tomó hace 6 días. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
[query-broadcast-client-experimental] broadcastQueryClient: an `added` event overwrites a receiving query that has no data (e.g. in error) with the sender's empty statePosiblemente ocupada @lazerg la tomó hace 6 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 25/100
Los mantenedores suelen responder en 1 día
-
solid-query 6.0.0-rc.5: onCacheEvent throws NotReadyError during a Solid 2 (rc.14+) transition landingPosiblemente ocupada @UzumakiODZ la tomó hace 12 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 28/100
TanStack/query#12031 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Explicit gcTime schedules a GC timer during SSR, retaining the whole render in memoryPosiblemente ocupada @AdzerKI la tomó hace 12 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 25/100
TanStack/query#12025 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de TanStack/query
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
galaxyproject/loom#616 ·
Los mantenedores suelen responder en 1 día
-
e2e-failure ready-to-code
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
redhat-developer/rhdh-plugin-export-overlays#4580 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 84/100
eknowledger/toolbench#266 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
devdotfast/whiteboard#1415 · 1 comentario ·
Los mantenedores suelen responder en 1 día