2012-04-05 27 views
5

¿Alguien sabe cómo se calcula exactamente el valor de resumen de activos? Si tengo dos archivos JS que contienen varios otros scripts JS incluidos, ¿mantendrá cada archivo el mismo hash de resumen si no se han modificado ninguno de los scripts internos? ¿O se calcula un nuevo valor de resumen cada vez que se activan los activos: se ejecuta la operación de precompilación?Rails asset Pipeline y valores de resumen

Respuesta

1

agarró por rails guides

Cuando un nombre de archivo es única y en base a su contenido, las cabeceras HTTP pueden pueden configurar para fomentar cachés en todas partes (ya sea en el CDN, a los ISP, en equipos de red, o en la Web navegadores) para mantener su propia copia de el contenido. Cuando el contenido se actualiza, la huella digital cambiará. Esto hará que los clientes remotos soliciten una nueva copia del contenido . Esto se conoce generalmente como prevención de memoria caché.

La técnica que utiliza Rails para la toma de huellas digitales es insertar un hash del contenido en el nombre, generalmente al final. Por ejemplo, un archivo CSS global.css podría ser renombrado con un MD5 de su contenido

+0

Entonces, ¿se realiza una operación md5_file() simple en el archivo final después de realizar toda la fusión y compresión? ¿Ese valor md5 termina siendo el resumen del archivo correcto? – matsko

+0

Según los documentos, sí. Puede consultar [otra guía] (http://guides.rubyonrails.org/asset_pipeline.html#in-production) para obtener más detalles. – Tomato

41

La respuesta aceptada no es del todo cierto. Construimos activos estáticos para nuestros servidores de producción, demostración y producción, y el mismo activo recibe diferentes valores de resumen en cada caso.

Resulta que el entorno Rails también se está teniendo en cuenta. Piñones crea el resumen de la siguiente manera:

# Sprockets::Environment::initialize 
@digest_class = ::Digest::MD5 

# Sprockets::Base::digest 
@digest ||= digest_class.new.update(VERSION).update(version.to_s) 

# Sprockets::Base::file_digest(path) 
digest.file(path.to_s) 

# Sprockets::Asset::initialize 
@digest = environment.file_digest(pathname).hexdigest 

Rieles ganchos en las ruedas dentadas de la siguiente manera:

# Sprockets::Railtie 
app.assets = Sprockets::Environment.new(app.root.to_s) do |env| 
    env.version = ::Rails.env + "-#{config.assets.version}" 
    ... 
end 

Así carriles es la creación de un entorno de ruedas dentadas que tiene una versión igual al entorno de rieles y ruedas dentadas utiliza la versión al crear la clase de resumen

+0

Esta es la respuesta correcta. – Litmus

+1

Gracias por este. Tuve que cambiar el resumen en mis activos para invalidar la caché de Cloudflare sin cambiar el contenido de los archivos de activos. Cambiar la config.assets.version de "1.0" a "1.1" cambia la firma;) – luigi7up

Cuestiones relacionadas