단일 페이지 애플리케이션에서 애플리케이션 버전 변경 감지
-
23-12-2019 - |
문제
오늘 여기에 질문이 제기되었는데 명확한 답변이 없습니다.
모든 리소스 파일(CSS 및 Javascript)을 연결 및 축소하고 "마스터 페이지"에서 선언한다고 가정합니다.
다중 페이지 앱에서 CSS 파일이 변경되면 다음 전체 페이지 로드 시 재충전됩니다.
단일 페이지 앱에서 사용자는 며칠 동안 계속 작업할 수 있으며 CSS 파일이 선언된 기본 페이지를 다시 충전하지 않아도 됩니다.사용자는 Ctrl-F5를 실행할 때까지 변경 사항을 볼 수 없습니다.
누군가 이미 이것을 생각하고 공유할 경험이 있을 것이라고 확신합니다 :)
나에게 WebSocket을 사용하는 것은 옵션이 아닙니다.첫 번째는 너무 과도하고 두 번째는 모든 고객이 이 기술을 지원하는 것은 아니기 때문입니다.모든 WebSocket 대체에도 동일한 이유가 적용됩니다.이 때문에 계속 서버를 공격하지 않을 것입니다.
그럼 누구 아이디어 있나요?:)
그런데, 우리는 특정 솔루션에 도움이 될 수 있다면 AngularJS를 사용하고 있습니다.
감사해요!
해결책
이 문제를 해결합니다. 의견을 나타내고 기준에 응답하지 않을 수있는 내 솔루션 :
FRONT-APP와 MY SERVER-APP를 패키지 할 때 앞면 앱의 현재 버전이 포함 된 구성 파일을 공유합니다.
전면 측면 : 내 경로의 75 %가 변경되면 WebService (Route Change Resolve)를 암시 적으로 호출합니다. 그래서 서버를 호출 할 때마다 Front-앱의 클라이언트 버전이 포함 된 사용자 지정 HTTP 헤더 (또는 GET / POST PARAM)를 포함합니다.
서버 측 : 나는 공유 구성 파일의 Front-App 버전으로 Front-App 버전으로 Front-App 버전 (사용자의 브라우저, SPA를 새로워 지거나로드 한 마지막 시간으로 로드됨)을 비교합니다.
- 버전이 일치하는 경우 : 나는 아무것도하지 않습니다.
- 버전이 일치하지 않으면 사용자 정의 HTTP 상태 오류 코드 (예 : 418)
그런 다음 앞면 : 418 오류 코드를 가로 챌 수있는 응답 인터셉터를 추가하고 전체 앱의 힘을 새로 고침합니다
. 기본적으로 Front-App 버전이 최신 인 경우 "확인"이벤트는 경로 변경입니다 (AJAX를 통해 WS를 호출하는). 그러나 당신은 각각 5 분 정도 전용 WS를 호출하는 무한 $ 간격을 추가 할 수 있습니다 ... 필요한 경우 몇 가지 코드를 추가 할 수 있습니다.
희망이 도움이됩니다.)
다른 팁
$route 서비스 및 공급자를 통해 AngularJS의 라우팅을 사용한다고 가정하면 다음을 사용할 수 있습니다. $routeChangeSuccess
변경해야 할 중요한 변경 사항이 있는 경우 서버 요청을 수행하는 이벤트입니다.있는 경우 window.location.reload()를 수행하여 페이지를 새로 고치고 업데이트된 모든 리소스와 HTML을 가져올 수 있습니다.
구현 방법에 따라 다음 프로세스가 변경될 수 있습니다.
1.앱 버전을 나타내는 구성 파일을 서버에 설정합니다.다른 파일에 대해 다른 버전을 할당하도록 선택할 수도 있지만 모든 리소스 파일을 연결했으므로 구성에서 버전 옵션을 제한할 수 있을 것 같습니다.
2.필요한 모든 정보(서버의 파일 버전)와 서비스에 저장된 현재 파일 버전을 확인하기 위해 서버에 대한 서버 요청을 수행하는 방법이 포함된 서비스를 만듭니다.
3.사용 $routeChange성공 단계에서 생성한 서비스를 사용하여 서버 요청을 수행하는 이벤트 2, 요청이 변경 사항이 있다는 유효한 확인을 반환한 경우 다음을 통해 강제 페이지 다시 로드를 수행합니다. window.location.reload()
.
나의 마지막 생각을 대답으로 추가하기로 결정했습니다.
우리는 지금 감소 된 솔루션을 위해 갔다.
이 응용 프로그램과 상호 작용하는 유일한 사람이 "프록시 서비스"가있는 "프록시 서비스"가 있으므로 모든 응답의 HTTP 헤더에 응용 프로그램 버전을 추가했습니다.우리가 최신 버전을 받으면 사용자에게 알림이 표시되고 전체 페이지 새로 고침이 발행됩니다 ...
이 솔루션은 자신의 "개인"서비스가없는 응용 프로그램에서 작동하지 않습니다.