Em um plugin, como posso forçar clientes a recarregar o arquivo extra-locales?

Criamos um método JS personalizado para um trabalho de localidade personalizado que carrega o objeto I18n do lado do navegador com um atributo personalizado.

Quero acionar uma reavaliação deste método JsLocaleHelper em cada um dos clientes dependentes.

Estou tentando encontrar uma maneira de acionar isso do lado do servidor.

Isso costumava funcionar, mas parece ter mudado recentemente.

Os dados estão corretos quando eu excluo o cache local do cliente do navegador, mas obviamente isso não é viável para uso em produção. Isso prova que o problema é o cache local.

Coisas que tentei incluem:

Discourse.request_refresh!

ou o mais direcionado:

Discourse.request_refresh!(user_ids: user_ids)

que parece forçar a atualização na navegação. No entanto, suspeito que o script está sendo cacheado, então esta não é uma solução.

Qualquer ajuda é bem-vinda!

1 curtida

Note que esta função se comporta de maneira muito diferente quando o parâmetro user_ids está presente e quando não está.

Você tentou MessageBus.publish \"/file-change\", [\"refresh\"]?

3 curtidas

Excelente ideia, funciona! Obrigado

Mas isso é escalável?

2 curtidas

Não, acho que não :frowning:

2 curtidas

Isso ajuda muito, embora eu vá continuar investigando.

Se eu conseguir encontrar um tipo disso que se espalhe ao longo do tempo, podemos estar prontos.

Embora seria melhor ter como alvo o arquivo exato.

2 curtidas

OK, então entre a cruz e a espada aqui.

Aqui está o que aprendi:

  1. Os pacotes extra-locales são adicionados como tags de script.
  2. Eles contêm um parâmetro de versão que depende do nome do pacote.
  3. Acredito que o número da versão só é avaliado na inicialização, portanto, permanecerá em cache até que:
  • você force os clientes a atualizar completamente, o que aparentemente só pode acontecer em massa?
  • você reinicie o servidor
  • ou um cliente limpe o cache do navegador.

Isso é, no mínimo, lamentável, que não haja um controle mais granular.

  • Poderíamos introduzir uma “atualização total” na mensagem de navegação?
2 curtidas

Acabei de testar Discourse.request_refresh! e parece que ele está recarregando todos os assets de javascript na próxima navegação. Pode não estar acionando uma atualização de JsLocaleHelper, não tenho informação suficiente sobre como isso funciona.

Há algo sutil acontecendo.

O “200” é na verdade “200 (cache)”, que é do lado do navegador.

Bom post no Stack Overflow sobre isso.

1 curtida

Argh…:scream: … não verifiquei isso.

2 curtidas

Você tentou chamar ExtraLocalesController.clear_cache! depois de fazer alterações em extra-locales? Isso deve recalcular a versão durante a próxima solicitação.

2 curtidas

Obrigado. Sim, eu tenho. Acredito que isso seja apenas do lado do servidor e não altera o número da versão no conjunto de arquivos JS fornecido durante a inicialização. Do lado do servidor, não há problema.

Estou considerando mover esses dados para o objeto do site e o serializador para ver se consigo ter mais controle.

Bem, acho que não entendo o que você está tentando realizar. :thinking:
Eu assumi que você queria que o cliente simplesmente pegasse os dados que você adicionou no servidor na próxima recarga. Se você quer fazer tudo no cliente, por que não atualizar I18n.extras diretamente no cliente.

2 curtidas

Sim, exatamente isso.

Se eu executar esse comando do console do Rails, como ele invalida os scripts no cliente?

(Para sua informação, as tags são um caso especial, pois são usadas em slugs, então preciso adicionar um objeto especial para incluir traduções, não posso serializar uma tradução de tag em todos os lugares, pois as rotas não funcionariam).

Na próxima vez que o cliente recarregar a página, ele verá um hash diferente no HTML e carregará o novo script. É assim que funciona o recurso “Personalizar Texto” (ele usa o pacote “overrides”).

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

Consigo reproduzir isso.

Portanto, não estou usando substituições para isso, pois não estamos falando de localização JS do lado do cliente vanilla.

Por algum motivo, o uso atual de nosso arquivo customizado JsLocaleHelper não se conecta a esse sistema de atualização de número de versão.

Mas isso é extremamente útil, obrigado Gerhard, pois poderei estudar como o servidor causa a atualização desse número de versão.

Também observo que o arquivo de substituições é discricionário, interessante!

1 curtida

@gerhard isso foi extremamente útil, obrigado.

Problema resolvido. Eu simplesmente tive que garantir que o número da versão fosse baseado no conteúdo do arquivo js personalizado. Agora está funcionando em desenvolvimento :rocket:

4 curtidas

Os resultados completos desta conversa estão implícitos neste PR: FIX: Tag caching fixes by merefield · Pull Request #52 · paviliondev/discourse-multilingual · GitHub

4 curtidas