В плагине, как принудительно заставить клиентов перезагрузить файл extra-locales?

Мы создали пользовательский метод JS для работы с кастомными локалями, который загружает объект I18n на стороне браузера с использованием пользовательского атрибута.

Я хочу инициировать повторную оценку метода JsLocaleHelper для каждого из зависимых клиентов.

Пытаюсь найти способ вызвать это с серверной стороны.

Раньше это работало, но, похоже, недавно что-то изменилось.

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

Среди尝试ов было следующее:

Discourse.request_refresh!

или более точный:

Discourse.request_refresh!(user_ids: user_ids)

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

Буду признателен за любую помощь!

Обратите внимание, что эта функция ведет себя совершенно по-разному в зависимости от того, присутствует ли параметр user_ids или нет.

Вы пробовали MessageBus.publish "/file-change", ["refresh"]?

Отличная идея, это работает! Спасибо.

Но насколько это масштабируемо?

Нет, я так не думаю :frowning:

Это очень помогает, хотя я продолжу искать.

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

Хотя было бы лучше нацелиться на точный файл.

Окей, мы оказались между молотом и наковальней.

Вот что я выяснил:

  1. Пакеты extra-locales добавляются как теги <script>.
  2. Они содержат параметр версии, который зависит от имени пакета.
  3. Номер версии, полагаю, вычисляется только при загрузке (bootstrap), поэтому остаётся в кэше до тех пор, пока:
  • вы не заставите клиентов выполнить полную перезагрузку страницы, что, судя по всему, возможно только массово;
  • вы не перезапустите сервер;
  • или клиент не очистит кэш браузера.

Это, мягко говоря, досадно, что нет более гибкого контроля.

  • Можем ли мы добавить «полную перезагрузку» по навигационному сообщению?

Я только что протестировал Discourse.request_refresh!, и он действительно перезагружает все JavaScript-активы при следующем переходе. Возможно, это не вызывает обновление JsLocaleHelper, так как я недостаточно осведомлён о том, как это работает.

Тут есть тонкий момент.

«200» на самом деле означает «200 (из кэша)», что относится к стороне браузера.

Хорошая статья на Stack Overflow об этом.

Аргх… :scream: … не проверил(а) этого.

Вы пробовали вызвать ExtraLocalesController.clear_cache! после внесения изменений в extra-locales? Это должно пересчитать версию при следующем запросе.

Спасибо. Да, у меня есть. Я полагаю, что это происходит только на стороне сервера и не меняет номер версии в наборе JS-файлов, настроенном во время инициализации. На стороне сервера проблем нет.

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

Что ж, полагаю, я не понимаю, чего вы пытаетесь добиться. :thinking:
Я предположил, что вы хотите, чтобы клиент просто подхватывал данные, добавленные на сервере, при следующей перезагрузке. Если вы хотите делать всё на стороне клиента, почему бы не обновить I18n.extras напрямую на клиенте?

Да, именно это.

Если я запущу эту команду из консоли Rails, как это приведет к инвалидации скриптов на клиенте?

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

В следующий раз, когда клиент перезагрузит страницу, он увидит в HTML другой хэш и загрузит новый скрипт. Именно так работает функция «Настройка текста» (она использует пакет «overrides»):

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

Я могу воспроизвести это.

Поэтому я не использую переопределения для этого, так как речь не идет о стандартной локализации клиентского JavaScript.

По какой-то причине текущее использование нашего файла JsLocaleHelper не интегрируется с системой обновления номера версии.

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

Также обращаю внимание, что файл переопределений является необязательным, интересно!

@gerhard это было чрезвычайно полезно, спасибо.

Проблема решена. Мне просто нужно было убедиться, что номер версии основан на содержимом файла пользовательского JS. Теперь у меня это работает в dev :rocket:

Полные результаты этого диалога подразумеваются в этом PR: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub