2011-01-22 17 views
6

Al representar archivos html que hacen referencia a archivos estáticos (.js, .css), ¿cómo maneja la prevención de almacenamiento en memoria caché? ¿Cambia manualmente el blabla.css? v = VERSIONNUMBER cada vez que cambia el archivo? ¿tiene algún mecanismo automático basado en el mtime del archivo?técnicas de detección de memoria caché node.js

+0

Logramos esto de la manera más simple: simplemente agregue la marca de tiempo de inicio de la aplicación como cadena de consulta para cada recurso estático. Ejemplo aquí: http://ankitjain.info/ankit/2013/12/05/cache-busting-nodejs-express-jade/ – ankitjaininfo

Respuesta

7

Dejo el almacenamiento en caché en el protocolo HTTP, ya que está diseñado para eso. Solo proporcione un encabezado de respuesta ETag en cada respuesta y agregue compatibilidad para solicitudes condicionales marcando el encabezado de solicitud If-none-match.

Una buena forma de calcular una etiqueta de entidad depende de tu forma de almacenar archivos. En un sistema de archivos típico de * nix, el valor del inodo es un buen comienzo.

Ejemplo:

fs.stat(filePath, function(err, stats) { 
    if (err || !stats.isFile()) { 
     //oops 
    } 
    else { 
     var etag = '"' + stats.ino + '-' + stats.size + '-' + Date.parse(stats.mtime) + '"'; 

     //if etag in header['if-non-match'] => 304 
     //else serve file with etag 
    } 
}); 

En casos especiales, incluso puede ser que desee almacenar en caché el etag o incluso el archivo en la memoria y registrar una devolución de llamada fs.watchFile() con el fin de invalidar la entrada tan pronto como los cambios en los archivos.

+0

Gracias. Pero supongo que algunos navegadores ignoran tal o cual cabecera y no se molestan en buscar 304 si tienen el archivo en su memoria caché. ¿Me estoy perdiendo de algún modo por qué su sugerencia aún resuelve esto? –

+0

Además ... ¿Podría FireFox ser ... umm .. * mintiendo * a mí (a través de firebug)? En su pestaña Net, veo solicitudes que salen para buscar esos archivos estáticos y vuelven con una agradable respuesta http de 200, mientras que en _realidad_ no llegan a mi servidor ni aparecen en Fiddler (solo funcionan con el caché local muy agresivo) - otra vez por favor hazme entender si me estoy perdiendo algo. –

Cuestiones relacionadas