En este codelab, se muestra cómo cambiar los encabezados de almacenamiento en caché HTTP que muestra una Servidor web basado en Node.js, que ejecuta la entrega Express en un framework de aplicaciones. También te mostrará cómo confirmar que el comportamiento de almacenamiento en caché que esperas se está aplicando mediante el panel Network en Herramientas para desarrolladores de Chrome.
Familiarízate con el proyecto de muestra
Estos son los archivos clave con los que trabajarás en el proyecto de muestra:
server.js
contiene el código de Node.js que entrega la interfaz de la app web. contenido. Usa Express para controlar las solicitudes HTTP y respuestas. En particular,express.static()
se usa para entregar los archivos locales del directorio público, por lo queserve-static
documentación serán útiles.public/index.html
es el HTML de la aplicación web. Como la mayoría de los archivos HTML, no contener información sobre el control de versiones como parte de su URL.public/app.15261a07.js
ypublic/style.391484cf.css
son el JavaScript de la app web y los recursos de los CSS. Cada uno de estos archivos contiene un hash en sus URLs en relación con su contenido. Elindex.html
es responsable de mantener realizar un seguimiento de qué URL con versión específica cargar.
Configura los encabezados de almacenamiento en caché para nuestro código HTML
Cuando respondas solicitudes de URLs que no contienen información sobre el control de versiones, haz lo siguiente:
asegúrate de agregar Cache-Control: no-cache
a tus mensajes de respuesta. Junto con
se recomienda configurar uno de dos encabezados de respuesta adicionales:
Last-Modified
o ETag
. El
index.html
pertenece a esta categoría. Puedes dividir esto en dos pasos.
Primero, los encabezados Last-Modified
y ETag
son controlados por el
etag
y
lastModified
opciones de configuración. En realidad, ambas opciones están predeterminadas en true
para todas las
HTTP, por lo que en esta configuración actual, no tienes que habilitar esta opción
el comportamiento de los usuarios. De todos modos, puedes ser explícito en tu configuración.
En segundo lugar, debes poder agregar el encabezado Cache-Control: no-cache
, pero
solo para tus documentos HTML (en este caso, index.html
). La forma más fácil de
configurar este encabezado condicionalmente es escribir un
setHeaders function
:
y, en su interior, comprueba si la solicitud entrante es para un documento HTML.
- Haz clic en Remix para editar para que el proyecto se pueda editar.
La configuración de entrega estática en server.js
comienza de la siguiente manera:
app.use(express.static('public'));
- Realiza los cambios descritos anteriormente y deberías tener algo que se ve así:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
}
},
}));
Configura los encabezados de almacenamiento en caché para las URLs con versión
Al responder solicitudes de URLs que contienen
"huella digital" o
información sobre el control de versiones y cuyo contenido nunca esté destinado a cambiar, agrega
Cache-Control: max-age=31536000
a tus respuestas. Los operadores app.15261a07.js
y
style.391484cf.css
corresponden a esta categoría.
A partir del
setHeaders function
en el último paso, puedes agregar lógica adicional para verificar si un determinado
es para una URL con control de versiones y, de ser así, agrega el encabezado Cache-Control:
max-age=31536000
.
La forma más sólida de hacerlo es usar un
expresión regular
para ver si el recurso solicitado coincide con algún patrón específico
saber en qué consisten los hashes. En el caso de este proyecto de muestra, siempre es ocho
caracteres del conjunto de dígitos 0-9 y las letras en minúscula a-f (es decir,
caracteres hexadecimales). El hash
siempre está separada por un carácter .
a cada lado.
Una expresión regular que
coinciden con esas reglas generales
se puede expresar como new RegExp('\\.[0-9a-f]{8}\\.')
.
- Modifica la función
setHeaders
para que se vea de la siguiente manera:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
const hashRegExp = new RegExp('\\.[0-9a-f]{8}\\.');
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
} else if (hashRegExp.test(path)) {
// If the RegExp matched, then we have a versioned URL.
res.setHeader('Cache-Control', 'max-age=31536000');
}
},
}));
Confirma el comportamiento nuevo con las Herramientas para desarrolladores
Una vez implementadas las modificaciones en el servidor de archivos estáticos, puedes comprobar Asegúrate de que los encabezados correctos estén estableciendo. Para ello, obtén una vista previa de la app activa con el panel Network de Herramientas para desarrolladores abierto.
Para obtener una vista previa del sitio, presiona Ver app. Luego, presiona Pantalla completa
Personaliza las columnas que se que se muestran en el panel Network para incluir la información que sea más relevante. Para ello, haz clic con el botón derecho en el encabezado de la columna:
Aquí, las columnas a las que debes prestar atención son Name
, Status
, Cache-Control
,
ETag
y Last-Modified
.
- Con las Herramientas para desarrolladores abiertas en el panel Network, actualiza la página.
Después de cargar la página, deberías ver entradas en el panel Network que se ven de la siguiente manera:
La primera fila es para el documento HTML al que navegaste. Está correctamente
publicado con Cache-Control: no-cache
. El estado de la respuesta HTTP para esa solicitud
es un 304
. Esta
significa que el navegador supo que no debía usar el HTML almacenado en caché de inmediato, sino que
realizó una solicitud HTTP al servidor web mediante Last-Modified
y ETag
para ver si hubo alguna actualización en el código HTML que ya tenía.
su caché. La respuesta HTTP 304 indica que no hay HTML actualizado.
Las dos filas siguientes son para los recursos de JavaScript y CSS con versión. Deberías
verás que se entregan con Cache-Control: max-age=31536000
, y el estado HTTP para
cada una es 200
.
Debido a la configuración utilizada, no se hace ninguna solicitud real al
en el servidor Node.js y, si haces clic en la entrada, verás más detalles
y la respuesta es "(de la memoria caché del disco)".
Los valores reales para las columnas ETag y Last-Modified no son muy importantes. El lo importante es confirmar que se están configurando.
En resumen
Una vez que recorriste los pasos de este codelab, ya sabes cómo configurar los encabezados de respuesta HTTP en un servidor web basado en Node.js mediante Express, para un uso óptimo de la caché HTTP. También tienes los pasos que debes confirmar que se está utilizando el comportamiento esperado del almacenamiento en caché, a través del panel Network en Herramientas para desarrolladores de Chrome.