Я работаю над плагином, которому нужны модальные диалоги. Как я понял после поиска на meta, это могут реализовать как компонент Ember, так и виджет Discourse. И компонент Ember, и виджет Discourse можно прикрепить к outlet плагина, рендерить HTML и обрабатывать события.
Я нашёл только одну тему о виджетах выше; в ней лишь сказано, что виджеты Discourse рендерятся быстрее. Однако я заметил, что ядро Discourse и многие другие плагины используют как компоненты Ember, так и виджеты Discourse. Например:
Может кто-нибудь подсказать, в чём разница?
Спасибо.
Компоненты широко используются в большинстве частей Discourse. Виджеты же полезны для некоторых из самых посещаемых элементов, таких как поток сообщений темы и заголовок с его несколькими меню.
Вы часто увидите виджеты, используемые в плагинах и темах для добавления или модификации существующих виджетов.
Возьмем, к примеру, этот виджет в плагине discourse-calendar:
Это кнопка, отображаемая в оригинальном сообщении темы. Она должна быть виджетом, так как само сообщение рендерится как виджет по соображениям производительности.
НО если вы посмотрите на строки 11–17 этого файла, то увидите шаблон Handlebars, определенный в JavaScript с помощью хелпера hbs, и в этом шаблоне используются компоненты, которые рендерятся, например, как {{i18n ...}}.
Таким образом, вы можете использовать компоненты, если только элемент пользовательского интерфейса уже не рендерится как виджет. В этом случае используйте виджет. И если это имеет смысл, вы можете использовать существующие компоненты внутри виджета.
Несколько практических советов по выбору компонентов/виджетов:
Если вы отображаете их в большом количестве, для производительности, скорее всего, лучше выбрать виджеты.
Виджеты более ограничены по сравнению с компонентами и требуют более глубоких знаний для корректной работы при создании сложных интерфейсов.
Таким образом, если производительность не является проблемой и есть возможность, я предпочитаю использовать компоненты. Если же производительность важна или я вынужден использовать виджеты (например, при использовании плагинного API для декорирования другого виджета), я, вероятно, выберу виджеты.