Конвейер ресурсов Rails и значения дайджеста

Кто-нибудь знает, как именно рассчитывается стоимость дайджеста активов? Если у меня есть два JS-файла, которые содержат различные другие включенные JS-скрипты, будет ли каждый файл поддерживать один и тот же дайджест-хэш, если ни один из внутренних скриптов не был изменен? Или новое значение дайджеста вычисляется каждый раз, когда запускается операция assets:precompile?


person matsko    schedule 05.04.2012    source источник


Ответы (2)


Взято из руководств по рельсам

Когда имя файла уникально и основано на его содержимом, заголовки HTTP могут быть настроены для поощрения кешей повсюду (будь то в CDN, у интернет-провайдеров, в сетевом оборудовании или в веб-браузерах) для сохранения собственной копии содержимого. Когда содержимое будет обновлено, отпечаток пальца изменится. Это заставит удаленных клиентов запросить новую копию содержимого. Обычно это называется очисткой кеша.

Техника, которую Rails использует для снятия отпечатков, заключается в вставке хэша содержимого в имя, обычно в конце. Например, файл CSS global.css можно переименовать с помощью дайджеста MD5 его содержимого.

person Tomato    schedule 05.04.2012
comment
Итак, выполняется ли простая операция md5_file() над окончательным файлом после выполнения всех операций слияния и сжатия? Это значение md5 оказывается правильным дайджестом файла? - person matsko; 05.04.2012
comment
Согласно документам, да. Дополнительные сведения см. в другом руководстве. - person Tomato; 05.04.2012

Принятый ответ не совсем верен. Мы создаем статические ресурсы для наших промежуточных, демонстрационных и рабочих серверов, и в каждом случае одному и тому же ресурсу присваиваются разные значения дайджеста.

Оказывается, среда Rails также принимается во внимание. Sprockets создает дайджест следующим образом:

# 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

Rails подключается к Sprockets следующим образом:

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

Итак, rails создает среду Sprockets, версия которой равна версии среды Rails, и Sprockets использует эту версию при создании класса дайджеста.

person kranzky    schedule 22.10.2012
comment
Спасибо за это. Мне пришлось изменить дайджест моих ресурсов, чтобы аннулировать кеш Cloudflare без изменения содержимого файлов ресурсов. Изменение config.assets.version с 1.0 на 1.1 меняет подпись ;) - person luigi7up; 08.01.2016
comment
Для какой версии Rails это верно? Было бы хорошо иметь обновление для Rails 5, если оно изменилось - person Peter P.; 14.12.2018