返回博客

Storybook 6.4

更小巧、更快速、更具交互性

loading
Michael Shilman
@mshilman
最后更新于

Storybook 是领先的用于开发组件和页面的 UI 开发工作坊。在过去五年里,它从一个利基工具发展成为前端领域的标准配置,被 Twitter、Github、BBC 和《纽约时报》等公司的团队使用。

随着 Storybook 用户群的增长,其用例也随之增加。早期的用户使用 Storybook 来开发设计系统和库的组件。现在,团队使用它来构建、测试和文档化各种复杂的关联组件——甚至整个应用程序页面!

隔离构建 UI 有助于进行压力测试和发现边缘情况。但隔离复杂的组件会带来新的挑战,因为它们通常管理自己的状态和/或从外部源加载数据。

Storybook 6.4 让构建关联组件和页面变得更容易

  • ▶️ 交互式故事(stories),用于模拟用户行为和调试工具
  • ⚡️ 按需架构,构建体积减小 3 倍,加载时间更快
  • Automigrate + 版本化文档,让升级更容易
  • 📋 Linter,用于强制执行 Storybook 最佳实践
  • 💯 数百项其他修复和用户体验改进

交互式故事(stories)

Storybook 允许你以一种称为故事(story)的结构化格式捕获组件的各种状态。每个故事通过隔离渲染组件并提供 props 和模拟数据来模拟特定的 UI 状态。

然而,有些 UI 状态只能通过用户交互(点击、拖动、轻触、输入等)才能达到。以前在 Storybook 中无法对此进行建模。为了解决这个问题,我们在 Storybook 6.4 中添加了一个新的构造,称为 play 函数。它允许你在故事渲染后运行脚本化的交互。

请看这个用于填写表单以触发验证的 play 函数

// AccountForm.stories.js
import { within, userEvent } from '@storybook/testing-library';
import { AccountForm } from './AccountForm';

export default { component: AccountForm };

export const VerificationSuccess = {
  args: { passwordVerification: true },
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);
    await userEvent.type(canvas.getByTestId('email'), 'michael@chromatic.com');
    await userEvent.type(canvas.getByTestId('password1'), 'k32904n£#1kjad', { delay: 50 });
    await userEvent.type(canvas.getByTestId('password2'), 'k32904n£#1kjad', { delay: 50 });
    await userEvent.click(canvas.getByTestId('submit'));
  },
};

Play 函数解锁了捕获组件用例的新方法,同时也带来了一些独特的挑战。例如,如果一个交互失败了,是你的组件有 bug,还是 play 函数需要更新?

为了帮助调试这种情况,我们推出了一款实验性新插件 Storybook Interactions。安装后,它会可视化 play 函数的每一步

account-form-viz.gif

这还只是冰山一角。我们还创建了一个 Storybook linter,帮助你编写格式良好的故事和 play 函数。要了解更多信息,请查看交互式故事发布公告

按需架构

当你编写故事时,你将组件示例、指南和 API 全部集中在一个地方。团队在线发布故事,以便更容易进行审查和协作。

Storybook 现在包含的故事比以往任何时候都多。现在很常见看到项目有数百个组件和数千个故事。但我们最初的构建过程并未针对这种规模进行优化,这导致了加载时间变慢。

我们与 Webpack 和 Shopify UX 工程团队合作,创建了一种新的按需架构。这是一项根本性的改变,使得静态构建的包体积减小 3 倍,加载时间加快 4 倍。

On-demand architecture

这是如何实现的?这一性能飞跃是通过重构 Storybook 核心来实现的,使其可以独立加载每个故事,而不是将它们打包成一个单一的庞大捆绑包。

新的核心拥有比其前身更强大的测试,这为 Storybook 的未来奠定了坚实的基础!更重要的是,它为我们进一步的性能优化(如基于文件的缓存和延迟编译)做好了准备。

要了解更多信息,请阅读按需架构发布公告

精简的工具和文档

Storybook 是一个快速发展的项目。在完成日常工作的同时跟上所有变化可能会很困难。这就是为什么我们正在精简我们的工具和文档,以使升级变得轻松自如。

Automigrate 赋予你超能力,自动将你的 Storybook 更新到最新的推荐实践。例如,你正在使用 Webpack5,但你的 Storybook 仍然是 Webpack4?运行 npx sb automigrate,它将检查升级路径,解释发现的问题,并提供自动更新依赖、配置和代码的选项。从 6.4 版本开始,automigrate 将作为升级过程的一部分运行。

