Приложение Angular / AngularJS Upgrade не отвечает, когда вкладка браузера находится в фоновом режиме

У меня есть приложение обновления Angular / AngularJS, и в настоящее время я занимаюсь переносом всего с AngularJS на Angular. Это довольно большой проект, поэтому мне определенно нужно пойти по пути обновления.

Я использую @ uirouter / angular-hybrid и имею корневое состояние, которое по-прежнему является AngularJS (навигация и прочее), и дочерним представлением. В этом дочернем представлении я постепенно обновляю все компоненты до Angular. По соображениям производительности мне пришлось использовать downgradeModule () (https://angular.io/guide/upgrade-performance) вместо UpgradeModule.

Для компонентов пользовательского интерфейса я использую Angular Material 2.

Итак, что касается настройки, теперь к вопросу / проблеме:

Когда вкладка со страницей находится в фоновом режиме и вы возвращаетесь на страницу позже (по крайней мере, через 5-10 минут), вся страница задерживается и не отвечает. Чем дольше вы отсутствуете и вкладка находится в фоновом режиме, тем дольше задержка.

Что я уже пробовал / узнал:

  • Кажется, есть зарегистрированные события, но поскольку вкладка находится в фоновом режиме, они не выполняются, но все выполняются одновременно, как только вы вернетесь на вкладку. Вот скриншот профиля  скриншот профиля
  • Удаление обнаружения угловых изменений и использование ngZone: 'noop' не имеет никакого эффекта
  • Отключение всех анимаций не влияет
  • Включение режима производства Angular немного улучшило его (также может быть иллюзией), но проблема все еще сохраняется
  • Я разрабатываю в Chrome, проблема существует и в других браузерах (например, Firefox, Safari).
  • Это происходит только в том случае, если компонент представления маршрутизатора является компонентом Angular, компонент представления AngularJS, похоже, не затронут

В настоящее время я работаю над чистым образцом приложения, чтобы воспроизвести проблему и получить дополнительный контекст для дальнейшего тестирования. Скоро добавлю.

Версии lib

Угловой: 6.1.0

AngularJS: 1.7.2

zone.js: 0.8.26

@ uirouter / угловой гибрид: 6.0.0

Обновление (август 2019 г.)

Все еще происходит с текущими версиями Lib Angular 8, AngularJS 1.7.8 и uirouter / hybrid 8


person Nicolas Gehlert    schedule 27.07.2018    source источник
comment
Важны ли фоновые события? Что это за события?   -  person bryan60    schedule 05.08.2019
comment
Я действительно не знаю. Эти события кажутся запущенными из углового   -  person Nicolas Gehlert    schedule 06.08.2019


Ответы (3)


Попробуйте использовать этот шаблон реализации для всех компонентов ng2.

https://angular.io/api/core/ChangeDetectorRef#detach-change-detector-to-limit-how-often-check-occurs

Идея заключается в том, что он удалит компонент из обновления или рендеринга, выполняемого angularjs.

Из документации:

class DataListProvider {
  // in a real application the returned data will be different every time
  get data() { return [1, 2, 3, 4, 5]; }
}

@Component({
  selector: 'giant-list',
  template: `
      <li *ngFor="let d of dataProvider.data">Data {{d}}</li>
    `,
})
class GiantList {
  constructor(private ref: ChangeDetectorRef, private dataProvider: DataListProvider) {
    ref.detach();
    setInterval(() => { this.ref.detectChanges(); }, 5000);
  }
}

@Component({
  selector: 'app',
  providers: [DataListProvider],
  template: `
      <giant-list><giant-list>
    `,
})
class App {
}

Вы собираетесь по существу detach () компонент, а затем вручную обнаруживать изменения.

person captwebdesign    schedule 06.08.2018
comment
спасибо за ответ. попробую это попробовать. еще не совсем уверен, как определять изменения без интервала - person Nicolas Gehlert; 07.08.2018
comment
вы хотите, чтобы я отсоединил компонент родительской страницы или все компоненты, используемые на этой странице? просто попробовал с самим компонентом страницы и без разницы. @captwebdesign - person Nicolas Gehlert; 07.08.2018
comment
Все еще работаю над тем, чтобы получить более точный ответ корневого уровня. - person captwebdesign; 08.08.2018

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

Кроме того, это может работать, но это обходной путь, учитывая README @ https://github.com/ui-router/angular-hybrid#limitations

В этом разделе README можно предположить, что переход на более раннюю версию не является беспроблемным вариантом:

Ограничения:

В настоящее время мы поддерживаем маршрутизацию компонентов Angular (2+) или AngularJS (1.x) в пользовательский интерфейс AngularJS (1.x). Однако мы не поддерживаем маршрутизацию компонентов AngularJS (1.x) в пользовательский интерфейс Angular (2+).

Если вы создаете пользовательский интерфейс Angular (2+), то любой вложенный пользовательский интерфейс также должен быть Angular (2+).

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

person captwebdesign    schedule 04.08.2018
comment
что вы имеете в виду, говоря об удалении службы при каждой загрузке вкладки? на каком сервисе? а что касается второй части, то в нашем случае это не имеет особого значения. Мы строго следуем их рекомендациям. Родительское представление Angular JS и дочернее представление Angular 2+. Маршрутизатор выдает жесткое исключение, если вы попробуете наоборот - person Nicolas Gehlert; 06.08.2018
comment
Попробуйте избавиться от любого из них в зависимости от вашего приложения: ui -router.github.io/ng1/docs/latest/classes/ ui-router.github.io/ng2/docs/latest/classes/ - person captwebdesign; 06.08.2018
comment
@NicolasGehlert Я сейчас пишу базовый тест по этому поводу. Вы сказали, Когда вкладка со страницей находится в фоновом режиме ... Это обычная вкладка веб-браузера, а не какой-то компонент пользовательского интерфейса с вкладками для содержимого? - person captwebdesign; 07.08.2018
comment
@NicolasGehlert также, если это вкладка браузера, если вы позволите странице (например, если страница будет активной просматриваемой вкладкой в ​​браузере) сидеть, пока она не вернется к отзывчивости и работе? - person captwebdesign; 07.08.2018
comment
@NicolasGehlert Можете ли вы проверить результаты следующего теста: 1. обновить страницу 2. размыть страницу, перейти на другую вкладку на 30 или 60 секунд (может потребоваться больше времени, чтобы увидеть отставание). 3. Вернитесь на вкладку, обратите внимание на уровень отклика 1-10, 1 - очень медленно, 10 - нормально. 4. повторите тест, увеличив время размытия страницы до 5 или 10 минут. - person captwebdesign; 07.08.2018
comment
да обычная вкладка браузера. да, если вы оставите его на некоторое время, он в конечном итоге снова будет реагировать. я предполагаю, что когда все накопленные события будут обработаны. в очень редких случаях вкладка умирает и может быть исправлена ​​только перезапуском браузера. вернусь позже с результатами теста. спасибо за вашу работу - person Nicolas Gehlert; 07.08.2018
comment
так что все ‹5 минут - это, по сути, 9 или 10. Вы действительно не почувствуете разницы, если не обратите на это внимания. Через 5-15 минут он снижается до 5-6. А потом постепенно ухудшается. @captwebdesign - person Nicolas Gehlert; 07.08.2018
comment
@NicolasGehlert Все еще работает над решением более корневого уровня. - person captwebdesign; 08.08.2018

Вы пробовали заглянуть в UrlHandlingStratery? Нам удалось использовать Angular поверх стека AngularJS и при необходимости медленно переписать.

Что мы сделали, так это то, что мы использовали маршрутизатор Angular и AngularJS, используя UrlHandlingStrategy, чтобы определить, какой маршрут должен обрабатываться Angular, и если маршрут не будет обрабатываться Angular, он перейдет к маршруту AngularJS.

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

person dK-    schedule 11.08.2018
comment
На самом деле я это сделал, но проблема в том, что у меня довольно сложная настройка с абстрактными состояниями, и мне нужно было бы продублировать ее для обеих версий angular. Так что я как бы вынуждаю использовать UI Router Hybrid. Переходы состояний в порядке, пинг-понга состояний нет. По крайней мере, снаружи, не знаю, что они делают под капотом, но я строго следую их рекомендациям по настройке. Спасибо за Ваш ответ - person Nicolas Gehlert; 12.08.2018