返回博客

自动集成 Next.js 和 Storybook

使用我们新的框架包支持 Next.js 12/13,无需配置

loading
Kyle Gach
@kylegach
最后更新

Next.js 被用于成千上万的网站和应用。随着 v13 的发布,它比以往任何时候都更强大,包括对路由和图像优化等关键功能的许多改进。但随着所有这些变化,迁移现有的 Next 应用,更不用说它集成的一切,可能会很困难。

Storybook 是隔离组件开发的实际标准。我们很高兴通过我们新的 @storybook/nextjs 框架包,在 Storybook 中提供 Next.js 13 功能。它会自动配置 Storybook 以镜像 Next.js 12 和 13 项目设置。以下是包含的内容

🔀 路由
🖼 图像优化
⤵️ 绝对导入
🎨 样式
🎛 Webpack & Babel 配置
💫 以及更多

等等,什么是框架?

Storybook 7 引入了框架 API,这是一种新的架构,可简化集成,提高性能,减小安装大小,并且对于许多流行的应用程序设置是零配置的。

对于 Next.js 用户,框架 API 负责配置 React 渲染器、Webpack 构建器和项目设置,因此您的 Storybook 行为就像您的应用程序一样。

让我们仔细看看这个框架提供的一些功能。

路由

Next.js 中最重要的部分之一是路由器,它负责导航和预取页面数据。此框架将为 next/routernext/navigation 模拟 Storybook 中所有必需的路由上下文。

next/navigation

Next.js 13 引入了实验性的 app 目录,其中包含新功能和约定。它支持嵌套路由和布局。

如果您的故事使用 app 目录中的组件,并且它们正在从 next/navigation 导入模块,则必须通过将 nextjs.appDirectory 参数设置为 true 来告诉 Storybook 使用正确的模拟路由上下文。

export const Example = {
  parameters: {
    nextjs: {
      appDirectory: true,
    },
  },
};

Navigation 提供程序使用一些默认值进行配置。您可以通过设置 nextjs.navigation 的参数来覆盖这些默认值。

export const Example = {
  parameters: {
    nextjs: {
      appDirectory: true,
      navigation: {
        pathname: '/profile,
        query: {
          user: 'santa',
        },
      },
    },
  },
};

查看AppRouterProvider 以了解所有可用参数。

next/router

pages 目录中,您应继续为路由目的使用 next/router 的导入。如果您想配置 Router 提供程序,可以通过设置 nextjs.router 参数来完成。

export const Example = {
  parameters: {
    nextjs: {
      router: {
        basePath: '/profile',
      },
    }
  },
};

查看PageRouterProvider 以了解所有可用参数。

Actions

此框架还自动将操作应用于模拟路由器的各种方法。当您单击故事中的链接时,该方法会在 Actions 插件面板中记录。当鼠标悬停在链接上时,它甚至会记录预取事件。

Animation demonstrating that the appropriate actions are logged after hovering and then clicking three different links in the story
鼠标悬停然后单击故事中的三个链接中的每一个

图像优化

Next.js 通过 next/image 组件包含对图像的复杂优化。此框架模拟了此组件的实现,这使得 Next.js 和 Storybook 都能按预期工作,而无需更改您的代码。

如果您使用的是 Next.js 12 的 next/future/image 或 Next.js 13 的 next/legacy/image,这些也得到完全支持。

绝对导入

在为 Next.js 应用编写组件时,您可以使用绝对引用来导入其他模块。此框架确保在 Storybook 中渲染组件时也能正常工作。这意味着以下代码在 Next.js 和 Storybook 中的工作方式相同:

// pages/index.jsx
 
// Note that the import is not from '../components/Button'
import Button from 'components/button';
import styles from 'styles/HomePage.module.css';
 
export default function HomePage() {
  return (
    <>
      <h1 className={styles.title}>Hello World</h1>
      <Button />
    </>
  );
}

它也可以在 preview.js 中使用

// .storybook/preview.js
import 'styles/globals.scss';
 
// ...

样式