CleanShot 2021-11-29 at 12.06.26@2x.png

Linter 有助于确保你的故事格式良好,并使用最新的语法。这个新的辅助工具由 Yann BragaMichael Shilman (我!) 开发。如果你已经在使用 ESlint,在升级到 6.4 时将自动安装 Storybook linter。

Linter alerts you to await interactions within the play function
Linter 会提醒你在 play 函数中使用 await 进行交互

版本化文档现已可用!无法升级?你可以访问远至 6.0 的旧版本。想在实验性功能稳定之前试用吗?7.0 的 WIP 文档现在只需点击即可访问。这项巨大的用户体验改进是由 Kyle GachJoão Cardoso 带来的。

version-selector.png

Feature flags(功能标志) 为需要立即使用实验性或破坏性功能的用户提供了便利,而不会干扰其他人。例如,很多人都面临 Storybook 依赖 Emotion 10 的挑战。现在你可以使用 emotionAlias 功能标志解除 emotion 的依赖限制

module.exports = {
  features: { emotionAlias: false }
}

有关功能标志的完整列表,请参阅我们的类型定义

鉴于涉及的范围广泛和开发节奏快速,我们意识到这里还有很多工作要做。但我们希望这能使你的 6.4 升级比以往版本更易于管理。我们将继续在 Storybook 的这个领域努力,直到我们... 搞定它。🥁

框架改进

Storybook 支持所有主要的 web 前端框架,并且在每个版本中,我们都努力改进框架支持。Storybook 6.4 包含以下框架改进:

React: 感谢 Norbert de Langen,我们将 reach-router 升级到了 react-router 6。这解决了与 React 17 项目相关的 npm7 错误。

Angular: 感谢 Thibaud AvenierStefanos LignosJuri StrumpflohnerNx 团队合作进行的英勇工作,现已支持 Angular 13。

Web-components: 大量的文档改进。包括由 Chris GarrettBenny Powers 提供的 HTMLweb-components 动态生成的源代码片段,以及由 Pascal Schilp 提供的 自定义元素 manifest ArgsTable 支持

React Native (RN): Storybook for RN 的维护者 Danny Williams 为我们带来了 一种开发和文档化 RN 组件的新方法。我们传统的 RN 支持在原生设备上渲染你的组件。这个新包使用 React Native Web 在浏览器中渲染它们,以便更容易共享。此外,它还与最新版本的 Storybook 及其全套插件和工具兼容。

数百项其他改进

Storybook 在各个层面持续改进。6.4 版本包含数百项其他修复、功能和调整。查看与 6.4.0-* 匹配的更新日志,获取完整的变更列表。亮点包括:

1 分钟安装

将现有 Storybook 项目升级到 6.4

npx sb@latest upgrade

如果你从 5.x 或更早版本升级,请查看Storybook 6 迁移指南

或者,对于全新安装,将 Storybook 引导到现有应用中

npx sb@latest init

参与其中

专业 UI 开发者每天都依赖 Storybook。当你采用 Storybook 时,你将获得一套工具、强大的插件和开箱即用的集成,从而加速开发。

该项目由 1,400 多名开源贡献者维护,并由指导委员会指导。如果你有兴趣贡献,请在 GitHub 上查看 Storybook,创建 issue 或提交 pull request。在 Open Collective 上捐赠。在 Discord 与我们聊天——通常有维护者在线。通过关注 Twitter 上的 Storybook 动态并订阅我们的邮件列表,及时了解最新消息。

加入 Storybook 邮件列表

获取最新新闻、更新和发布

7,180开发者及更多用户

我们正在招聘!

加入 Storybook 和 Chromatic 团队。构建被数十万开发者用于生产环境的工具。远程优先。

查看职位

热门文章

组件百科全书抢先看

浏览世界各地的 UI 组件,发现有效的技术
loading
Dominic Nguyen

如何将 Storybook 与 ESLint 结合使用

在代码编辑器中自动验证故事
loading
Yann Braga

Storybook + Netlify CMS

将你的内容引入 Storybook
loading
Varun Vachhar
加入社区
7,180开发者及更多用户
为什么为什么选择 Storybook组件驱动 UI
文档指南教程更新日志遥测
社区插件参与其中博客
案例展示探索项目组件词汇表
开源软件
Storybook - Storybook 中文

特别鸣谢 Netlify CircleCI