2011-01-18 5 views
6

Rack :: Offline을 사용하여 HTML5 애플리케이션 캐싱을 사용하려고하는 레일 앱이 있습니다. application.manifest 파일이 설정되어 있으며 내 HTML 페이지에서 다운로드 및 확인 중입니다. 다음과 같이 매니페스트 같습니다HTML5 애플리케이션 매니페스트가 매니페스트 변경시 캐시를 지우지 않음

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/모바일, 그리고 (나는 레일 서버를 찍을 때 볼 수 있음)는 놀라 울 캐시있다. 그러나 참조하는 application.manifest 파일이 변경되었습니다 (사실은 주석이 달린 16 진수 ID를 조작하여 각 요청마다 변경됨). 그러나 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로 이동하면 비슷한 로그가 표시됩니다. 매니페스트 자체가 캐싱 된 것처럼 보이므로 매니페스트가 변경되었다고 불평 할 수 있습니까? 어떤 아이디어?

감사합니다.

+0

적이 해결 얻을 : 개발 과정에서 이러한 오류의 가능성을 감소하기 위해

다음과 같이 더 큰 cache_interval를 설정하도록 선택할 수 있습니다? 아래 답변은 도움이되지 않습니다. –

+0

내 문제가 해결되어 아래 답변 됨. 이미이 문제를 해결하지 않았다면 약간의 사용이되기를 바랍니다. –

답변

1

, 보석 자체를 변경했다 . 내 문제는/public/images에있는 중첩 된 폴더와 관련이 있습니다.

젬이 설치되어있는 곳을 찾으면 ("보석 환경"이 표시됩니다) 시작하여 /rack-offline-0.6.1/lib으로 이동하십시오.

파일 rack-offline.rb를 편집하십시오. 행 33을 삭제하고 다음으로 바꿉니다 :

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

레일즈 서버를 재시작하고 다시 시도하십시오. 나를 위해 일했습니다. 그것이 당신을 돕기를 바랍니다.

2

Chrome에서 요청한 마지막 파일은 원래 요청 이후 변경된 경우 application.manifest입니다. 캐시가 무효화되면 원래 요구와 동일하게 변경됩니다. 매니페스트에 나열된 파일 중 하나가 변경 될 때까지 매니페스트를 변경하지 않아야합니다.

+0

안녕하세요. Robert. 매니페스트의 변경으로 인해 매니페스트의 모든 항목을 다운로드하라는 메시지가 표시되지 않아야하나요? 그것이 내가 따르고있는 튜토리얼이 (http://asciicasts.com/episodes/247-offline-apps-part-1) 다음과 같다 : "해쉬가 변경되면 이것은 브라우저에 캐시 매니페스트가 변경되었음을 지시하고 목록에있는 파일을 다시 다운로드해야합니다. 개발 모드의 모든 요청에서 발생하지만 프로덕션에서는 파일 중 하나가 변경 될 때만 발생합니다. " – kmc

+0

@ kmc 예, 마지막으로 다운로드 한 것이 매니페스트 (다시)이므로 해당 매니페스트가 변경된 경우 방금 다운로드 한 파일의 캐시가 무효화됩니다. 서버 로그를 보면이 사실을 확인할 수 있습니다 (아마도 콘솔로 출력됩니까?). 사용중인 라이브러리에 대해서는 잘 모르겠지만 매니페스트에 파일이 변경되지 않은 경우 매니페스트 파일을 변경하면 작동하지 않을 것입니다. – robertc

2

이것은 기본적으로 페이지가 적중 될 때마다 키가 다시 생성되기 때문에 매번 레일스 개발 모드에서 발생합니다. cache_classestrue으로 설정하여 environments/development.rb에이 문제를 해결할 수 있습니다. 그러나 cache_classesRack::Offline과 관련이 없습니다. 따라서 변경 작업을 수행 한 경우 개발 환경에서 예기치 않은 ActiveRecord 동작이 발생할 수 있습니다.

3

Rack :: Offline은 매니페스트 파일 (lib/rack/offline.rb : 84)에서 해시를 새로 고치는 데 시간대를 사용하는 것으로 보입니다.

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

# @cache_interval defaults to 10 seconds 

매니페스트 파일은 브라우저에서 두 번 요청됩니다. 요청 시작시 한 번, 모든 캐시가 오프라인에 성공적으로 저장되면.

요청을 처리 할 때 많은 시간이 걸리므로 (많은 자산을로드해야 함) 첫 번째 요청이 한 시간 창에서 응답되고 최종 요청이 다른 요청 창에서 처리되는 경우가 발생할 수 있습니다.결과적으로 두 매니페스트의 해시가 일치하지 않으며 결과적으로 "응용 프로그램 캐시 오류 이벤트 : 업데이트 중에 매니페스트가 변경되고 다시 시도 일정 지정"오류가 표시됩니다.

offline = Rack::Offline.configure :cache_interval => 20 do 
    ... 
end