2015-02-14 1 views
4

Я вижу, что моя навигационная система и другие компоненты замерзают (не реагируют на события наведения/клика) в течение нескольких секунд .. после того, как модель для определенного маршрута была выбрана. что-то такое встретилось?Как избежать Ember от замораживания при визуализации DOM

Возможно, это из-за визуализации DOM ... Любая идея, как я могу избежать этого?

То же самое происходит, когда я загружаю больше деталей и добавить его в DOM ..

Я на [email protected] с Ember версии 1.8.1

+1

Можете ли вы воссоздать проблему в JSbin или что-то в этом роде? –

+0

Вы делаете синхронные звонки AJAX? –

+0

Вы пытаетесь добавить большое количество элементов в DOM, например таблицу с тысячами строк? Это может привести к замораживанию пользовательского интерфейса до завершения. Если это так, вы можете решить с помощью рендеринга. – gfullam

ответ

3

Javascript может замерзнуть, когда Эмбер является рендеринг сложных шаблонов или когда Ember Data получает массивные дампы данных. Это замораживание, присущее JS, однопоточное и не может быть разрешено, но его можно избежать, оптимизируя ваш код!

Как оптимизировать шаблоны:

  1. Первый анализ с помощью вкладки Производительность в Ember Inspector. Ищите компоненты, которые занимают больше всего времени, чтобы их перенести и решить. В качестве альтернативы используйте Perforator, расширение Chrome, которое покажет вам время рендеринга для каждого вида/компонента.

  2. Используйте Ember.run.next(), чтобы разложить большие операции в следующие циклы. Это очень похоже на setTimeout(), но с интеграцией Ember.

  3. Заменить:{{link-to 'route'}} с <button {{action 'openRoute'}}>. Для рендеринга link-to требуется более высокая производительность, чем простой HTML с эффектом Ember. Сделал огромную разницу с нашим проектом, потому что у нас было сотни на одной странице.

  4. Избегайте повторного рендеринга, когда это возможно. Например: вместо сортировки списка путем сортировки массива объектов, а затем рендеринга их снова с помощью {{#each}}, используйте CSS3 flex для сортировки. Это не требует JS и, таким образом, не замерзает.

  5. Держите Ember актуальным. Механизм рендеринга Ember (Glimmer) постоянно улучшается.

  6. Используйте web workers, чтобы сделать ваш HTML в фоновом режиме (тихий продвинутый).

Как оптимизировать большие данные:

  1. Рассмотрим нагрузки модели отношений асинхронно вместо того, чтобы включить их.
  2. Загрузите только данные, указанные пользователю (с разбивкой на страницы).
  3. Сократить данные, отправленные.

Дополнительные предложения приветствуются!

+0

Хороший набор предложений ** если ** рендеринг был проблемой. Что касается веб-работников, интересная идея, но я думал, что они не могут получить доступ к DOM? Еще одна вещь: каждый из 1K объектов, созданных с использованием глубоко вложенных компонентов, убьет вас - подумайте о сглаживании структуры вашего компонента, если это может быть проблемой. –

+0

Ниже приведен пример использования веб-мастеров Ember + (= молниеносная рендеринг и анимация). Это сложно, но не невозможно. http://www.pocketjavascript.com/blog/2015/11/23/introducing-pokedex-org –

0

Вам нужно сделать больше бенчмаркинга, чтобы подтвердить свою гипотезу о том, что проблема заключается в рендеринге.На самом деле, я думаю, проблема, по крайней мере, может быть связана с загрузкой данных. Инструмент код для обнаружения этого:

model() { 
    console.time("modelStart"); 
    var data = this.store.query(...; 
    data.then(() => console.timeEnd("modelStart"); 
    return data; 
} 

выше времени будет представлять собой комбинацию сервера задержки и локальной обработки Ember данных после того, как данные прибыли. Очевидно, что браузер не замерзает, ожидая ответа сервера. Чтобы определить необходимое время после того, как данные поступают для его обработки и заполнения хранилища, вы можете вычесть из времени, сообщенного приблизительно задержка сервера, как показано на вкладке сети, которая должна быть достаточно хорошей или, если необходимо, более глубоко, чтобы найти фактическое время, которое принимает Ember Data.

+0

Запрос модели не замораживает пользовательский интерфейс для 'this.store.query' возвращает обещание. Требуется ли 200 мс или 5 секунд, чтобы сервер возвращал данные, остальная часть вашего JS будет работать. Вы увидите, что из второй модели решает, и большой кусок данных подается на шаблон, вот когда JS переходит в овердрайв и потенциально может заморозить пользовательский интерфейс на несколько 100 мс. –

+0

Я не говорю о латентности сервера. Я говорю о работе, необходимой для получения данных, заполненных в магазине, как только он поступит. Я говорю из глубокого опыта, поскольку в нашем случае мы загружали и заполняли хранилище тысячами сложных записей со многими ассоциациями, которые Ember Data занимала до 20 секунд для обработки, в течение которых браузер был очень заморожен. –

+0

Интересный момент, нам никогда не приходилось иметь дело с такими большими данными. У вас есть советы о том, как решать/управлять большими данными? Наверняка есть способ обрезать, разбивать на страницы или асинхронные большие данные? –

Смежные вопросы