Actualmente estamos trabajando en un nuevo proyecto con actualizaciones periódicas que uno de nuestros clientes utiliza a diario. Este proyecto se está desarrollando utilizando angular 2 y estamos enfrentando problemas de caché, es decir, nuestros clientes no están viendo los últimos cambios en sus máquinas.
Principalmente, los archivos html / css para los archivos js parecen actualizarse correctamente sin causar muchos problemas.
ng build
, agregar la-prod
etiqueta agrega un hash a los nombres de archivo generados. Esto obliga a recargar todo menosindex.html
. Esta publicación de github tenía algunas sugerencias para que se recargue.Respuestas:
angular-cli resuelve esto proporcionando una
--output-hashing
bandera para el comando de compilación (versiones 6/7, para versiones posteriores, consulte aquí ). Uso de ejemplo:Bundling & Tree-Shaking proporciona algunos detalles y contexto. Corriendo
ng help build
, documenta la bandera:Aunque esto solo es aplicable a los usuarios de angular-cli , funciona de manera brillante y no requiere ningún cambio de código ni herramientas adicionales.
Actualizar
Varios comentarios han señalado útil y correctamente que esta respuesta agrega un hash a los
.js
archivos pero no hace nadaindex.html
. Por lo tanto, es muy posible queindex.html
permanezca en caché después de que elng build
caché destruya los.js
archivos.En este punto, me referiré a ¿Cómo controlamos el almacenamiento en caché de la página web, en todos los navegadores?
fuente
Encontré una manera de hacer esto, simplemente agregue una cadena de consulta para cargar sus componentes, así:
Esto debería obligar al cliente a cargar la copia de la plantilla del servidor en lugar de la del navegador. Si desea que se actualice solo después de un cierto período de tiempo, puede usar esta ISOString en su lugar:
Y subcadena algunos caracteres para que solo cambie después de una hora, por ejemplo:
Espero que esto ayude
fuente
templateUrl: './app/shared/menu/menu.html?v=' + Math.random()
En cada plantilla html, solo agrego las siguientes metaetiquetas en la parte superior:
Según tengo entendido, cada plantilla es independiente, por lo que no hereda la configuración de reglas meta sin caché en el archivo index.html.
fuente
Una combinación de la respuesta de @ Jack y la respuesta de @ ranierbit debería funcionar.
Establezca la marca ng build para --output-hashing así:
Luego agregue esta clase en un servicio o en su aplicación.
Luego agregue esto a sus proveedores en su módulo de aplicación:
Esto debería evitar problemas de almacenamiento en caché en sitios activos para máquinas cliente.
fuente
Tuve un problema similar con index.html siendo almacenado en caché por el navegador o más complicado por medio de cdn / proxies (F5 no lo ayudará).
Busqué una solución que verifique al 100% que el cliente tiene la última versión index.html, afortunadamente encontré esta solución de Henrik Peinar:
https://blog.nodeswat.com/automagic-reload-for-clients-after-deploy-with-angular-4-8440c9fdd96c
La solución también resuelve el caso en el que el cliente permanece con el navegador abierto durante días, el cliente busca actualizaciones en los intervalos y recarga si se implementa una versión más nueva.
La solución es un poco complicada pero funciona a las mil maravillas:
ng cli -- prod
produce archivos hash con uno de ellos llamado main. [hash] .jsComo la solución de Henrik Peinar era para angular 4, hubo cambios menores, coloco también los scripts fijos aquí:
VersionCheckService:
cambiar al AppComponent principal:
El script posterior a la compilación que hace que la magia, posterior a la compilación.js:
simplemente coloque el script en la carpeta de compilación (nueva) ejecute el script usando
node ./build/post-build.js
después de construir la carpeta dist usandong build --prod
fuente
Puede controlar la caché del cliente con encabezados HTTP. Esto funciona en cualquier marco web.
Puede configurar las directivas de estos encabezados para tener un control detallado sobre cómo y cuándo habilitar | deshabilitar el caché:
Cache-Control
Surrogate-Control
Expires
ETag
(muy buena)Pragma
(si desea admitir navegadores antiguos)Un buen almacenamiento en caché es bueno, pero muy complejo, en todos los sistemas informáticos . Eche un vistazo a https://helmetjs.github.io/docs/nocache/#the-headers para obtener más información.
fuente