¿Cómo puedo forzar la recarga de un recurso estático en un sitio de la comunidad?

Nov 09 2020

Tengo un paquete de recursos estáticos (tipo MIME: aplicación / x-zip-compressed) que contiene mis archivos .css y .js.

Me he dado cuenta de que cuando subo una nueva versión del recurso estático, puede tomar mucho tiempo antes de que realmente se pueda descargar (incluso con Incognito, borrando el caché del navegador, deshabilitando el caché con DevTools) desde la URL de la comunidad, por ejemplo: / sfsites / c / resource / my-static-resource / css / my-stylesheet.css

Community seguirá sirviendo el archivo antiguo durante horas o incluso días antes de que aparezca finalmente el nuevo archivo. Observo esto al comparar la salida del script de recursos comunitarios / URL del enlace con el archivo real del paquete de recursos estáticos descargado directamente de la organización.

Este almacenamiento en caché nos está causando problemas porque no podemos implementar secuencias de comandos o correcciones de estilo o nuevas características con previsibilidad. En un escenario de revisión, tendríamos que implementar medidas temporales mientras esperamos que la revisión real (.css o .js) finalmente se propague.

¿Cuál es el motivo de este comportamiento de almacenamiento en caché del lado del servidor? ¿Hay alguna forma de que pueda obligar a la Comunidad a vaciar la caché de recursos estáticos del lado del servidor?

NB: He intentado agregar manualmente un parámetro de consulta a la URL del enlace / script, pero se ignora.

NB: Las etiquetas de script / enlace se insertan en la sección Head Markup del sitio de la comunidad, por lo que no hay soporte para URLFOR o similar.

Respuestas

5 KeithC Nov 09 2020 at 15:16

El patrón de nomenclatura que URLFORgenera incluye una marca de tiempo que puede emular:

/sfsites/c/resource/1604909594818/my-static-resource/css/my-stylesheet.css

En el lado del cliente, puede usar new Date().getTime()para generar ese número, pero eso evitará el almacenamiento en caché (devolviendo la última versión). Pero eso es mejor que activar el interruptor de almacenamiento en caché que afecta a todo el almacenamiento en caché.

También puede consultar StaticResource y usar la LastModifiedDatemarca de tiempo real en la URL y eso también le proporcionará almacenamiento en caché a costa de un poco más de complejidad.

PD

Según el comentario de Phil a continuación, me había perdido el punto de que el marcado es HTML estático . Desafortunadamente, eso le deja tener que pasar a este patrón Usar bibliotecas JavaScript de terceros para que la situación se maneje automáticamente. Si está de acuerdo con cambiar manualmente la marca de tiempo, también puede hacerlo obteniendo el valor a través de Developer Console usando, por ejemplo,

StaticResource sr = [select LastModifiedDate from StaticResource where ...];
System.debug('>>> ' + sr.LastModifiedDate.getTime());