Sass、CSS Modules 和 Styled JSX 都是 Next.js 中可用的样式选项,此框架支持所有这些选项。它甚至尊重 next.config.js 中提供的自定义 Sass 配置。

// next.config.js
const path = require('path');
 
module.exports = {
  // any options here are included in sass compilation for your stories
  sassOptions: {
    includePaths: [path.join(__dirname, 'styles')],
  },
};

Webpack 和 Babel 配置

Next.js 拥有强大、复杂且隐藏的 Webpack 配置,它支持上述功能以及更多功能。此框架为 Storybook 重建了该配置。更重要的是,它尊重您对该配置进行的任何扩展,因此您的应用程序将在 Storybook 的隔离开发环境中按预期工作。

从 v12 开始,Next.js(可选)使用 SWC 而不是 Babel 来处理构建和开发过程的越来越多的方面。Storybook 尚不支持 SWC,因此此框架选择使用 Babel(仅用于 Storybook)。

如果您的 Next.js 应用已通过使用自己的 Babel 配置选择退出 SWC,那么此框架将尊重该自定义配置。但是,如果您使用的是自定义 SWC 配置,则需要将该行为转换为 Babel直接提供给 Storybook。我们正在研究如何更直接地支持 SWC。

开始上手

@storybook/nextjs 框架支持 Storybook 7(当前处于测试阶段)和 Next.js 12+。

您可以查看完整文档。入门很简单。

新项目

使用单个命令添加 Storybook,并预配置该框架

npx storybook init

该命令将自动检测您的 Next.js 项目,然后安装并配置该框架以及其他 Storybook 包。它看起来像这样

Animation illustrating what happens when you run `npx storybook@next init`

现有项目

如果您已经在使用 Storybook,请升级 Storybook 并使用此命令添加预配置的框架

npx storybook upgrade

这将执行以下操作

  1. 将您的项目升级到最新版本的 Storybook
  2. 建议与该升级相关的自动迁移
  3. 其中一次自动迁移将安装并配置此框架

如果该自动迁移不适用于您的项目,请参阅手动迁移说明。

就是这样!您现在可以在 Storybook 中为您的 Next.js 应用组件进行开发、测试和文档编写。

更多内容即将推出

通过 @storybook/nextjs 框架,您可以比以往任何时候都更容易地将 Storybook 和 Next.js 结合使用。但我们可以做得更好。以下是我们未来计划的一瞥

Three columns of text. 1st, titled Done, contains Mock-SWC support, next/image, next/link, next/router, next/navigation, next/dynamic; 2nd, titled TBD, contains next/swc, next/script, @next/font; 3rd, titled Future, contains Server Components, Turbopack builder, OG image @vercel/og

让我们知道您使用此框架构建了什么,或者您还想使用哪些其他集成。在 @storybookjs 上发推文,或通过Storybook Discord 服务器联系我们!

如果您想编写自己的框架,我们有一个全新的指南可供帮助。

特别感谢

此框架的代码和功能基于Ryan Clementsstorybook-addon-nextAaron Reismanstorybook-addon-next-router。感谢这两位提供了坚实的基础。我们还收到了 Vercel 的朋友们宝贵的反馈和指导。

加入 Storybook 邮件列表

获取最新消息、更新和发布信息

7,468开发者及更多

我们正在招聘!

加入 Storybook 和 Chromatic 团队。构建被数十万开发人员在生产中使用的工具。远程优先。

查看职位

热门帖子

Storybook 7.0 Beta

试用 Beta 版本并告诉我们您的想法
loading
Dominic Nguyen

Storybook Day 用户大会

加入我们参加有史以来的第一次用户大会
loading
Dominic Nguyen

NextJS、SvelteKit、Remix 与 Storybook 的未来

对任何框架的零配置支持
loading
Michael Shilman
加入社区
7,468开发者及更多
原因为什么选择 Storybook组件驱动的 UI
文档指南教程更新日志遥测
社区插件参与进来博客
展示探索项目组件词汇表
开源软件
Storybook - Storybook 中文

特别感谢 Netlify CircleCI