Кто-нибудь знает, как именно рассчитывается стоимость дайджеста активов? Если у меня есть два JS-файла, которые содержат различные другие включенные JS-скрипты, будет ли каждый файл поддерживать один и тот же дайджест-хэш, если ни один из внутренних скриптов не был изменен? Или новое значение дайджеста вычисляется каждый раз, когда запускается операция assets:precompile?
Конвейер ресурсов Rails и значения дайджеста
Ответы (2)
Взято из руководств по рельсам
Когда имя файла уникально и основано на его содержимом, заголовки HTTP могут быть настроены для поощрения кешей повсюду (будь то в CDN, у интернет-провайдеров, в сетевом оборудовании или в веб-браузерах) для сохранения собственной копии содержимого. Когда содержимое будет обновлено, отпечаток пальца изменится. Это заставит удаленных клиентов запросить новую копию содержимого. Обычно это называется очисткой кеша.
Техника, которую Rails использует для снятия отпечатков, заключается в вставке хэша содержимого в имя, обычно в конце. Например, файл CSS global.css можно переименовать с помощью дайджеста MD5 его содержимого.
Принятый ответ не совсем верен. Мы создаем статические ресурсы для наших промежуточных, демонстрационных и рабочих серверов, и в каждом случае одному и тому же ресурсу присваиваются разные значения дайджеста.
Оказывается, среда 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 использует эту версию при создании класса дайджеста.