Evitar que RequireJS almacene en caché los scripts requeridos

RequireJS parece hacer algo internamente que almacena en caché los archivos javascript requeridos. Si hago un cambio en uno de los archivos requeridos, tengo que renombrar el archivo para que se apliquen los cambios.

El truco común de añadir un número de versión como un parámetro querystring al final del nombre del archivo no funciona con requirejs <script src="jsfile.js?v2"></script>.

Lo que estoy buscando es una forma de evitar este cacheo interno de los scripts requeridos por RequireJS sin tener que renombrar mis archivos de script cada vez que se actualizan.

Solución Multiplataforma:

Ahora estoy usando urlArgs: "bust=" + (new Date()).getTime() para la eliminación automática de la caché durante el desarrollo y urlArgs: "bust=v2" para la producción donde incremento el número de versión codificado después de lanzar un script requerido actualizado.

**Nota

@Dustin Getz mencionó en una respuesta reciente que Chrome Developer Tools eliminará los puntos de interrupción durante la depuración cuando los archivos Javascript se actualicen continuamente de esta forma. Una solución es escribir debugger; en el código para activar un punto de interrupción en la mayoría de los depuradores de Javascript.

Soluciones específicas de servidor:

Para soluciones específicas que pueden funcionar mejor para su entorno de servidor como Node o Apache, consulte algunas de las respuestas a continuación.

Solución

RequireJS puede configurarse para que añada un valor a cada una de las urls del script para romper la caché.

De la documentación de RequireJS (http://requirejs.org/docs/api.html#config): urlArgs: Argumentos extra de cadena de consulta añadidos a las URLs que RequireJS utiliza para obtener recursos. Muy útil para cachear el busto cuando el navegador o

servidor no está configurado correctamente.

Ejemplo, añadiendo "v2" a todas las secuencias de comandos:

require.config({
    urlArgs: "bust=v2"
});

Para fines de desarrollo, puede forzar RequireJS para eludir la memoria caché mediante la adición de una marca de tiempo:

require.config({
    urlArgs: "bust=" + (new Date()).getTime()
});
Comentarios (16)

¡No uses urlArgs para esto!

Requerir que las cargas de scripts respeten las cabeceras de caché http. (Los scripts se cargan con un <script> insertado dinámicamente, lo que significa que la petición tiene el mismo aspecto que cualquier otro activo que se esté cargando).

Sirva sus activos javascript con las cabeceras HTTP adecuadas para desactivar el almacenamiento en caché durante el desarrollo.

Usar require's urlArgs significa que cualquier punto de interrupción que establezcas no se conservará durante las actualizaciones; acabarás teniendo que poner sentencias debugger por todas partes en tu código. Malo. Yo uso urlArgs para cache-busting assets durante las actualizaciones de producción con el git sha; entonces puedo configurar mis assets para que sean cacheados para siempre y tener la garantía de nunca tener assets obsoletos.

En desarrollo, simulo todas las peticiones ajax con una configuración compleja mockjax, y luego puedo servir mi aplicación en modo sólo javascript con un servidor http python de 10 líneas con todo el almacenamiento en caché desactivado. Esto ha escalado para mí a un bastante grande "enterprisey" aplicación con cientos de puntos finales restful webservice. Incluso tenemos un diseñador contratado que puede trabajar con nuestra base de código de producción real sin darle acceso a nuestro código backend.

Comentarios (11)

Inspirándonos en https://stackoverflow.com/questions/11088909/expire-cache-on-require-js-data-main actualizamos nuestro script de despliegue con la siguiente tarea ant:





Donde el comienzo de main.js tiene el siguiente aspecto:

require.config({
    baseUrl: '/js',
    urlArgs: 'bust=@Revision@',
    ...
});
Comentarios (0)