Meta 启用实验性“lazy_loaded_categories”功能

:information_source: 该项目目前已暂停。我们可能会在将来重新考虑,如果决定继续,将在此处发布更新。

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

过去几个月,我们一直在努力改进 Discourse 站点,使其能更好地服务于拥有众多分类(不仅限于此)的社区。这将允许管理员创建数千个分类,同时保持你熟悉的友好用户体验。

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

:gear: 它是如何工作的?

目前,当你导航到 Discourse 社区时,所有分类数据都会被加载。这被称为“预加载”(eager loading),对于拥有大量分类的站点来说并不理想,因为它意味着在首次渲染之前会传输大量信息,从而增加了整体加载时间。

新方法称为“懒加载”(lazy loading),它将推迟加载分类信息,直到真正需要时(例如,在搜索分类、导航或链接某个分类、阅读提及某个分类的主题或帖子等时)。传输的数据更少意味着加载速度更快,用户也更满意!:star:

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

我们一直在内部对该功能进行大量测试,但鉴于所做的工作量,存在引入轻微 bug 的可能性。如果你发现与分类相关的任何功能异常,请在本主题下回复告知我们,或创建一个 Contribute > 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 个赞

基于和可扩展性。