Baru-baru ini, saya mendapat peringatan semacam ini, dan ini adalah pertama kalinya saya mendapatkannya:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Saya sedang mengerjakan proyek grup dan saya tidak tahu dari mana ini berasal. Ini tidak pernah terjadi sebelumnya. Tiba-tiba, itu muncul ketika orang lain terlibat dalam proyek. Bagaimana cara menemukan file / fungsi apa yang menyebabkan peringatan ini? Saya sudah mencari jawabannya, tetapi sebagian besar tentang solusi tentang bagaimana menyelesaikannya. Saya tidak dapat menyelesaikannya jika saya tidak dapat menemukan sumber masalahnya.
Dalam hal ini, peringatan hanya muncul di Chrome. Saya mencoba menggunakan Edge, tetapi saya tidak mendapatkan peringatan serupa, dan saya belum mengujinya di Firefox.
Saya bahkan mendapatkan kesalahan dari jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
sumber
Jawaban:
Pembaruan : Chrome 58+ menyembunyikan pesan debug ini dan lainnya secara default. Untuk menampilkannya, klik panah di sebelah 'Info' dan pilih 'Verbose'.
Chrome 57 mengaktifkan 'sembunyikan pelanggaran' secara default. Untuk mengaktifkannya kembali, Anda perlu mengaktifkan filter dan hapus centang pada kotak 'sembunyikan pelanggaran'.
Saya pikir kemungkinan besar Anda memperbarui ke Chrome 56. Peringatan ini adalah fitur baru yang luar biasa, menurut saya, harap matikan saja jika Anda putus asa dan penilai Anda akan mengambil nilai dari Anda. Masalah yang mendasarinya ada di browser lain tetapi browser tidak memberitahu Anda ada masalah. Tiket Chromium ada di sini tetapi sebenarnya tidak ada diskusi yang menarik tentangnya.
Pesan-pesan ini adalah peringatan bukan kesalahan karena itu tidak benar-benar akan menyebabkan masalah besar. Ini dapat menyebabkan frame terjatuh atau menyebabkan pengalaman yang kurang mulus.
Mereka layak diselidiki dan diperbaiki untuk meningkatkan kualitas aplikasi Anda. Cara untuk melakukan ini adalah dengan memperhatikan keadaan pesan apa yang muncul, dan melakukan pengujian kinerja untuk mempersempit di mana masalah terjadi. Cara paling sederhana untuk memulai pengujian kinerja adalah dengan memasukkan beberapa kode seperti ini:
Jika Anda ingin menjadi lebih maju, Anda juga bisa menggunakan profiler Chrome , atau menggunakan perpustakaan benchmark seperti ini .
Setelah Anda menemukan beberapa kode yang membutuhkan waktu lama (50ms adalah ambang Chrome), Anda memiliki beberapa opsi:
(1) dan (2) mungkin sulit atau tidak mungkin, tetapi kadang-kadang sangat mudah dan harus menjadi upaya pertama Anda. Jika perlu, itu harus selalu memungkinkan untuk dilakukan (3). Untuk melakukan ini, Anda akan menggunakan sesuatu seperti:
atau
Anda dapat membaca lebih lanjut tentang sifat asinkron dari JavaScript di sini .
sumber
performance.now()
, Anda dapat menggunakanconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
Ini hanya peringatan seperti yang disebutkan semua orang. Namun, jika Anda ingin menyelesaikan ini (yang seharusnya), maka Anda perlu mengidentifikasi apa yang menyebabkan peringatan itu terlebih dahulu. Tidak ada satu alasan karena itu Anda bisa mendapatkan peringatan reflow paksa. Seseorang telah membuat daftar untuk beberapa opsi yang memungkinkan. Anda dapat mengikuti diskusi untuk informasi lebih lanjut.
Inilah inti dari kemungkinan alasannya:
Lihat lebih lanjut di sini .
Juga, inilah kode sumber Chromium dari masalah asli dan diskusi tentang API kinerja untuk peringatan.
Sunting: Ada juga artikel tentang cara meminimalkan tata letak reflow pada PageSpeed Insight oleh Google . Ini menjelaskan apa itu browser reflow:
Selain itu, ini menjelaskan cara menguranginya:
sumber
Beberapa ide:
Hapus setengah dari kode Anda (mungkin melalui komentar).
Apakah masalahnya masih ada? Bagus, Anda sudah mempersempit kemungkinan! Ulang.
Apakah masalahnya tidak ada? Ok, lihat bagian yang Anda komentari!
Apakah Anda menggunakan sistem kontrol versi (misalnya, Git)? Jika demikian,
git checkout
beberapa dari komitmen Anda yang terbaru. Kapan masalah tersebut muncul? Lihatlah komit untuk melihat kode apa yang berubah saat masalah pertama kali tiba.sumber
git checkout E
melihat apakah masalahnya sudah ada. Jika ya, saya akan terus mencari masalah di paruh pertama komitmen. Kalau tidak, saya mencari masalah di babak kedua..js
file utama Anda dan masalahnya tetap ada ... itu bisa jadi perpustakaan yang Anda bawa melalui<script src="...">
tag! Mungkin sesuatu yang tidak perlu dikhawatirkan (terutama karena itu hanya peringatan)?.js
file eksternal . rupanya, itu penting. itu memperlambat situs saya cukup signifikan. Bagaimanapun, terima kasih lagi atas jawaban dan ide Anda.Untuk mengidentifikasi sumber masalah, jalankan aplikasi Anda, dan catat di tab Kinerja Chrome .
Di sana Anda dapat memeriksa berbagai fungsi yang membutuhkan waktu lama untuk dijalankan. Dalam kasus saya, yang berkorelasi dengan peringatan di konsol berasal dari file yang dimuat oleh ekstensi AdBlock, tetapi ini bisa menjadi hal lain dalam kasus Anda.
Periksa file-file ini dan cobalah untuk mengidentifikasi apakah ini kode ekstensi atau milik Anda. (Jika itu milik Anda, maka Anda telah menemukan sumber masalah Anda.)
sumber
Lihat di konsol Chrome di bawah tab Network dan temukan skrip yang membutuhkan waktu paling lama untuk dimuat.
Dalam kasus saya ada satu set Angular add on scripts yang telah saya sertakan tetapi belum digunakan dalam aplikasi:
Ini adalah satu-satunya file JavaScript yang membutuhkan waktu lebih lama untuk memuat daripada waktu yang ditentukan oleh "Tugas Berlari Panjang".
Semua file ini berjalan di situs web saya yang lain tanpa kesalahan yang dihasilkan tetapi saya mendapatkan kesalahan "Tugas Berlari Panjang" ini pada aplikasi web baru yang hampir tidak memiliki fungsi apa pun. Kesalahan berhenti segera setelah dihapus.
Dugaan terbaik saya adalah bahwa add-ons Angular ini mencari secara rekursif ke bagian DOM yang semakin dalam untuk tag awal mereka - tanpa menemukan, mereka harus melintasi seluruh DOM sebelum keluar, yang membutuhkan waktu lebih lama daripada yang diharapkan Chrome - dengan demikian peringatan.
sumber
Saya menemukan akar pesan ini dalam kode saya, yang mencari dan menyembunyikan atau menunjukkan node (offline). Ini adalah kode saya:
Tab kinerja (profiler) menunjukkan acara yang memakan waktu sekitar 60 ms:
Sekarang:
Tab kinerja (profiler) sekarang menunjukkan acara yang memakan waktu sekitar 1 ms:
Dan saya merasa bahwa pencarian bekerja lebih cepat sekarang (229 node).
sumber
Saya menemukan solusi dalam kode sumber Apache Cordova. Mereka menerapkan seperti ini:
Implementasi sederhana, tetapi cara cerdas.
Di Android 4.4, gunakan
Promise
. Untuk browser yang lebih lama, gunakansetTimeout()
Pemakaian:
Setelah memasukkan kode trik ini, semua pesan peringatan hilang.
sumber
Ini ditambahkan dalam Chrome 56 beta, meskipun tidak ada di changelog ini dari Chromium Blog: Chrome 56 Beta: peringatan "Tidak Aman", Web Bluetooth, dan CSS
position: sticky
Anda dapat menyembunyikan ini di bilah filter konsol dengan kotak centang Sembunyikan pelanggaran .
sumber
Jika Anda menggunakan Chrome Canary (atau Beta), cukup centang opsi 'Sembunyikan Pelanggaran'.
sumber
Ini adalah kesalahan pelanggaran dari Google Chrome yang menunjukkan kapan
Verbose
level logging diaktifkan.Contoh pesan kesalahan:
Penjelasan:
Artikel asli: Meminimalkan reflow browser oleh Lindsey Simon, Pengembang UX, yang diposting di developers.google.com.
Dan ini adalah tautan yang diberikan Google Chrome pada Anda di profiler Kinerja, pada profil tata letak (wilayah ungu muda), untuk info lebih lanjut tentang peringatan tersebut.
sumber
Menambahkan wawasan saya di sini sebagai utas ini adalah pertanyaan "pergi ke" stackoverflow pada topik.
Masalah saya ada di aplikasi Material-UI (tahap awal)
ketika saya melakukan beberapa perhitungan yang memaksa rendering halaman (satu komponen, "tampilkan hasil", tergantung pada apa yang diatur dalam yang lain, "masukan bagian").
Semuanya baik-baik saja sampai saya memperbarui "keadaan" yang memaksa "komponen hasil" untuk dirubah. Masalah utama di sini adalah bahwa saya memiliki tema material-ui ( https://material-ui.com/customization/theming/#a-note-on-performance ) di renderer yang sama (App.js / return ..) sebagai "komponen hasil", SummaryAppBarPure
Solusi adalah mengangkat ThemeProvider satu tingkat ke atas (Index.js), dan membungkus komponen Aplikasi di sini, sehingga tidak memaksa ThemeProvider untuk menghitung ulang dan menggambar / tata letak / reflow.
sebelum
di App.js:
di index.js
setelah
di App.js:
di index.js
sumber
Reflow paksa sering terjadi ketika Anda memiliki fungsi yang dipanggil beberapa kali sebelum akhir eksekusi.
Misalnya, Anda mungkin memiliki masalah pada ponsel cerdas, tetapi tidak pada peramban klasik.
Saya sarankan menggunakan
setTimeout
untuk menyelesaikan masalah.Ini tidak terlalu penting, tetapi saya ulangi, masalah muncul ketika Anda memanggil suatu fungsi beberapa kali, dan bukan ketika fungsi tersebut membutuhkan lebih dari 50 ms. Saya pikir Anda salah dalam jawaban Anda.
setTimeOut
berdasarkan pada durasi pelanggaran.sumber
Ini bukan kesalahan hanya pesan sederhana. Untuk mengeksekusi perubahan pesan ini
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(contoh)menjadi
<!DOCTYPE html>
(sumber Firefox mengharapkan ini)Pesan ditampilkan di Google Chrome 74 dan Opera 60. Setelah mengubahnya jelas, 0 verbose.
Pendekatan solusi
sumber