Storybook 中 Meteor.startup 的等价物

What's an equivalent to Meteor.startup in Storybook

我一直在尝试将 Meteor 框架 Vulcan.js 与 Storybook 集成。困难来自构建系统的差异。目前,我们可以使用 Webpack 在 Storybook 中加载一些特定的 Meteor 包。

所以,现在我们需要在 Storybook 中模仿一些额外的 Meteor 功能。我们依靠 Meteor.startup() 回调来初始化特定的 React 组件,该组件是其他组件的注册表。但是我在 Storybook 中找不到任何等效的模式。

Meteor.startup()注册的回调的特点如下:

我试过写一个插件,但它不起作用,因为插件有自己的构建系统。因此他们无法访问我们的 Meteor 包,但他们需要它们才能正常工作。

我试过写一个装饰器。这是一个不错的解决方案,但我有奇怪的行为,因为它 运行 是每个组件安装上的启动函数(这是在导入之后但在渲染之前 运行 它们的唯一方法)。这是我目前最好的选择,但似乎不是最佳选择。

最后一个解决方案是运行将代码放在相关故事的顶部。它有效,但容易出错并影响开发者体验

所以,问题来了:如何在 Storybook 中定义回调,使其在启动期间 运行,就像 Meteor.startup 回调一样?

如果你深入研究它,在客户端上 Meteor.startup 只是 document.addEventListener('DOMContentLoaded', func)

的包装

所以通过监听事件应该很容易复制

理想情况下,您为其编写故事的任何 React 组件都应该是纯渲染组件,并且不应引用任何特定于 Meteor 的内容,例如 Meteor....

通常的方法是编写一个容器组件,它执行加载数据(例如使用 withTracker())和调用任何所需的 Meteor 函数等操作。它应该将实用函数作为 props 传递给组件。

Storybook 只需要提供这些功能作为道具 - 您可以使用动作插件:https://www.npmjs.com/package/@storybook/addon-actions

Storybook Addon Actions

Storybook Addon Actions can be used to display data received by event handlers in Storybook.

起初这似乎很难,但实际上在任何环境中保持组件纯净都是一种很好的做法。他们的工作是提供渲染,并将事件传递给逻辑和 api(位于其他地方)。这也意味着组件可以重复使用(即使在非 meteor 项目中),并且更容易测试,因为你不需要模拟你的 meteor 环境)