返回博客

Storybook 生态系统 CI

保护 Storybook 用户免受包升级的困扰

loading
Michael Shilman
@mshilman
最后更新

升级 npm 包有点像穿越雷区。即使是微小的补丁升级也可能导致你的整个堆栈崩溃。不幸的是,这类问题在现代开源软件中很常见。包经常由于自身代码中的 Bug、依赖项中的 Bug 或不兼容的传递依赖升级而中断。

作为 Storybook 的维护者——它是最流行的 UI 开发工具之一——我们非常清楚包升级带来的麻烦。这就是为什么我们创建了 **Storybook 生态系统 CI**,一个早期预警系统,旨在帮助我们的用户免受这种混乱环境的影响。

  • 🚥 公共状态页面,报告官方支持配置矩阵的状态
  • ✅ 每次提交时运行的测试套件
  • 🔔 通知系统,在我们出现严重故障时提醒我们

继续阅读,了解我们正在测试的内容以及它如何已经为提高 Storybook 的稳定性带来了回报。

等等,但为什么呢?

Storybook 处于软件开发中变化最快的领域之一,我们的用户期望我们能支持各种最新的版本。

前端生态系统变化很快。框架和库定期发布更新,新的构建工具不断涌现。由于 Storybook 支持的广泛配置范围,再加上它的所有功能,跟上这些变化并非易事。

Storybook 具有庞大的兼容性矩阵

  • 10+ 渲染器: React, Vue, Angular, Web components, Svelte, Ember, HTML 等等
  • 2 种语言: JS, TS
  • 2 种构建器: Webpack, Vite
  • 3 种包管理器: npm, yarn, pnpm
  • 元框架,例如 NextJS, SvelteKit 等

另外,还有上述所有选项的各种版本 (React 16+, Vue2/3, npm6/7/8, TS 3+ 但同时也利用最新的 4.9 satisfies 特性,等等等等!😅)

你的项目使用了这些选项中的一个组合,例如 NextJS + React + Webpack + yarn。而 Storybook 支持项目配置的组合矩阵。

很难对 Storybook 进行重大更改并确保所有项目配置都能继续正常工作。Storybook 生态系统 CI 通过持续测试这个配置矩阵并及早发现问题来简化这个过程。它部分受到了 Vite 的生态系统 CI 的启发,后者值得一看。

状态页面

生态系统 CI 的核心是一个 公共状态页面。一个损坏的包对于使用该包的用户来说,类似于一次“服务中断”,我们正在努力最大化 Storybook 的“正常运行时间”。因此,我们从流行的状态面板中汲取了设计灵感

我们可视化中的每个“心跳”条都总结了针对广泛测试套件进行的每日 CI 运行。点击该条会显示哪些测试失败了,并为你提供一个链接,查看完整的 CI 运行以获取更多详细信息。

作为一名 Storybook 用户,或正在为你的项目评估 Storybook 的潜在用户,你可以查看你的配置是否受支持以及该配置近期的稳定性。

沙盒测试

我们测试每种配置的方式是创建一个沙盒。这是一个基于生成器脚本的新独立项目

'nextjs/default-js': {
  script: 'yarn create next-app nextjs-default-js --javascript --eslint',
}

我们的沙盒脚本会像用户一样安装 Storybook,添加一组故事,并运行一系列测试(Chromatic 快照,Storybook test-runnerPlaywright e2e)。

当我们将故事转换为 组件故事格式 3 (CSF3) 时,我们发现可以编写不包含任何框架/渲染器特定代码的通用故事。例如

export default {
  // React/Vue/Angular/etc. component
  component: globalThis.components.Button,
}

export const Actions = {
  play: async ({ args, canvasElement }) => {
    await fireEvent.click(within(canvasElement).getByRole('button'));
    await expect(args.onSuccess).toHaveBeenCalled();
  },
};

这使我们能够可伸缩地测试新的框架(React, Vue, Angular, Web-components, Svelte 等),而无需为每个额外的配置重复代码/工作。

通知系统

我们测试了如此多的配置,以便一旦它们出现问题就能收到通知,无论是由于 Storybook 的更改还是更广泛生态系统的更新。受 Vite 自身生态系统 CI 的启发,我们实现了一个通知系统,每当 CI 失败时就会发布到 Storybook Discord

早期成果

生态系统 CI 在部署的几周内已经捕获了多次中断。有了生态系统 CI,我们在 CI 中有了失败的重现步骤,并且有了解决问题的流程。在大多数情况下,我们在 24 小时内修复了中断。

之前,这些中断会由社区通过 GitHub issues 报告,通常没有重现步骤,而且需要几天到一周的时间才能以临时方式解决。

参与其中

前端生态系统是多样化且不断变化的,很难跟上。Storybook 生态系统 CI 是我们系统性解决这一问题、为用户创造最佳体验的尝试。它由 Michael ArestadYann BragaTom ColemanNorbert de LangenKasper PeulenMichael Shilman(我!)以及 Storybook 团队的其他人共同创建。

生态系统 CI 目前正针对 Storybook 7.0 beta 版本运行。在你的项目中尝试使用 npx storybook@next init 来体验 beta 版本,或者按照 7.0 迁移指南升级现有的 Storybook。在 GitHub 上加入我们,或者在 Discord 上与我们聊天。最后,在 Twitter 上关注 @storybookjs 以获取最新消息。

加入 Storybook 邮件列表

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

7,180开发者以及更多

我们正在招聘!

加入 Storybook 和 Chromatic 背后的团队。构建数万开发者在生产中使用的工具。远程优先。

查看职位

热门文章

Storybook 中的 Vuetify

利用开箱即用的 Vite 支持,在 Storybook 中充分利用 Vuetify 的功能
loading
Shaun Evening

组件故事格式 3 已发布

下一代故事格式,让你更高效
loading
Michael Shilman

2023 年 Storybook 的未来

增强的性能、稳定性和一些令人兴奋的新更新
loading
Michael Shilman
加入社区
7,180开发者以及更多
为什么为什么选择 Storybook组件驱动的 UI
文档指南教程更新日志遥测
社区插件参与其中博客
案例展示探索项目组件词汇表
开源软件
Storybook - Storybook 中文

特别感谢 Netlify CircleCI