Ноябрь 2023 — рефакторинг маршрутов Discovery: как это повлияет на мою тему/плагин?

В рамках проекта по обновлению Discourse до последней версии Ember мы провели значительную рефакторинг маршрутов Discovery (также известных как «список тем»).

Эта тема адресована разработчикам тем и плагинов и призвана перечислить виды активности в темах и плагинах, которые могут быть затронуты рефакторингом.

Предыстория

Данный рефакторинг необходим, поскольку современный Ember больше не поддерживает «именованные outlets» вроде {{outlet "topics"}}, которые мы активно использовали в этих маршрутах. По сути, все контроллеры и шаблоны, которые ранее рендерились в именованные outlets, были преобразованы в компоненты.

По пути мы также воспользовались возможностью модернизировать и консолидировать соответствующий код (например, все типы маршрутов Discovery теперь используют один и тот же контроллер и шаблон).

Реализация изменений в ядре ещё не завершена, но черновой вариант можно найти на этой ветке. Конкретной даты слияния пока нет, но мы ожидаем, что это произойдёт в течение следующих нескольких недель. Если у вас возникнут вопросы или опасения, пожалуйста, дайте нам знать!

Какие активности тем/плагинов затронуты?

Этот рефакторинг в основном затрагивает слой «контроллеров». Маршруты практически не изменились, как и всё, что находится ниже компонента <TopicList />.

Мы ожидаем, что влияние коснётся только тех тем и плагинов, которые глубоко вмешиваются в код ядра (например, через modifyClass и переопределения шаблонов). Определённые API и outlets остаются неизменными.

Переопределения шаблонов

:shushing_face: Эти шаблоны были рефакторированы в компоненты. Существующие переопределения перестанут работать без предупреждения.

  • navigation/categories
  • navigation/category
  • navigation/default
  • navigation/filter
  • discovery/topics

:boom: Эти шаблоны были значительно рефакторированы. Существующие переопределения шаблонов, скорее всего, вызовут катастрофические ошибки на сайте.

  • discovery
  • tag/show
  • user-topics-list
  • user/messages
  • discovery/categories
  • components/basic-topic-list
  • components/d-navigation

Технически возможно переопределять новые шаблоны, введённые этим изменением. Однако переопределения шаблонов не рекомендуются и уходят в прошлое.

Поэтому все переопределения шаблонов следует удалить и заменить более надёжными API расширения (например, плагин-отверстиями). Если вы делаете что-то, что, по вашему мнению, невозможно с помощью существующих точек расширения Discourse, пожалуйста, сообщите нам!

modifyClass и вызовы lookup()

:wastebasket: Эти классы больше не существуют. modifyClass перестанет работать без предупреждения. Вызовы lookup() вернут null (что может привести к ошибкам). В наиболее распространённых случаях мы добавили совместимые заглушки (см. сноски).

  • controller:discovery
  • controller:discovery/topics[1]
  • controller:discovery-sortable ( → controller:discovery/list)
  • controller:discovery-filter ( → controller:discovery/filter)
  • controller:navigation/categories
  • controller:navigation/category [2]
  • controller:navigation/default
  • controller:tag/show [3]
  • controller:discovery.* ( → controller:discovery/list)

:technologist: Эти классы подверглись значительному рефакторингу. Вызовы modifyClass и lookup могут потребовать рефакторинга:

  • route/discovery
  • route/discovery.*
  • route/tag-show

Маршруты

:motorway: Имена маршрутов (т. е. router.currentRouteName) остались без изменений.

:clipboard: Хуки model() маршрутов Discovery (т. е. router.currentRoute.attributes) в основном остались без изменений.

Плагин-отверстия

:electric_plug: Все плагин-отверстия и их аргументы остались без изменений.

HTML / CSS

:art: Структура HTML и классы в основном остались без изменений.


  1. Доступ только для чтения к свойству model обеспечен заглушкой с уведомлением об устаревании. ↩︎

  2. Доступ только для чтения к свойству category обеспечен заглушкой с уведомлением об устаревании. ↩︎

  3. Доступ только для чтения к свойству tag обеспечен заглушкой с уведомлением об устаревании. ↩︎

На этой неделе мы расширим тестирование этого изменения на нашей хостинговой инфраструктуре, с целью слияния в main/tests-passed на следующей неделе (6 ноября).

Это изменение теперь активно в main/tests-passed