在插件中,如何强制客户端重新加载 extra-locales 文件?

我们创建了一个自定义 JS 方法来进行一些自定义区域设置工作,该方法使用自定义属性加载浏览器端的 I18n 对象。

我想在每个依赖的客户端上触发对此 JsLocaleHelper 方法的重新评估。

我正在尝试寻找一种从服务器端触发此的方法。

这以前是可行的,但最近似乎有所改变。

当我从浏览器中删除本地客户端缓存时,数据是正确的,但这显然不适用于生产环境。这证明了问题在于本地缓存。

我尝试过的方法包括:

Discourse.request_refresh!

或者更具针对性的:

Discourse.request_refresh!(user_ids: user_ids)

这似乎会在导航时强制刷新。但是,我怀疑脚本被缓存了,所以这不是一个解决方案。

任何帮助都将不胜感激!

1 个赞

请注意,此函数在存在 user_ids 参数和不存在时行为差异很大。

您是否尝试过 MessageBus.publish \"/file-change\", [\"refresh\"]

3 个赞

好主意,这行得通!谢谢

但这可扩展吗?

2 个赞

不,我不这么认为 :frowning:

2 个赞

虽然这很有帮助,但我会继续深入研究。

如果我们能找到一种随时间传播的风格,我们可能就可以开始了。

不过,如果能精确地定位到文件就更好了。

2 个赞

好的,我在这里真是左右为难。

我学到的东西如下:

  1. extra-locales 包被添加为脚本标签。
  2. 它们包含一个版本参数,该参数取决于包的名称。
  3. 我认为版本号只在引导时进行评估,因此将一直缓存直到:
  • 您强制客户端完全刷新,这似乎只能批量进行?
  • 您重新启动服务器
  • 或者客户端清除其浏览器缓存

至少可以说,缺乏更精细的控制是很不幸的。

  • 我们能否在导航消息中引入“完全刷新”?
2 个赞

我刚刚测试了 Discourse.request_refresh!,它似乎会在下次导航时重新加载所有javascript资源。它可能不会触发 JsLocaleHelper 刷新,我对它的工作原理了解不够。

有一个微妙的事情在发生。

“200”实际上是“200 (cached)”,这是浏览器端的。

关于此事的优秀 Stack Overflow 帖子。

1 个赞

哎呀……:scream: ……没检查那个。

2 个赞

在更改 extra-locales 后,您是否尝试调用 ExtraLocalesController.clear_cache!?它应该在下次请求时重新计算版本。

2 个赞

谢谢。是的,我有。我相信那只是服务器端,并且不会更改引导期间设置的提供的 JS 文件上的版本号。服务器端没有问题。

我正在考虑将此数据移至 site 对象和序列化器,看看是否可以获得更多控制权。

好吧,我猜我不太明白你想完成什么。:thinking:
我原以为你只是想让客户端在下次重新加载时获取你在服务器上添加的数据。如果你想在客户端完成所有操作,为什么不直接在客户端更新 I18n.extras

2 个赞

是的,正是这样。

如果我从 rails 控制台运行该命令,它如何使客户端上的脚本失效?

(供参考,标签是特殊情况,因为它们用于 slug,所以我必须添加一个特殊对象来包含翻译,我无法在每个地方序列化标签翻译,因为路由将不起作用)。

下次客户端重新加载页面时,它将看到不同的 HTML 哈希并加载新脚本。这就是“自定义文本”功能(它使用“overrides”包)的工作方式。


<link rel="preload" href="/extra-locales/overrides?v=ecb7809c205de318b2c16d1b51d4b6f6" as="script">

3 个赞

我能够重现该问题。

因此,我没有使用覆盖(overrides),因为我们讨论的不是客户端的 vanilla JS 本地化。

出于某种原因,我们自定义的 JsLocaleHelper 文件目前未能接入该版本号更新系统。

但这非常有帮助,谢谢 Gerhard,因为我将能够研究服务器是如何导致该版本号被更新的。

我还注意到覆盖文件是可自由选择的,真有趣!

1 个赞

@gerhard 非常有帮助,谢谢。

问题已解决。我只需要确保版本号基于自定义 js 文件的内容。现在它可以在开发环境中运行 :rocket:

4 个赞

此对话的完整结果隐含在此 PR 中: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub

4 个赞