Манифест приложения HTML5 не очищает кеш при изменении манифеста - PullRequest
6 голосов
/ 19 января 2011

У меня есть приложение rails, которое я пытаюсь получить с помощью кэширования приложения HTML5 с помощью Rack :: Offline. Файл application.manifest настроен и загружается и проверяется моей HTML-страницей. Манифест выглядит следующим образом:

CACHE MANIFEST
# 2d9bf2b03a07dc960fd8fe69659ceeffd4d28ccf8619669a506c3682bf223878
404.html
422.html
500.html
login.html
stylesheets/scaffold.css
javascripts/jquery.min.js
javascripts/jquery.js
javascripts/application.js
javascripts/rmbz.js
javascripts/rails.js
images/rails.png

NETWORK:
/

Страница, к которой я обращаюсь, является localhost: 3000 / mobile, и она прекрасно кэшируется (отображается, когда я отключаю сервер rails). Однако файл application.manifest, на который он ссылается, изменился (фактически он изменяется при каждом запросе путем манипулирования шестнадцатеричным идентификатором с комментариями), но Chrome не обновляет страницу. Журнал консоли в Chrome выдает следующее:

Document was loaded from Application Cache with manifest http://localhost:3000/application.manifest
Application Cache Checking event
Application Cache Downloading event
Application Cache Progress event (0 of 12) http://localhost:3000/login.html
Application Cache Progress event (1 of 12) http://localhost:3000/404.html
Application Cache Progress event (2 of 12) http://localhost:3000/422.html
Application Cache Progress event (3 of 12) http://localhost:3000/javascripts/rails.js
Application Cache Progress event (4 of 12) http://localhost:3000/javascripts/rmbz.js
Application Cache Progress event (5 of 12) http://localhost:3000/images/rails.png
Application Cache Progress event (6 of 12) http://localhost:3000/500.html
Application Cache Progress event (7 of 12) http://localhost:3000/javascripts/jquery.js
Application Cache Progress event (8 of 12) http://localhost:3000/stylesheets/scaffold.css
Application Cache Progress event (9 of 12) http://localhost:3000/javascripts/jquery.min.js
Application Cache Progress event (10 of 12) http://localhost:3000/mobile
Application Cache Progress event (11 of 12) http://localhost:3000/javascripts/application.js
Application Cache Error event: Manifest changed during update, scheduling retry

Я не совсем понимаю, почему это терпит неудачу. Кажется, делает все, что должен, до последней строчки! Я получаю похожий журнал, если в моем браузере перехожу на localhost: 3000 / application.manifest - кажется, что манифест кэшируется сам по себе, поэтому может быть, поэтому он жалуется, что манифест изменился? Есть идеи?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 12 сентября 2011

Rack :: Offline, похоже, использует временное окно для обновления хеша в файле манифеста (lib / rack / offline.rb: 84).

now = Time.now.to_i - Time.now.to_i % @cache_interval

# @cache_interval defaults to 10 seconds 

Файл манифеста запрашивается браузером дважды: один раз в начале запроса и один раз весь кэш был успешно сохранен в автономном режиме.

Когда обработка вашего запроса занимает значительное время (необходимо загрузить большое количество ресурсов), может случиться так, что первый запрос будет обработан в одном временном окне, а окончательный запрос будет обработан в другом. Как следствие хэши в обоих манифестах не будут совпадать, и в результате вы получите сообщение об ошибке «Ошибка кэша приложения: манифест изменен во время обновления, планирование повторных попыток».

Чтобы уменьшить вероятность возникновения такой ошибки во время разработки, вы можете установить большее значение cache_interval следующим образом:

offline = Rack::Offline.configure :cache_interval => 20 do
    ...
end
2 голосов
/ 22 февраля 2011

Это происходит в режиме разработки Rails каждый раз, потому что по умолчанию ключ обновляется каждый раз при попадании на страницу. Вы можете обойти это, установив cache_classes в true в environments/development.rb. Однако имейте в виду, что cache_classes не относится только к Rack::Offline. Таким образом, вы можете получить неожиданное ActiveRecord поведение в вашей среде разработки, если вы внесете изменение.

2 голосов
/ 19 января 2011

Последний файл, запрошенный Chrome, - application.manifest, если он изменился с момента первоначального запроса (как вы говорите), то это делает кэш недействительным.Вы должны оставить манифест без изменений, пока не изменится один из файлов, перечисленных в манифесте.

1 голос
/ 27 июня 2011

У меня была такая же проблема, мне пришлось внести изменения в сам камень.Моя проблема была связана с вложенными папками в / public / images

Начните с поиска, где установлены ваши драгоценные камни ("gem environment" даст вам это) и перейдите в /rack-offline-0.6.1/lib.

Редактировать файл rack-offline.rb.Удалите строку 33 и замените на:

"#{root}/images/**/*.png",
"#{root}/images/**/*.jpg",
"#{root}/images/**/*.gif"]

Перезапустите сервер rails и попробуйте снова.Работал на меня, надеюсь, это поможет вам.

1 голос
/ 20 апреля 2011

проверить http://railscasts.com/episodes/247-offline-apps-part-1 и http://railscasts.com/episodes/248-offline-apps-part-2

объясняет все проблемы, связанные с кэшированием, автономным режимом, rails / jquery и т. Д.

...