15

우리는 KnockoutJS를 사용하여 복잡한 엔터프라이즈 응용 프로그램을 작성하고 특히 IE8에서 성능이 떨어졌습니다. 응용 프로그램에 1GB 이상의 RAM이 필요하며 절대로 메모리를 사용할 수 없습니다. 조사 중에 KnockoutJS가 DOM 노드에 대한 참조를 유지하고 결코 삭제하지 않는다는 것을 발견했습니다. 이것은 공용 KnockoutJS 예제에 대해 IESieve를 사용하여 재현 할 수 있습니다. DOM 노드를 추가 및 삭제하는 예제로 재생하면서 DOM 사용률을 감시하면됩니다.KnockoutJS IE8 성능 문제 및 메모리 누수

누구든지이 문제에 직면하게하고이를 해결하는 방법에 대한 아이디어가 있습니까?

+0

이 문제가 발생하지 않았습니다. 아마도 응용 프로그램에 문제가있을 수 있습니다. – Tyrsius

+0

행운이 있지만 다른 사람들도 @nockoutjs 포럼을 불평하고 있습니다. IE8을 치료하기 위해 특별한 조치를 취합니까? –

+3

저는 Knockoutjs에 익숙하지 않지만 IE 기반 개발에 익숙합니다. Knockoutjs가 DOM을 참조하는 javascript 클로저를 사용하는 경우 이러한 참조가 매달려 있으면 성능이 저하되고 메모리 누수가 발생할 수 있습니다. 이 문제를 해결하려면 자바 스크립트 라이브러리를 수정해야합니다. – Anthill

답변

1

아마도 DOM 요소가 삭제 될 때 이벤트 바인딩이 해제되지 않을 수 있습니다. 그것은 녹아웃과 후드 아래에 일어나는 일이 있다면, 당신은 패치하고 제출 요청을 제출해야합니다.

저는 이런 종류의 일이 백 보니 스와도 많이 발생했습니다. JavascriptMVC는 자체적으로 정리하기에 조금 낫습니다.

+2

여기서 언급 한 내용은 사실입니다. 문제는 이벤트 바인딩과 일부 dom 참조가 제대로 해제되지 않는 것입니다. – ryadavilli

2

우리는 IE 8의 녹아웃 JS와 비슷한 문제에 직면했습니다. 문제 영역 중 하나는 관찰 가능한 배열 (500 개 이상의 요소가 있음)과 UI (테이블을 상상하거나 구조와 같은 것을 상상해보십시오)를 구축하는 것이 었습니다 . 우리에게 도움이되는 유일한 해결 방법은 화면에 들어갈 수있는 항목이 거의 포함되지 않도록보기 모델을 변경하는 것이 었습니다. 또한 스크롤 이벤트에 대한 핸들러를 추가하여 관찰 가능한 배열이 계속 새로 고쳐 지도록해야했습니다. 그리고 (너무 자랑스럽지 않습니다.) 스크롤 된 뷰의 환상을주기 위해 표시된 레코드 맨 위에 빈 div를 추가해야했습니다.

+0

동일한 코드를 일부 공유 할 수 있습니까? 우리도 비슷한 것을 찾고 있습니다. – Rups

+1

코드를 제공 할 수는 없지만 상위 로직은 이와 유사합니다. 자바 스크립트 배열의 모든 레코드 (예 : masterData)를 보관합니다. UI를 기반으로 한 번에 페이지에 표시되는 레코드 수를 확인했습니다 (예 : pageSize). 이제 첫 번째로드에서 masterData에서 레코드의 pageSize 번호 만 VM observable 배열에 추가합니다. 또한 총 레코드 수에 대해 렌더링 된 페이지 크기의 합계를 계산합니다. 이제 스크롤 부분으로. 더 많은 것. – ryadavilli

+1

스크롤 위치와 웹 페이지의 전체 높이에 따라 현재 색인을 계산하는 페이지 용 스크롤 핸들러가 추가되었습니다. 이제 VM을 비우고 현재 인덱스에서 현재 인덱스 + pageSize까지의 레코드를 마스터 데이터에서 추가합니다. 첫 번째 렌더링 된 요소 앞에 크기 recordize * 현재 인덱스의 빈 div를 추가하여 올바른 스크롤을 적용합니다. 희망이 도움이 – ryadavilli