Сторонняя сторона Script Кэширование в Rails 3.1

У меня есть script сторонние веб-сайты: /assets/script.js. По очевидным причинам я не могу попросить их изменить ссылку каждый раз, когда я развернусь, чтобы указать на последнюю версию отпечатков пальцев script. Я получил несколько проблем с кешированием, когда пользователи по-прежнему видят старые версии /script.js. Есть ли способы сделать кеш удален непосредственно для script.js вместо script-9dc5afea3571ba2a883a72b0da0bb623.js?

Дополнительная информация: Rails на пассажирском + Nginx. Ищите способы для обслуживания файла script.js вместо этого, если файл с отпечатками пальцев и аннулировать кеш при каждом развертывании.

Я думал о добавлении ETags на основе версии развертывания git, но понятия не имею, как это сделать. Nginx не имеет встроенной поддержки ETags. Для этого используются неподдерживаемые старые сторонние модули. Я могу использовать add_header Etag="something" для этого, но как мне добавить там версию git.

Любые другие идеи и варианты?

Спасибо!

Ответ 1

Если у вас есть script с именем, которое является частью вашего общего интерфейса, вам необходимо явно запустить это обновление script и сохранить старые версии для более старых клиентов.

например./assets/script.1.0.js,/assets/script.1.1.js и т.д.

Ключевая часть заключается в том, что вам нужно хранить старые, и код не изменяется без изменения имени явно. Конвей с ресурсами Rails не может сделать это для вас, поскольку обычно поддерживается только самая последняя версия script.

Как и во всех общедоступных интерфейсах, вам потребуется больше времени на управление этим процессом, чем для внутреннего script.

Ответ 2

Я рекомендую использовать ETag. Добавьте заголовок ETag к вашему ответу http://en.wikipedia.org/wiki/HTTP_ETag

Задайте заголовок ETag другой уникальной строкой для каждой версии вашего script. Это заставит браузеры получать новую версию script всякий раз, когда вы развертываете новую версию.

Ответ 4

Следуя предложению ETag, вы можете найти этот драгоценный камень полезным: bust_rails_etags. Это позволяет вам устанавливать ключ в каждом развертывании, который используется при генерации ETags, таким образом ваши ETags будут меняться (и поэтому кэширование script будет недействительным) каждый раз, когда ваше приложение будет развернуто. Автор использует пример номеров выпуска Heroku в качестве ключа, который изменяется при каждом развертывании.

Ответ 5

Что я использую для обновления активов:

  • Приращение config.assets.version в config/application.rb как

    #Version of your assets, change this if you want to expire all your assets
    config.assets.version = '1.1'
    
  • bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets

  • Перезапуск приложения, пустой кеш веб-сервера, если есть

Ответ 6

Вы хотите, чтобы URL-адрес, не содержащий отпечатков пальцев, для сторонних веб-сайтов. Например: assets/public_api.js

Там были плагины или драгоценные камни, которые исключали указанные активы из-за отпечатков пальцев. Однако рельсы изменили процесс предварительной компиляции таким образом, что также создаются файлы без отпечатка пальца. Поэтому это не проблема. Подробнее здесь.

Как убедиться, что ваши клиенты загружают последнюю развернутую script, когда актив не отпечатан?

Я бы предложил решение youTube, чтобы выставить свой API. В основном все ваши активы /public _api.js делают, он вставляет другой тег script в dom. При этом один загружает фактический код API. Теперь ваши активы /public _api.js становятся активами /public _api.js.erb и выглядят примерно так:

var tag = document.createElement('script');
tag.src = "<%=asset_path('/assets/javascripts/acctual_api')%>";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

Обратите внимание, что для параметра tag.src установлено значение текущий путь отпечатков пальцев к /assets/javascripts/acctual _api. Таким образом, ваши пользователи всегда получат последнюю скомпилированную acctual_api script.

Как обновить ETAG для активов /public _api.js?

Я полагаю, вы используете решение Capistrano или аналогичное решение для решения на основе рецептов. Возможно, вы можете добавить шаг развертывания, который обновляет конфигурационный файл сервера до его перезапуска. Он должен просто обновить:

add_header Etag="update_me_on_deploy"

Обратите внимание, что вы все равно должны использовать публичные скрипты с версиями (assets/public_api.0.js) даже при таком подходе.

Ответ 7

Если вы используете Capistrano, вы можете написать задачу, которая копирует script из Public/assets в другой каталог в Public (т.е. Public/scripts) после того, как ваши ресурсы будут предварительно скомпилированы.

Ответ 8

Ну, вы можете удалить отпечаток файла:

asset_path('script.js', :digest => false)

надеюсь, что это поможет

Или вы можете использовать этот камень, если хотите: https://github.com/spohlenz/digestion

Но: Конвей активов Rails теперь компилирует файлы активов как с помощью дайджеста, так и без него.

Итак, после создания ваших активов вы обычно получаете script.js? xxxxx и script.js в свою папку public/assets.