设置 Storybook 以使用 Next.js 的 Link 标签

J. *_*ers 7 next.js storybook

我正在尝试为 Next.js 项目设置 Storybook。我有一个Link从 Next.js呈现标签的组件。我的问题是,当我加载这个组件时,Storybook 会抛出以下错误:

Cannot read property 'pageLoader' of null
   at Link.handleRef
Run Code Online (Sandbox Code Playgroud)

要让 Storybook 与 Next.js Routing 一起工作,特别是渲染Link标签,需要做什么?

更新:导致错误的代码:

Cannot read property 'pageLoader' of null
   at Link.handleRef
Run Code Online (Sandbox Code Playgroud)
// button-component.js
import Link from 'next/link.js';
import t from 'prop-types';
import React from 'react';

function Button({ as, children, href, ...props }) {
  const isExternal = href && href.startsWith('http');
  const a = (
    <a href={href} {...props}>
      {children}
    </a>
  );

  if (href) {
    return isExternal ? (
      a
    ) : (
      <Link href={href} as={as}>
        {a}
      </Link>
    );
  }

  return (
    <button type="button" {...props}>
      {children}
    </button>
  );
}

Button.propTypes = {
  as: t.string,
  children: t.node,
  href: t.string,
};

export default React.memo(Button);
Run Code Online (Sandbox Code Playgroud)

Cul*_*lly 5

我在 Next.js 的 github 上发现了一个关于此问题的报告:https : //github.com/zeit/next.js/issues/9951

它仅在 5 天前报告,因此您可能遇到相同的问题。解决方案是升级到 nextjs v9.1.8-canary.6。阅读有关此内容的更多信息并查看源代码,这可能是您的问题。此外,如果您想尝试更新的东西,还有更多最近的 nextjs 金丝雀版本。

如果这不能解决它,我的另一个猜测是您收到错误,因为您在LinkNext.js 页面之外使用。Next.js 可能在幕后包含页面的依赖项。Link可能依赖于这些依赖项,并在找不到它们时抛出错误。如果您想在 Next.js 页面之外测试您的组件,您可以创建一个自定义Link组件来测试您是否在 Next.js 中并且仅在您在时才呈现Link。例如:

import Link from 'next/link'
import Router from 'next/router'

const CustomLink = ({children, ...otherProps}) => {
  const isPage = () => {
    // if we're in a next.js route, then Router.router will be set
    return Boolean(Router.router)
  }

  return isPage()
    ? (<Link {...otherProps}>{children}</Link>)
    : children
}
Run Code Online (Sandbox Code Playgroud)

然后使用CustomLink代替Link