В рамках проекта по обновлению Discourse до последней версии Ember мы провели значительную рефакторинг маршрутов Discovery (также известных как «список тем»).
Эта тема адресована разработчикам тем и плагинов и призвана перечислить виды активности в темах и плагинах, которые могут быть затронуты рефакторингом.
Предыстория
Данный рефакторинг необходим, поскольку современный Ember больше не поддерживает «именованные outlets» вроде {{outlet "topics"}}, которые мы активно использовали в этих маршрутах. По сути, все контроллеры и шаблоны, которые ранее рендерились в именованные outlets, были преобразованы в компоненты.
По пути мы также воспользовались возможностью модернизировать и консолидировать соответствующий код (например, все типы маршрутов Discovery теперь используют один и тот же контроллер и шаблон).
Реализация изменений в ядре ещё не завершена, но черновой вариант можно найти на этой ветке. Конкретной даты слияния пока нет, но мы ожидаем, что это произойдёт в течение следующих нескольких недель. Если у вас возникнут вопросы или опасения, пожалуйста, дайте нам знать!
Какие активности тем/плагинов затронуты?
Этот рефакторинг в основном затрагивает слой «контроллеров». Маршруты практически не изменились, как и всё, что находится ниже компонента <TopicList />.
Мы ожидаем, что влияние коснётся только тех тем и плагинов, которые глубоко вмешиваются в код ядра (например, через modifyClass и переопределения шаблонов). Определённые API и outlets остаются неизменными.
Переопределения шаблонов
Эти шаблоны были рефакторированы в компоненты. Существующие переопределения перестанут работать без предупреждения.
navigation/categoriesnavigation/categorynavigation/defaultnavigation/filterdiscovery/topics
Эти шаблоны были значительно рефакторированы. Существующие переопределения шаблонов, скорее всего, вызовут катастрофические ошибки на сайте.
discoverytag/showuser-topics-listuser/messagesdiscovery/categoriescomponents/basic-topic-listcomponents/d-navigation
Технически возможно переопределять новые шаблоны, введённые этим изменением. Однако переопределения шаблонов не рекомендуются и уходят в прошлое.
Поэтому все переопределения шаблонов следует удалить и заменить более надёжными API расширения (например, плагин-отверстиями). Если вы делаете что-то, что, по вашему мнению, невозможно с помощью существующих точек расширения Discourse, пожалуйста, сообщите нам!
modifyClass и вызовы lookup()
Эти классы больше не существуют. modifyClass перестанет работать без предупреждения. Вызовы lookup() вернут null (что может привести к ошибкам). В наиболее распространённых случаях мы добавили совместимые заглушки (см. сноски).
controller:discoverycontroller:discovery/topics[1]controller:discovery-sortable( →controller:discovery/list)controller:discovery-filter( →controller:discovery/filter)controller:navigation/categoriescontroller:navigation/category[2]controller:navigation/defaultcontroller:tag/show[3]controller:discovery.*( →controller:discovery/list)
Эти классы подверглись значительному рефакторингу. Вызовы modifyClass и lookup могут потребовать рефакторинга:
route/discoveryroute/discovery.*route/tag-show
Маршруты
Имена маршрутов (т. е. router.currentRouteName) остались без изменений.
Хуки model() маршрутов Discovery (т. е. router.currentRoute.attributes) в основном остались без изменений.
Плагин-отверстия
Все плагин-отверстия и их аргументы остались без изменений.
HTML / CSS
Структура HTML и классы в основном остались без изменений.