2012-11-05 15 views
15

Chúng tôi xây dựng ứng dụng doanh nghiệp phức tạp bằng cách sử dụng KnockoutJS và phải đối mặt với hiệu suất kém đặc biệt là trong IE8. Ứng dụng có thể mất hơn 1 GB RAM và không bao giờ giải phóng bộ nhớ. Trong quá trình điều tra, chúng tôi phát hiện ra rằng KnockoutJS giữ tham chiếu đến các nút DOM và không bao giờ xóa nó. Điều này có thể được sao chép bằng cách sử dụng IESieve chống lại bất kỳ ví dụ KnockoutJS nào, chỉ xem việc sử dụng DOM trong khi chơi với ví dụ để thêm và xóa các nút DOM.KnockoutJS IE8 vấn đề hiệu suất và rò rỉ bộ nhớ

Có ai phải đối mặt với vấn đề này và có ý tưởng về cách làm việc này không?

+0

Tôi chưa gặp sự cố này. Có thể đã xảy ra sự cố với ứng dụng của bạn. – Tyrsius

+0

may mắn cho bạn, tuy nhiên có những người khác nhau phàn nàn quá @ knockoutjs diễn đàn. Bạn có làm gì đặc biệt để điều trị IE8? –

+3

Tôi không quen thuộc với Knockoutj nhưng tôi quen thuộc với phát triển dựa trên IE. Nếu Knockoutjs đang sử dụng các bao đóng javascript tham chiếu đến DOM, chúng có thể dẫn đến các tham chiếu lơ lửng dẫn đến hiệu suất kém và rò rỉ bộ nhớ. Để khắc phục những điều này, bạn có thể cần sửa đổi thư viện javascript. – Anthill

Trả lời

1

Có thể thực hiện với các sự kiện ràng buộc không được phát hành khi các phần tử DOM của chúng bị xóa. Nếu nó là cái gì đó xảy ra dưới mui xe với loại trực tiếp, bạn sẽ phải vá và gửi một yêu cầu kéo.

Tôi đã có loại điều này xảy ra rất nhiều với backbonejs quá. JavascriptMVC tốt hơn một chút để tự dọn dẹp.

+2

Những gì bạn đã đề cập ở đây là đúng. Vấn đề là các ràng buộc sự kiện và một số tham chiếu dom không được phát hành đúng cách. – ryadavilli

2

Chúng tôi đã gặp phải các vấn đề tương tự với loại bỏ JS trên IE 8. Một trong những vấn đề là có một mảng quan sát (với hơn 500 yếu tố) và xây dựng giao diện người dùng (tưởng tượng một bảng hoặc danh sách như cấu trúc) . Công việc duy nhất xung quanh đã hiệu quả đối với chúng tôi là thay đổi mô hình xem sao cho nó chỉ chứa rất ít mục có thể vừa với màn hình. Ngoài ra, chúng tôi đã phải thêm trình xử lý cho các sự kiện cuộn để mảng quan sát sẽ tiếp tục được làm mới. Và (không quá tự hào về điều này), chúng tôi đã phải thêm một div trống ở phía trên của các hồ sơ hiển thị để cung cấp cho một ảo ảnh của quan điểm đã cuộn.

+0

Bạn có thể chia sẻ một số mã giống nhau không? Chúng tôi cũng đang tìm kiếm một cái gì đó tương tự. – Rups

+1

Không thể đưa ra bất kỳ mã nào nhưng logic mức cao là như thế này. Tổ chức tất cả các bản ghi trong một mảng javascript, nói masterData. Dựa trên UI xác định số lượng hồ sơ được hiển thị trên trang tại một thời điểm, hãy nói pageSize. Bây giờ trong lần tải đầu tiên, từ trang chỉ thêm MasterDataSize số lượng bản ghi vào mảng quan sát của máy ảo. Cũng tính toán tổng số trang được hiển thị cho tổng số bản ghi là bao nhiêu. Bây giờ đến phần cuộn. Thêm bên dưới. – ryadavilli

+1

Đã thêm trình xử lý cuộn cho trang, trong đó dựa trên vị trí cuộn và tổng chiều cao của trang web, hãy tính chỉ mục hiện tại. Bây giờ làm rỗng máy ảo và thêm từ dữ liệu chủ, bản ghi bắt đầu từ chỉ mục hiện tại sang chỉ mục hiện tại + pageSize. Thêm một div trống kích thước ghi lại * chỉ mục hiện tại trước phần tử được hiển thị đầu tiên để cung cấp cho ảo tưởng về một cuộn thích hợp. Hy vọng điều này sẽ giúp – ryadavilli