我一直试图将Meteor框架Vulcan.js与Storybook集成在一起。困难来自构建系统的差异。目前,我们可以使用Webpack在Storybook中加载一些特定的Meteor软件包。
因此,现在我们需要在Storybook中模仿一些其他的Meteor功能。我们依靠Meteor.startup()
回调来初始化特定的React组件,该组件是其他组件的注册表。但是我在Storybook中找不到任何等效的模式。
在Meteor.startup()
中注册的回调的特征如下:
after
,该应用已构建。因此,不可能只编写一个“启动”文件并将其导入,因为它将运行得太早,因此注册表仍然为空before
故事实际上是渲染或加载的。基本上保证Meteor.startup
回调是要运行的第一个函数。因此,在装饰器中调用相关功能可能为时已晚。我尝试编写插件,但是由于插件具有自己的构建系统,因此无法正常工作。因此,他们无法访问我们的Meteor软件包,但他们需要它们才能正常工作。
我试图写一个装饰器。那是一个好的解决方案,但是我有一个奇怪的行为,因为它在每个组件安装上都运行启动功能(这是在导入之后但在渲染之前运行它们的唯一方法)。目前,这是我最好的选择,但似乎不尽人意。
最后一个解决方案是在相关故事的顶部运行代码。它可以工作,但是容易出错,并且会影响开发人员的体验
因此,这是一个问题:如何在Storybook中定义一个回调,以便在启动期间像Meteor.startup
回调那样运行该回调?
答案 0 :(得分:2)
如果您深入研究它,则客户端Meteor.startup
只是document.addEventListener('DOMContentLoaded', func)
的包装器
因此,通过监听事件可以很容易地复制
答案 1 :(得分:0)
理想情况下,您正在编写故事的任何React组件都应该是纯渲染组件,并且不应引用流星特定的任何内容,例如Meteor...
。
通常的方法是编写一个容器组件,该组件执行诸如加载数据(例如,使用withTracker()
)和调用所需的任何Meteor函数的操作。它应该将实用程序功能作为道具传递给组件。
Storybook仅需要提供以下功能作为道具-您可以使用附加动作:https://www.npmjs.com/package/@storybook/addon-actions
Storybook附加操作
Storybook Addon Actions可用于显示事件处理程序在Storybook中接收到的数据。
乍一看,这似乎很困难,但实际上,在任何环境中保持组件纯净都是一种好习惯。他们的工作是提供渲染,并将事件传递给逻辑和api(位于其他位置)。这也意味着这些组件可以重复使用(即使在非流星项目中),并且易于测试,因为您不需要模拟流星环境)