Включена экспериментальная функция 'lazy_loaded_categories' на Meta

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

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

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

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

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

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

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

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

Мы тщательно тестировали эту функцию внутри компании, но, учитывая масштаб проделанной работы, есть небольшая вероятность появления ошибок. Если вы заметите какие-либо проблемы, связанные с категориями, сообщите нам об этом, ответив на эту тему или создав тему в разделе Contribute > 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 лайк

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