对于 Google Chrome 用户:有一个第三方 Chrome 扩展程序可用于直接在 Chrome 开发者工具中调试 TanStack Query。它提供与特定于框架的开发者工具包相同的功能。在此处查看:TanStack Query DevTools
开发者工具有助于您调试和检查您的查询和变更。您可以通过向 provideTanStackQuery 添加 withDevtools 来启用开发者工具。
默认情况下,当 Angular isDevMode 返回 true 时,开发者工具处于启用状态。因此,您无需担心在生产构建期间排除它们。核心工具是延迟加载的,并且会从打包的代码中排除。在大多数情况下,您只需向 provideTanStackQuery 添加 withDevtools(),无需任何其他配置。
import {
QueryClient,
provideTanStackQuery,
withDevtools,
} from '@tanstack/angular-query-experimental'
export const appConfig: ApplicationConfig = {
providers: [provideTanStackQuery(new QueryClient(), withDevtools())],
}
import {
QueryClient,
provideTanStackQuery,
withDevtools,
} from '@tanstack/angular-query-experimental'
export const appConfig: ApplicationConfig = {
providers: [provideTanStackQuery(new QueryClient(), withDevtools())],
}
如果您需要更好地控制开发者工具的加载时间,可以使用 loadDevtools 选项。如果您想根据环境配置加载开发者工具,这尤其有用。例如,您可能有一个在生产模式下运行的测试环境,但仍需要开发者工具可用。
当未设置该选项或将其设置为“auto”时,开发者工具将在 Angular 处于开发模式时加载。
provideTanStackQuery(new QueryClient(), withDevtools())
// 等同于
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: 'auto' })),
)
provideTanStackQuery(new QueryClient(), withDevtools())
// 等同于
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: 'auto' })),
)
当将选项设置为 true 时,开发者工具将在开发和生产模式下加载。
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: true })),
)
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: true })),
)
当将选项设置为 false 时,开发者工具将不会加载。
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: false })),
)
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({ loadDevtools: false })),
)
withDevtools 选项从回调函数返回,以支持通过信号实现响应式。在以下示例中, 从一个 RxJS observable 创建一个信号,该 observable 侦听键盘快捷键。当触发事件时,开发者工具会延迟加载。 使用此技术,即使在生产模式下,您也可以支持按需加载开发者工具,而无需在捆绑代码中包含完整的工具。
@Injectable({ providedIn: 'root' })
class DevtoolsOptionsManager {
loadDevtools = toSignal(
fromEvent<KeyboardEvent>(document, 'keydown').pipe(
map(
(event): boolean =>
event.metaKey && event.ctrlKey && event.shiftKey && event.key === 'D',
),
scan((acc, curr) => acc || curr, false),
),
{
initialValue: false,
},
)
}
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({
initialIsOpen: true,
loadDevtools: inject(DevtoolsOptionsManager).loadDevtools(),
})),
),
],
}
@Injectable({ providedIn: 'root' })
class DevtoolsOptionsManager {
loadDevtools = toSignal(
fromEvent<KeyboardEvent>(document, 'keydown').pipe(
map(
(event): boolean =>
event.metaKey && event.ctrlKey && event.shiftKey && event.key === 'D',
),
scan((acc, curr) => acc || curr, false),
),
{
initialValue: false,
},
)
}
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideTanStackQuery(
new QueryClient(),
withDevtools(() => ({
initialIsOpen: true,
loadDevtools: inject(DevtoolsOptionsManager).loadDevtools(),
})),
),
],
}
在这些选项中,client、position、errorTypes、buttonPosition 和 initialIsOpen 支持通过信号实现响应式。