2009-12-12 20 views

Respuesta

3

El método SwapCache proporciona un mecanismo para que la aplicación controle cómo se aplican las actualizaciones. En las aplicaciones HTML normales, puede ser difícil determinar si el JS correcto está presente en el navegador de los clientes. También las implementaciones del navegador varían cuando se actualiza una caché, encontré el iPhone particularmente obstinado. swapCache me devolvió el control de cómo se actualiza mi aplicación, es decir, pude elegir aplicar automáticamente el parche o dejar que el usuario elija cuándo aplicar, etc.

+9

En 'updateready', muestro un aviso de" Actualización disponible, haga clic para reiniciar ahora "y realizo' location.reload(); 'al hacer clic. Si no hacen clic, la aplicación se actualiza por sí misma la próxima vez que se carga. No entiendo cómo puedo actualizar la aplicación sin volver a cargarla, con 'swapCache()'. Y * con * reloading, no necesito 'swapCache()' de todos modos. Todavía no entiendo cuando es necesario. –

+1

Obtiene aún más raro que eso: en Chrome obtengo el evento 'updateready' y cuando llamo a' swapCache() 'dentro del controlador, Chrome se queja' Uncaught InvalidStateError: no se pudo ejecutar 'swapCache' en 'ApplicationCache': no ​​hay caché de aplicación más nuevo para cambiar a ' – Mati

2

Me preguntaba lo mismo. Parece que puedo activar una actualización exitosa simplemente llamando a "window.applicationCache.update()". Si el archivo de manifiesto se ha modificado, se desencadena el evento de "descarga" y, finalmente, la "actualización está lista".

Cuando lo vuelvo a cargar, parece que se ha aplicado. Parece que no necesito llamar a swapCache(). Tengo la provisión para llamar desde la aplicación, pero hasta ahora no he notado ningún efecto en el proceso de actualización.

La actualización de llamadas() básicamente elimina una recarga, AFAICS.

7

Tengo una aplicación con un caché bastante grande (> 100mb). Esto lleva un tiempo particularmente largo para intercambiar el caché (y prácticamente bloquea el navegador mientras esto sucede). Entonces, muestro un mensaje que indica que la aplicación se está actualizando (espere ...), luego llamo al swapCache(), luego visualizo un nuevo mensaje cuando está listo para indicar que se completó.

No estoy seguro de si esto responde a su pregunta (por qué es necesariamente necesario), pero creo que proporciona un caso de uso válido para swapCache() al menos.

+0

Esto es muy bueno. ¿Qué pasaría si no lo llamaras, el navegador estaría bloqueado durante mucho tiempo en la carga de la página siguiente? Y también, ¿qué sucede después de que lo haya llamado, si incluye algunos archivos nuevos ... puede suceder que la mitad de los archivos (los que ya están cargados) provengan de la versión anterior, otros de una versión más reciente? –

+0

No creo que alguna vez se encuentre con un caso en el que tenga una bolsa mixta de archivos de caché. 'swapCache()' solo se ejecutará cuando 'status = 'updateready'' (de lo contrario arroja un error o simplemente no hace nada, creo). Si agregaste archivos nuevos, se descargarían a través del mecanismo normal y una vez que se completen, activa un nuevo evento "updateready". No puedo pensar en un escenario en el que puedas combinar archivos de diferentes versiones de caché. No estoy seguro de qué pasaría si no lo llamara. Supongo que la aplicación simplemente nunca se almacenará en caché. Tal vez lo pruebe este fin de semana y te responda. – ggutenberg

+3

Probado. Si no se llama a 'swapCache()', la aplicación no se actualiza inmediatamente, sino que se actualiza la próxima vez que se renueve la página.Entonces, básicamente, puede darle al usuario la opción de actualizar ahora o actualizar más tarde. Si están en el medio de hacer algo, esta es una buena opción. – ggutenberg

0

swapCache cambiará del conjunto anterior de recursos enumerados en el manifiesto de caché (cuando se cargó la aplicación web en ejecución) al nuevo conjunto. Después de todo, está haciendo esto en respuesta a un updateready, que indica que se ha cargado un nuevo manifiesto.

Esto no debe confundirse con la carga de recursos individuales, para los cuales todavía se aplican las políticas habituales de caché del navegador. En otras palabras, intercambiará un conjunto de recursos, pero los recursos individuales necesitan su propia administración de caché para garantizar que se vuelvan a cargar cuando lo necesite.

No he intentado esto todavía, pero parece sugerir estructurar el código como un archivo javascript "controlador de actualización" que maneja el proceso de actualización y fuentes JavaScript con un nombre de archivo versionado (o URL) con puntos de entrada conocidos .

12

Swapcache se asegura de que las llamadas "posteriores" a los recursos almacenados en caché se tomen de la nueva caché. Significado posterior después de swapcache. Para ver esto en acción intente configurar la propiedad src de un img dinámicamente después de la llamada swapcache en el evento updateready (para que el navegador lo cargue en ese momento particular ). Asegúrese de que esta imagen no esté cargada en otro lugar de la página, ya que distorsionará esta prueba. Ahora cambie la imagen y cambie los archivos de manifiesto (para forzar la recarga de los archivos en caché). Vuelva a cargar la página en su navegador. Ahora debería ver la nueva versión de la imagen en su página representada. Ahora comenta la llamada a swapcache. Realice un cambio en el archivo de manifiesto y vuelva a cargar la página y, por lo tanto, todos los recursos. Actualice la página nuevamente (para asegurarse de tener una versión del nuevo caché). Ahora cambie la imagen de nuevo y cambie el manifiesto. Vuelve a cargar la página: ahora ves la versión anterior de la imagen. En el último caso, el navegador terminó de cargar las nuevas versiones en caché, pero como no se llamó a swapcache, la imagen todavía se tomó de la memoria caché anterior.

Si no realiza ninguna carga dinámica de recursos en su página, el swapcache no tiene ningún efecto.

En particular, si vuelve a cargar la página en el controlador de eventos updateready que llama a swapcache primero no tiene ningún efecto, ya que volver a cargar la página la obtendrá del nuevo caché de todos modos.

4

Imaginemos 2 escenarios diferentes.

  1. Llame al location.reload() cuando el nuevo contenido esté disponible. La página se volverá a cargar con su contenido completamente nuevo. applicationCache.swapCache() no es necesario en este caso.

  2. Su usuario continúa interactuando con su página, sin ninguna recarga. Esta interacción hace que un activo se cargue dinámicamente. En aras de la argumentación, imaginemos que se trata de una imagen de sustitución, e imaginemos que acaba de actualizar esta imagen de sustitución. Sin applicationCache.swapCache(), su usuario continuará viendo la imagen anterior de rollover. Después de applicationCache.swapCache(), verá la nueva imagen de sustitución.

Así applicationCache.swapCache()sin una recarga dice: "Mantenga la página buscando la forma en que estaba cuando estaba cargada, pero el uso de los nuevos activos ahora, tan pronto como la página de pregunta para ellos".

Cuestiones relacionadas