node.js - medium - Almacenamiento en caché del marco de Nodejs Express
node cache medium (4)
Estoy usando Nodejs y Express Js. También agrego NowJS a Express Js para hacer algunas cosas en tiempo real.
En el archivo de configuración que tengo
app.configure(''production'', function() {
var oneYear = 31557600000;
app.use(express.static(__dirname + ''/public'', { maxAge: oneYear }));
app.use(express.errorHandler());});
Y ejecuto la aplicación usando este comando:
$ NODE_ENV=production node app.js
Sin embargo, los archivos (imágenes, css, js) no parecen almacenarse en caché, sino que se sirven siempre como un archivo nuevo.
P / s: acabo de probarlo con localhost, la caché parece funcionar en localhost, sin embargo, cuando se carga en el servidor, la caché ya no funciona.
EDITAR: Estaba equivocado, vea el comentario de Eug a continuación
Connect incluye middleware de almacenamiento en caché: http://senchalabs.github.com/connect/middleware-staticCache.html
así que debería ser tan fácil
app.use(express.cache(...));
app.use(express.static(...));
El siguiente código hace el trabajo:
app.use(function (req, res, next) {
if (req.url.match(/^//(css|js|img|font)//.+/)) {
res.setHeader(''Cache-Control'', ''public, max-age=3600''); // cache header
}
next();
});
El siguiente código hace el truco:
var cacheTime = 86400000*7; // 7 days
app.use(express.static(__dirname + ''/public'',{ maxAge: cacheTime }));
Sin embargo, mi directorio público contiene CSS y archivos html.
¿Hay alguna manera de que pueda almacenar en caché los archivos CSS solo y no html?
Probé la configuración "no-caché" en metaetiqueta para el archivo html pero no funcionó.
Express se basa en Connect, y Connect proporciona el middleware "estático". Aquí está el código debajo del capó para el almacenamiento en caché:
if (!res.getHeader(''Cache-Control'')) res.setHeader(''Cache-Control'', ''public, max-age='' + (maxAge / 1000));
Puede encontrar ese código aquí:
https://github.com/senchalabs/connect/blob/master/lib/middleware/static.js#L147
Como puede ver, Express está enviando un encabezado "Cache-Control" al navegador, diciéndole que guarde en caché ese archivo por un período. Así que esto no es "cargar un archivo una vez y luego siempre servirlo a todos los clientes", sino más bien "decirle a cada cliente que guarde en caché el archivo la primera vez que lo descargue" (lo que significa que todos los clientes deberán descargarlo). ese archivo una vez antes se almacena en caché para ellos).