ResizeObserver – luslimiet overschreden

Ongeveer twee maanden geleden zijn we Rollbar gaan gebruiken om ons op de hoogte te stellen van verschillende fouten in onze web-app. Sindsdien krijgen we af en toe een foutmelding:

ResizeObserver loop limit exceeded

Wat me hierover in verwarring brengt, is dat we ResizeObserverniet gebruiken en dat ik de enige plug-in heb onderzocht waarvan ik dacht dat die de boosdoener zou kunnen zijn, namelijk:

Aurelia Formaat wijzigen

Maar hij lijkt ook geen gebruik te maken van ResizeObserver.

Wat ook verwarrend is, is dat deze foutmeldingen zich sinds januari voordoen, maar dat de ondersteuning voor ResizeObserverpas onlangs is toegevoegd aan Chrome 65.

De browserversies die ons deze fout gaven zijn:

  • Chrome: 63.0.3239 (ResizeObserver-luslimiet overschreden)
  • Chrome: 64.0.3282 (ResizeObserver-luslimiet overschreden)
  • Edge: 14.14393 (SecurityError)
  • Edge: 15.15063 (SecurityError)

Dus ik vroeg me af of dit een browserbug zou kunnen zijn? Of misschien een fout die eigenlijk niets te maken heeft met ResizeObserver?


Antwoord 1, autoriteit 100%

U kunt deze fout gerust negeren.

Een van de specificatie-auteurs schreef in een opmerking op uw vraag, maar het is geen antwoord en het is niet duidelijk in de opmerking dat het antwoord echt het belangrijkste is in deze thread, en degene die me op mijn gemak stelde om negeer het in onze Sentry-logboeken.

Deze fout betekent dat ResizeObserver niet alle waarnemingen binnen één animatieframe kon leveren. Het is goedaardig (uw site zal niet kapot gaan). – Aleksandar Totic15 april om 3:14

Er zijn ook enkele gerelateerde problemenin de specificatierepository.


Antwoord 2, autoriteit 20%

Het is een oude vraag, maar het kan nog steeds nuttig zijn voor iemand. U kunt deze fout voorkomen door de callback in requestAnimationFramein te pakken.
Bijvoorbeeld:

const resizeObserver = new ResizeObserver(entries => {
   // We wrap it in requestAnimationFrame to avoid this error - ResizeObserver loop limit exceeded
   window.requestAnimationFrame(() => {
     if (!Array.isArray(entries) || !entries.length) {
       return;
     }
     // your code
   });
});

Antwoord 3, autoriteit 7%

Als je Cypress gebruikt en dit probleem duikt op, kun je het veilig negeren in Cypress met de volgende code in support/index.js of commands.ts

const resizeObserverLoopErrRe = /^[^(ResizeObserver loop limit exceeded)]/
Cypress.on('uncaught:exception', (err) => {
    /* returning false here prevents Cypress from failing the test */
    if (resizeObserverLoopErrRe.test(err.message)) {
        return false
    }
})

Antwoord 4, autoriteit 2%

We hadden hetzelfde probleem. We ontdekten dat een Chrome-extensie de boosdoener was. In het bijzonder veroorzaakte de loom chrome-extensie de fout (of een interactie van onze code met loom extension). Toen we de extensie uitschakelden, werkte onze app.

Ik raad aan om bepaalde extensies/add-ons uit te schakelen om te zien of een van deze kan bijdragen aan de fout.


Antwoord 5

Voor Mokka-gebruikers:

Het onderstaande fragment overschrijft de installatie van window.onerror hook mokka en verandert de fouten in een waarschuwing.
https://github.com/mochajs/mocha/blob/ 667e9a21c10649185e92b319006cea5eb8d61f31/browser-entry.js#L74

// ignore ResizeObserver loop limit exceeded
// this is ok in several scenarios according to 
// https://github.com/WICG/resize-observer/issues/38
before(() => {
  // called before any tests are run
  const e = window.onerror;
  window.onerror = function(err) {
    if(err === 'ResizeObserver loop limit exceeded') {
      console.warn('Ignored: ResizeObserver loop limit exceeded');
      return false;
    } else {
      return e(...arguments);
    }
  }
});

ik weet niet zeker of er een betere manier is..


Antwoord 6

debounce toevoegen als

nieuwe ResizeObserver(_.debounce(entries => {}, 200);

deze fout voor mij verholpen


Antwoord 7

https ://github1s.com/chromium/chromium/blob/master/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc#L44-L45
https:// github1s.com/chromium/chromium/blob/master/third_party/blink/renderer/core/frame/local_frame_view.cc#L2211-L2212

Na het bekijken van de broncode, lijkt het erop dat het probleem in mijn geval opdook toen de NotifyResizeObservers-functie werd aangeroepen en er geen geregistreerde waarnemers waren.

De functie GatherObservations retourneert een min_depth van 4096, in het geval dat er geen waarnemers zijn, en in dat geval krijgen we de foutmelding “ResizeObserver looplimiet overschreden”.

Ik heb het opgelost door een waarnemer te hebben die de hele levenscyclus van de pagina meemaakt.

Other episodes