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

Storybook从6.5升级至7.4后出现No router instance found错误排查

问题解决:Storybook 7.4 + Next.js 路由上下文缺失导致Apollo报错

问题原因

升级到@storybook/nextjs后,原storybook-addon-next-router的路由模拟方式不再适用,且你移除了RouterContext.Provider的配置,导致组件/Apollo Client中调用next/router相关API时找不到路由实例,抛出"No router instance found"错误。

解决方案

@storybook/nextjs内置了Next.js路由的模拟支持,无需额外安装第三方插件,只需在Storybook配置中补充路由上下文相关设置:

1. 配置preview.ts的全局路由参数

在升级后的preview.ts中添加nextRouter参数配置,提供默认的路由模拟上下文,同时恢复之前的next/image模拟(如果组件用到Next Image):

import type { Preview } from '@storybook/react';
import 'tailwindcss/tailwind.css';
import * as nextImage from 'next/image';

// 模拟Next Image组件
Object.defineProperty(nextImage, 'default', {
  configurable: true,
  value: (props) => <img {...props} />,
});

export const parameters = {
  actions: { argTypesRegex: '^on[A-Z].*' },
  // 配置全局Next Router模拟参数
  nextRouter: {
    path: '/',
    asPath: '/',
    query: {},
    push: () => Promise.resolve(true),
    replace: () => Promise.resolve(true),
  },
};

2. 针对特定Story自定义路由(可选)

如果某个Story需要特定路由状态(比如带query参数、特定路径),可以在Story级别添加nextRouter参数覆盖全局配置:

export const DashboardStory = {
  parameters: {
    nextRouter: {
      path: '/dashboard',
      asPath: '/dashboard?tab=analytics',
      query: { tab: 'analytics' },
    },
  },
};

3. 排查Apollo与路由的依赖关系

检查Apollo Client的配置或请求逻辑,确认是否存在依赖next/router的场景(比如请求头携带当前路由信息、根据路由参数生成GraphQL变量)。如果有,确保Storybook提供的模拟路由能满足这些依赖,或者在MSW的请求处理中手动补充相关参数。

4. 验证MSW配置加载

确认staticDirs中的mockServiceWorker.js路径配置正确,Storybook启动后可正常访问/mockServiceWorker.js,避免MSW未注册导致的请求异常被误判为路由问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:18:10