Ember 组件和 Discourse 小部件有何不同?

我正在开发一个需要模态对话框的插件。通过搜索 Meta 论坛,我了解到 Ember 组件和 Discourse 小部件都可以实现这一功能。两者都可以附加到插件出口(plugin outlet),渲染 HTML 并处理事件。

我目前只找到了上面关于小部件的一个主题,其中仅提到 Discourse 小部件的渲染速度更快。但我发现 Discourse 核心代码以及许多其他插件同时使用了 Ember 组件和 Discourse 小部件。例如:

有人能告诉我它们之间的区别吗?
谢谢。

1 个赞

组件在 Discourse 的大多数地方被广泛使用。小部件(widgets)则在某些流量极高的元素上特别有用,例如主题帖子流以及带有多个菜单的页头。

你经常会在插件和主题中看到小部件被用来添加或修改现有小部件。

discourse-calendar 插件中的这个小部件为例:

这是一个渲染在主题原始帖子中的按钮。它必须是一个小部件,因为出于性能考虑,帖子本身也是以小部件形式渲染的。

但是,如果你查看该文件的第 11 到 17 行,你会看到通过 hbs 辅助函数在 JavaScript 中定义了一个 Handlebars 模板,而该模板中包含像 {{i18n ...}} 这样渲染的组件。

因此,通常你可以使用组件,除非该 UI 元素已经被渲染为小部件。在这种情况下,请使用小部件。如果合理,你可以在小部件内部利用现有的组件。

7 个赞

感谢您的回答!这正是我想知道的。

2 个赞

选择组件或小部件的一些经验法则:

  • 如果您要显示大量内容,出于性能考虑,您可能更倾向于选择小部件。
  • 小部件比组件更受限,在构建复杂 UI 时,需要更多知识才能实现完美运行。

因此,基本上,如果性能不是问题且可以使用,我会优先选择组件。如果性能是个问题,或者被迫使用(例如:使用插件 API 装饰另一个小部件),我可能会选择小部件。

9 个赞