Экспериментальная функция «lazy_loaded_categories» включена на Meta

:information_source: Этот проект пока приостановлен. Возможно, мы вернёмся к нему в будущем и опубликуем обновление здесь, если это произойдёт.

Мы представляем экспериментальную функцию, которая поможет сообществам с большим количеством категорий. :rocket:

В течение последних нескольких месяцев мы усердно работали над тем, чтобы сайты на базе Discourse лучше справлялись с сообществами, имеющими множество категорий (и не только!). Это позволит администраторам создавать тысячи категорий, сохраняя при этом привычный и удобный пользовательский интерфейс.

Это всё ещё экспериментальная функция, которую можно включить, изменив параметр сайта lazy_loaded_categories_groups. По умолчанию она отключена.

:gear: Как это работает?

В настоящее время все данные о категориях загружаются при переходе на сообщество Discourse. Это называется «предзагрузкой» (eager loading) и не является оптимальным решением для сайтов с большим количеством категорий, так как означает передачу большого объёма информации до первого отображения, что увеличивает общее время загрузки.

Новый метод называется «ленивой загрузкой» (lazy loading) и откладывает загрузку информации о категории до тех пор, пока она действительно не понадобится (например, при поиске категории, навигации по ней или создании ссылки на неё, чтении темы или сообщения, в которой она упоминается, и т. д.). Меньший объём передаваемых данных означает более быструю загрузку и довольных пользователей! :star:

:discourse: Что это значит для вас как участника Meta?

Мы активно тестировали эту функцию внутренне, но, учитывая масштаб проделанной работы, существует небольшая вероятность появления ошибок. Если вы заметите какие-либо сбои, связанные с категориями, сообщите нам об этом в ответе на эту тему или создайте тему с тегом bug.

:people_holding_hands: Что это значит для вас или вашего сообщества?

Независимо от того, размещаете ли вы свой сайт на нашей платформе или используете собственную хостинг-инфраструктуру, эта функция по умолчанию отключена, и видимых изменений быть не должно.

Однако, если вы планируете расширить своё сообщество до большого количества категорий, мы настоятельно рекомендуем включить эту функцию.

В будущем мы включим её по умолчанию и в конечном итоге устареваем и удалим код, отвечающий за «предзагрузку» категорий.

:technologist: Что это значит для разработчиков плагинов и тем?

В целом, для большинства плагинов потребуется минимальное изменение или вообще никаких изменений, если они используют компоненты категорий из ядра или предзагруженные данные (например, выполняют запрос только для категорий, которые уже видны при загрузке страницы, поскольку это означает, что они уже предзагружены).

Некоторые проблемы могут возникнуть при попытке использовать информацию о категориях, которые ещё не загружены. Метод Category.findByIds по-прежнему будет возвращать только уже загруженные категории, тогда как Category.asyncFindByIds может выполнить запрос к серверу, если информация ещё не загружена.

44 лайка

Кажется, информация о категории отсутствует, когда вы используете одну из ссылок под сообщением для перехода к теме в другой категории. Я открыл Contributing translations to Discourse в новой вкладке и перешёл по ссылке Switching from Transifex to Crowdin, и вот что получилось:


После перезагрузки категория появляется.

6 лайков

После того как я создал тему #site-feedback:theme-feedback, значок категории отсутствовал для тем этой категории

4 лайка

Функция поиска в редакторе не может определить, есть ли соответствующая категория.

3 лайка

Это тоже связано с ленивой загрузкой категорий?

2 лайка

Да. Я временно отключил параметр lazy_load_categories, так как он вызывал сбои в плагине документации.

5 лайков

Мы снова включили этот эксперимент здесь. Вот что было исправлено с момента последнего включения:

  • Категории в заголовке теперь заполняются корректно, особенно при переходе от одной темы к другой через ссылки на посты или предложенные темы.

  • Стилизация значков отображается правильно после создания новой темы в категории, к которой ранее не осуществлялся переход.

  • Плагин Docs теперь предзагружает данные о категориях, поэтому страница /docs теперь отображается корректно.

  • Исправлены другие ошибки, выявленные в ходе внутренней проверки.

Единственная оставшаяся проблема касается отсутствия результатов поиска для некоторых запросов (коротких запросов или запросов, содержащих только стоп-слова).

Мы хотели сделать поиск более мощным и расширили движок полнотекстового поиска на категории, и это является нежелательным побочным эффектом. Я думаю, что нам придется откатить предыдущий алгоритм поиска, но мы все еще проводим расследование.

7 лайков

