Ostatnio dostałem takie ostrzeżenie i po raz pierwszy je otrzymałem:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Pracuję nad projektem grupowym i nie mam pojęcia, skąd on pochodzi. To się nigdy wcześniej nie zdarzyło. Nagle pojawiło się, gdy ktoś inny zaangażował się w projekt. Jak znaleźć plik / funkcję, która powoduje to ostrzeżenie? Szukałem odpowiedzi, ale głównie o tym, jak ją rozwiązać. Nie mogę tego rozwiązać, jeśli nawet nie mogę znaleźć źródła problemu.
W takim przypadku ostrzeżenie pojawia się tylko w Chrome. Próbowałem użyć Edge, ale nie otrzymałem podobnych ostrzeżeń i nie przetestowałem go jeszcze w Firefoksie.
Błąd pojawia się nawet w jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
javascript
google-chrome
dom
procatmer
źródło
źródło
Odpowiedzi:
Aktualizacja : Chrome 58+ domyślnie ukrył te i inne komunikaty debugowania. Aby je wyświetlić, kliknij strzałkę obok „Informacje” i wybierz „Pełne”.
Chrome 57 domyślnie włączył opcję „ukryj naruszenia”. Aby je ponownie włączyć, musisz włączyć filtry i odznaczyć pole „ukryj naruszenia”.
Myślę, że bardziej prawdopodobne jest, że zaktualizowałeś przeglądarkę Chrome 56. To ostrzeżenie jest cudowną nową funkcją, moim zdaniem, wyłącz ją tylko, jeśli jesteś zdesperowany, a Twój asesor odbierze ci oceny. Problemy leżą u podstaw innych przeglądarek, ale przeglądarki po prostu nie informują o problemie. Bilet Chromium jest tutaj ale tak naprawdę nie ma żadnej interesującej dyskusji na jego temat.
Te komunikaty są ostrzeżeniami zamiast błędów, ponieważ tak naprawdę nie będą powodować poważnych problemów. Może to powodować upuszczanie ramek lub w inny sposób powodować mniej płynne działanie.
Warto je jednak zbadać i naprawić, aby poprawić jakość aplikacji. Można to zrobić, zwracając uwagę na okoliczności, w których pojawiają się komunikaty, i przeprowadzając testy wydajności, aby zawęzić miejsce występowania problemu. Najprostszym sposobem rozpoczęcia testowania wydajności jest wstawienie takiego kodu:
Jeśli chcesz być bardziej zaawansowany, możesz także użyć profilera Chrome lub skorzystać z biblioteki testów porównawczych, takiej jak ta .
Gdy znajdziesz trochę kodu, który zajmuje dużo czasu (50 ms to próg Chrome), masz kilka opcji:
(1) i (2) mogą być trudne lub niemożliwe, ale czasem są naprawdę łatwe i powinny być twoimi pierwszymi próbami. W razie potrzeby zawsze powinno być to możliwe (3). Aby to zrobić, użyjesz czegoś takiego:
lub
Możesz przeczytać więcej o asynchronicznej naturze JavaScript tutaj .
źródło
performance.now()
, możesz użyćconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
To tylko ostrzeżenia, jak wszyscy wspominali. Jeśli jednak chcesz je rozwiązać (co powinieneś), musisz najpierw ustalić, co powoduje ostrzeżenie. Nie ma jednego powodu, dla którego można uzyskać ostrzeżenie o przepływie wymuszonym. Ktoś utworzył listę niektórych możliwych opcji. Możesz śledzić dyskusję, aby uzyskać więcej informacji.
Oto sedno możliwych przyczyn:
Sprawdź więcej tutaj .
Oto kod źródłowy Chromium z oryginalnego wydania i dyskusja na temat interfejsu API wydajności dla ostrzeżeń.
Edycja: Jest też artykuł o tym, jak zminimalizować zmiany układu w PageSpeed Insight firmy Google . Wyjaśnia, co to jest przepełnienie przeglądarki:
Ponadto wyjaśnia, jak to zminimalizować:
źródło
Kilka pomysłów:
Usuń połowę swojego kodu (być może poprzez komentowanie go).
Czy problem nadal występuje? Świetnie, zawęziłeś możliwości! Powtarzać.
Czy nie ma problemu? Ok, spójrz na połowę, którą skomentowałeś!
Czy używasz systemu kontroli wersji (np. Git)? Jeśli tak,
git checkout
niektóre z ostatnich zatwierdzeń. Kiedy wprowadzono problem? Spójrz na zatwierdzenie, aby zobaczyć dokładnie, jaki kod zmienił się, gdy problem pojawił się po raz pierwszy.źródło
git checkout E
sprawdziłbym, czy problem już istnieje. Jeśli tak, będę nadal szukać problemu w pierwszej połowie zatwierdzeń. W przeciwnym razie szukam problemu w drugiej połowie..js
plik, a problem będzie się powtarzał ... może to być biblioteka przywieziona przez<script src="...">
tag! Może coś, o co nie warto się martwić (zwłaszcza, że to tylko ostrzeżenie)?.js
pliku. najwyraźniej ma to znaczenie. spowalnia moją stronę. w każdym razie jeszcze raz dziękuję za odpowiedzi i pomysły.Aby zidentyfikować źródło problemu, uruchom aplikację i zapisz ją na karcie Wydajność Chrome .
Tam możesz sprawdzić różne funkcje, których uruchomienie zajęło dużo czasu. W moim przypadku ten, który korelował z ostrzeżeniami w konsoli, pochodzi z pliku załadowanego przez rozszerzenie AdBlock, ale może to być coś innego w twoim przypadku.
Sprawdź te pliki i spróbuj ustalić, czy jest to kod jakiegoś rozszerzenia czy twój. (Jeśli to twoje, to znalazłeś źródło problemu).
źródło
Zajrzyj do konsoli Chrome na karcie Sieć i znajdź skrypty, których ładowanie trwa najdłużej.
W moim przypadku był zestaw skryptów Angular, które załączyłem, ale jeszcze nie użyłem w aplikacji:
Były to jedyne pliki JavaScript, których ładowanie trwało dłużej niż czas określony przez błąd „Long Running Task”.
Wszystkie te pliki działają na moich innych stronach internetowych bez generowania błędów, ale otrzymywałem ten błąd „Long Running Task” w nowej aplikacji internetowej, która ledwo miała jakąkolwiek funkcjonalność. Błąd zatrzymał się natychmiast po usunięciu.
Domyślam się, że te Angularowe dodatki szukały rekurencyjnie w coraz głębszych sekcjach DOM dla swoich znaczników początkowych - nie znajdując żadnego, musiały przejść całą DOM przed wyjściem, co trwało dłużej niż się spodziewa Chrome - a więc ostrzeżenie.
źródło
Znalazłem źródło tej wiadomości w moim kodzie, który szukał i ukrywał lub pokazywał węzły (offline). To był mój kod:
Karta wydajności (profiler) pokazuje zdarzenie trwające około 60 ms:
Teraz:
Karta wydajności (profiler) pokazuje teraz zdarzenie trwające około 1 ms:
I wydaje mi się, że wyszukiwanie działa teraz szybciej (229 węzłów).
źródło
Znalazłem rozwiązanie w kodzie źródłowym Apache Cordova. Realizują w ten sposób:
Prosta implementacja, ale inteligentny sposób.
Na Androidzie 4.4 użyj
Promise
. W przypadku starszych przeglądarek użyjsetTimeout()
Stosowanie:
Po wstawieniu tego kodu sztuczki zniknęły wszystkie komunikaty ostrzegawcze.
źródło
Zostało to dodane w Chrome 56 beta, mimo że nie ma go w tym dzienniku zmian z Chromium Blog: Chrome 56 Beta: ostrzeżenie „Niezabezpieczone”, Web Bluetooth i CSS
position: sticky
Możesz to ukryć na pasku filtrów konsoli, zaznaczając pole wyboru Ukryj naruszenia .
źródło
Jeśli używasz Chrome Canary (lub Beta), po prostu zaznacz opcję „Ukryj naruszenia”.
źródło
Jest to błąd naruszenia zasad przeglądarki Google Chrome, który pokazuje, kiedy
Verbose
poziom rejestrowania jest włączony.Przykład komunikatu o błędzie:
Wyjaśnienie:
Artykuł oryginalny: Minimalizacja ponownego wczytywania przeglądarki przez Lindsey Simon, programistę UX, opublikowana na developers.google.com.
I to jest link, który Google Chrome podaje w Profilu wydajności, w profilach układu (regiony fioletowe), aby uzyskać więcej informacji na temat ostrzeżenia.
źródło
Dodając moje spostrzeżenia tutaj, ponieważ ten wątek był pytaniem „przejdź do” stosu przepływów na ten temat.
Mój problem dotyczył aplikacji Material-UI (wczesne etapy)
kiedy wykonałem kilka obliczeń wymuszających renderowanie strony (jeden składnik, „wyświetl wyniki”, zależy od tego, co jest ustawione w innych, „sekcjach wejściowych”).
Wszystko było w porządku, dopóki nie zaktualizowałem „stanu”, który zmusza „komponent wyników” do ponownego wydania. Głównym problemem tutaj było to, że miałem motyw interfejsu użytkownika ( https://material-ui.com/customization/theming/#a-note-on-performance ) w tym samym rendererze (App.js / return ..) jako „składnik wyników”, SummaryAppBarPure
Rozwiązaniem było podniesienie ThemeProvider o jeden poziom wyżej (Index.js) i zawinięcie tutaj komponentu App, nie zmuszając w ten sposób ThemeProvider do ponownego obliczenia i narysowania / układu / przepływu.
przed
w App.js:
w index.js
po
w App.js:
w index.js
źródło
Wymuszone ponowne wlanie często zdarza się, gdy masz funkcję wywoływaną wiele razy przed końcem wykonania.
Na przykład problem może występować na smartfonie, ale nie w klasycznej przeglądarce.
Sugeruję użycie a
setTimeout
do rozwiązania problemu.Nie jest to bardzo ważne, ale powtarzam, problem pojawia się, gdy wywołujesz funkcję kilka razy, a nie gdy funkcja trwa dłużej niż 50 ms. Myślę, że mylisz się w swoich odpowiedziach.
setTimeOut
metody opartej na czasie trwania naruszenia.źródło
To nie jest błąd, tylko zwykła wiadomość. Aby wykonać tę wiadomość, zmień
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(przykład)na
<!DOCTYPE html>
(źródło Firefox się tego spodziewa). Wiadomość została pokazana w Google Chrome 74 i Opera 60. Po zmianie było jasne, 0 pełnych.
Podejście do rozwiązania
źródło