Возможные утечки памяти в Internet Explorer 7 / Backbone?

#javascript #internet-explorer-7 #backbone.js

#javascript #internet-explorer-7 #backbone.js

Вопрос:

Я поиграл с Backbone, чтобы посмотреть, является ли этот фреймворк хорошим выбором для дальнейшего использования в нашем приложении. Одно из требований заключается в том, что мы должны поддерживать Internet Explorer 7 , а другое — отображать не менее 200 элементов на странице.

Для тестирования фреймворка я создал довольно простой список, и он работает безупречно во всех основных браузерах, кроме Internet Explorer 7. Похоже, что есть некоторые утечки памяти, поскольку каждый раз, когда я сбрасываю данные, общее время рендеринга увеличивается.

Я настроил несколько тестовых сценариев:

С объявленными событиями: http://jsfiddle.net/mefraimsson/a2YMF /

Без объявленных событий: http://jsfiddle.net/mefraimsson/u6byQ /

Одна из моих идей заключалась в том, что объявленные события никогда не были очищены, когда элементы были удалены и добавлены в DOM. Когда я запускаю тестовый сценарий «без объявленных событий», часто нажимая на перезагрузку данных, время рендеринга довольно стабильно, но при запуске «С объявленными событиями» время рендеринга быстро увеличивается, а объем памяти, используемой для IE7, увеличивается. Вот почему я думаю, что где-то есть какая-то утечка памяти.

  • Есть ли кто-нибудь, у кого есть опыт рендеринга такого большого объема данных с помощью Backbone?
  • Есть ли кто-нибудь, кто сталкивался с проблемами утечки памяти при работе с Backbone?
  • Вы рекомендуете другой подход при работе с таким большим объемом данных с помощью Backbone? Вместо большого количества вложенных представлений использовать одно представление и перебирать данные в шаблоне может быть возможным решением, но тогда кажется, что вы не получаете максимальную отдачу от Backbone?
  • Как вы думаете, связано ли это с объявлением событий или это реализация Backbone, из-за которой происходит утечка памяти?

Заранее спасибо

Ответ №1:

Утечки памяти являются распространенной проблемой в приложениях Javascript в целом. Я думаю, что есть некоторые фреймворки, которые пытаются справиться с этим за вас, но backbone этого не делает. Браузер, который вы используете, имеет некоторое значение в том, как эти утечки замечаются и проблемы, которые они вызывают, но они все еще существуют и в других браузерах. Как правило, виноват не браузер, а способ обработки привязки событий в Javascript с помощью функций обратного вызова.

Я написал статью, в которой обсуждалось это, с предложением способа справиться с этим, в частности, с представлениями: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

Не забудьте также прочитать комментарии. Там есть несколько других замечательных предложений по обработке утечек памяти.

Комментарии:

1. Я в принципе уже обработал удаление представлений аналогичным образом, но статья, на которую вы ссылаетесь, была отличной! Большое вам за это спасибо. Теперь я еще немного повозился и в итоге удалил свои «расширенные» селекторы из объявлений событий, то есть из «click td: ввод первого дочернего элемента [type= checkbox]»: «check», «click td: first-child»: «checkSelect», «click td: gt(0) «: «выберите», чтобы «щелкнуть»: «выбрать», И это, похоже, решило мои проблемы с утечкой памяти в IE7.

2. Мне было интересно, существует ли для этого стандартное соглашение, ваша техника выглядит чистой (я не думал о представлениях, вызывающих события напрямую …). Спасибо.