Категории для модераторов категорий на странице /about отсутствуют

Также при просмотре моих черновиков категории отсутствуют.

Страница активности группы или пользователя, а также уведомления в моём профиле, такие как https://meta.discourse.org/my/notifications/responses, не загружают категории.

При открытии редактора для создания новой темы со ссылкой в сообщении или при нажатии на новое сообщение в папке входящих и использовании конверта в верхнем левом углу редактора для преобразования черновика в черновик новой темы, отсутствует возможность выбора категории.

8 лайков

При открытии /categories отображаются не все подкатегории Documentation (#documentation:theme-developers исчезает после перезагрузки, пока я не нажму на Documentation).

Кроме того, автодополнение при поиске категорий не работает. После перезагрузки большинство категорий не отображаются.

3 лайка

Категории также отсутствуют в списке связанных тем.

А когда я зашел в темы, чтобы загрузить категории для второго скриншота, я заметил, что во второй теме #announcements:blog категория под заголовком темы отсутствовала. Я предполагаю, что это не важно, потому что такого не должно происходить, когда работают связанные темы.

4 лайка

Однако это, похоже, вызывает проблему в одном из моих плагинов на версии 3.2.1 stable.

Когда я проверяю Site.current().categories и включена ленивая загрузка, я вижу (только) нужные мне категории (например, категорию для текущей темы), но все preloaded_category_custom_fields, похоже, отсутствуют.

Они появляются, когда я отключаю ленивую загрузку (вместе со всеми остальными категориями).

Таким образом, нужная категория предзагружается, но в ней отсутствуют её предзагруженные поля.

1 лайк

Это исправлено. :white_check_mark:

Исправлено тоже. :white_check_mark:

И это тоже исправлено. :white_check_mark:

Работа над остальными проблемами продолжается. Большое спасибо за вашу обратную связь, @Moin.

Это зависит от того, как были загружены категории. Я согласен, что, вероятно, существуют некоторые пути выполнения кода, которые могут приводить к загрузке частичных данных о категориях. Я обсудлю эту проблему с командой, но поскольку мы движемся к состоянию, когда фронтенд должен будет запрашивать необходимые данные перед их использованием.

Это публичный плагин? Если да, я могу посмотреть на него. В целом, самые популярные плагины, которые у нас есть, требовали очень незначительных изменений для работы при включённой «ленивой загрузке категорий».

3 лайка

Цвет родительской категории всё ещё отсутствует


2 лайка

Это происходит в обычном просмотре темы.

Единственное, что может быть особенным, это то, что код находится в инициализаторе, в виджете, который прикреплен к виджету post-contents:before. Плагин не является публичным, но я могу предоставить вам доступ, если вы отправите мне в личные сообщения свой логин на Github. В качестве альтернативы я могу отправить вам сообщение с архивом tar.gz, что может быть проще. Плагин старый и изначально был написан не мной, но я также не вижу ничего явно ошибочного.

Так как же это будет работать? Я понимаю бинарную ситуацию: категория либо есть, либо её нет. Но если я сталкиваюсь с категорией без определенного пользовательского поля, как я узнаю, отсутствует ли это поле или оно просто еще не полностью загружено?

то есть этого никогда не должно происходить!

1 лайк

Так что, не мог бы ты помочь мне с этим, @nbianca?

Когда включена ленивая загрузка, пользовательские поля отсутствуют в объекте категории здесь в моём публичном плагине Private Replies.

      if ((siteSettings.private_replies_on_selected_categories_only == false) || (topic?.category?.custom_fields?.private_replies_enabled)) {
        return this.currentUser && ((this.currentUser.id == topic_owner_id) || this.currentUser.staff);
      }

и я не знаю, как их получить.

Я добавляю это поле в предварительно загружаемые пользовательские поля категорий.

Site.preloaded_category_custom_fields << 'private_replies_enabled'

Я обсуждаю это с командой внутренне, но, думаю, нам придётся пересмотреть способ предварительной загрузки категорий для тем.

2 лайка

Я нашел еще одно место, где отсутствуют категории: результаты поиска с помощью ИИ.

2 лайка

Когда я обновляю meta.discourse.org и нажимаю + Новая тема, шаблон темы не появляется. Изначально, как показано в видео, всё работает корректно. Однако после перезагрузки шаблон отсутствует. Как только я снова открываю редактор, всё возвращается к нормальной работе.

Примечание: Если в боковой панели есть Support, его необходимо удалить перед перезагрузкой.

1 лайк

Базед и скейлабилити-пилл.