You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js生产环境偶发@tanstack/react-Query未设置QueryClient报错求助

解决Next.js中@tanstack/react-query 5.x生产环境偶发「No QueryClient set」报错及版本冲突问题

一、优先处理版本冲突核心问题

wagmi依赖的@tanstack/react-query 4.3.2与你使用的5.0.0存在重大版本不兼容,不同版本的react-query会维护独立的上下文,这是导致偶发Provider识别失败的关键诱因之一。

可选解决方式:

  • 方案1:降级自身react-query到v4版本
    由于wagmi暂未完全适配v5,直接降级到与wagmi匹配的v4.x版本(推荐4.3.2或兼容的v4最新稳定版):

    npm install @tanstack/react-query@4.3.2
    # 或 yarn add @tanstack/react-query@4.3.2
    

    同步更新相关依赖(如@tanstack/query-core),确保所有react-query相关包版本统一。

  • 方案2:强制统一依赖版本
    若需保留react-query v5,可通过包管理器锁定功能强制让wagmi使用v5(注意:此方式可能引发wagmi兼容性问题,需全面测试):

    • npm:在package.json中添加overrides
      "overrides": {
        "@tanstack/react-query": "5.0.0"
      }
      
    • yarn:在package.json中添加resolutions
      "resolutions": {
        "@tanstack/react-query": "5.0.0"
      }
      

    执行npm install或yarn install重新安装依赖。

二、优化QueryClient初始化与Provider包裹逻辑

版本统一后,生产环境的hydration或异步渲染特性仍可能导致偶发上下文丢失,可做以下优化:

  1. 改用useMemo初始化QueryClient
    useMemo更适合处理仅需初始化一次的实例,避免不必要的重创建:

    export default function App({ Component, pageProps }: AppProps) {
        const queryClient = useMemo(() => new QueryClient(options), []);
    
        return (
            <QueryClientProvider client={queryClient}>
                <ErrorBoundary>
                    <HydrationBoundary state={pageProps.dehydratedState}>
                        <Providers pageProps={pageProps}>
                            <Component {...pageProps} />
                        </Providers>
                    </HydrationBoundary>
                </ErrorBoundary>
            </QueryClientProvider>
        );
    }
    
  2. 确保Provider包裹所有使用react-query的组件
    检查<Providers>内部是否有组件在Provider外层就调用了useQuery/useMutation等hooks(如全局布局、导航组件提前触发查询),可将QueryClientProvider移到_app.tsx的最顶层,确保所有相关组件都在上下文范围内。

  3. 增强错误兜底逻辑
    自定义Query专属ErrorBoundary,避免单个查询错误导致整个应用崩溃:

    class QueryErrorBoundary extends React.Component {
        state = { hasError: false };
    
        static getDerivedStateFromError() {
            return { hasError: true };
        }
    
        componentDidCatch(error) {
            console.error('Query Client Error:', error);
        }
    
        render() {
            if (this.state.hasError) {
                return <div>加载出错,请刷新重试</div>;
            }
            return this.props.children;
        }
    }
    

    包裹到现有结构中:

    <QueryClientProvider client={queryClient}>
        <QueryErrorBoundary>
            <ErrorBoundary>
                <HydrationBoundary state={pageProps.dehydratedState}>
                    <Providers pageProps={pageProps}>
                        <Component {...pageProps} />
                    </Providers>
                </HydrationBoundary>
            </ErrorBoundary>
        </QueryErrorBoundary>
    </QueryClientProvider>
    

三、生产环境调试建议

若问题仍存在,可添加临时日志定位触发场景:

import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient({ throwOnError: false });
if (!queryClient) {
    console.error('QueryClient missing at:', location.pathname);
}

内容的提问来源于stack exchange,提问作者mpalma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:06:26