Meta 上启用了实验性“lazy_loaded_categories”功能

我们正在推出一项实验性功能,以帮助拥有大量类别的社区。:rocket:

在过去的几个月里,我们一直在努力使 Discourse 站点更好地服务于拥有众多类别的社区(以及其他方面!)。这将允许管理员创建数千个类别,同时保持您熟悉的友好用户体验。

这仍然是一项实验性功能,可以通过调整 lazy_loaded_categories_groups 站点设置来启用。目前默认禁用。

:gear: 这是如何工作的?

目前,当您导航到 Discourse 社区时,所有类别数据都会被加载。这被称为“急切加载”,对于拥有众多类别的站点来说并不理想,因为它意味着在第一次渲染之前会传输大量信息,从而增加了整体加载时间。

新方法称为“延迟加载”,它将推迟加载类别信息,直到真正需要时(例如,在搜索类别、导航或链接类别、阅读提及类别的帖子或主题时,等等)。传输的数据越少,加载时间就越快,用户也就越满意!:star:

:discourse: 这对您作为 Meta 的成员意味着什么?

我们一直在内部大量测试此功能,但鉴于所做的工作量,可能会引入一些错误。如果您注意到与类别相关的任何功能失常,请在回复此主题时告知我们,或打开一个 Bug 主题。

:people_holding_hands: 这对您或您的社区意味着什么?

无论您是由我们托管还是自行托管,此功能默认处于禁用状态,应该不会有任何可见的变化。

但是,如果您希望扩展您的社区以拥有许多类别,我们强烈建议您启用此功能。

将来,我们将默认启用它,并最终弃用并删除“急切加载”类别的代码。

:technologist: 这对插件和主题开发者意味着什么?

总的来说,对于大多数插件来说,应该只需要很少或不需要更改,只要它们使用核心的类别组件或预加载的数据(例如,仅查询页面加载时已可见的类别,因为这意味着它们已经被预加载了)。

在尝试使用尚未加载的类别信息时,可能会出现一些问题。Category.findByIds 方法将继续只返回已加载的类别,而 Category.asyncFindByIds 如果信息尚未加载,则可能会在服务器上执行查找。

44 个赞

当您使用帖子下方的一个链接导航到不同类别的主题时,类别信息似乎丢失了。我打开了 Contributing translations to Discourse 在新标签页中,然后导航到 https://meta.discourse.org/t/switching-from-transifex-to-crowdin/140288,看起来是这样的:


刷新后,类别就会出现。

6 个赞

在我发布了我的 #site-feedback:theme-feedback 主题后,该类别的主题缺少类别徽章。

4 个赞

Composer 中的搜索功能无法确定是否存在匹配的类别。

3 个赞

这是否也与延迟加载的类别有关?

2 个赞

是的。我暂时禁用了 lazy_load_categories,因为它破坏了 docs 插件。

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

启用延迟加载后,自定义字段在我的公共私信插件的类别对象中丢失 此处

      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 个赞

我在另一个地方也发现了类别缺失:AI 搜索结果。

2 个赞

当我刷新 meta.discourse.org 并选择“+ 新建主题”时,主题模板未能显示。最初,如视频所示,一切都正常工作。但是,在重新加载后,模板消失了。一旦我再次打开编辑器,一切又恢复正常。

注意:如果您的侧边栏中有 Support,则必须在重新加载之前将其删除。

1 个赞

基于和可扩展性。