Apakah menerapkan Shadow DOM dalam proyek saya akan membuatnya lebih cepat seperti DOM virtual yang digunakan oleh React?
sumber
Apakah menerapkan Shadow DOM dalam proyek saya akan membuatnya lebih cepat seperti DOM virtual yang digunakan oleh React?
DOM Virtual
DOM virtual adalah tentang menghindari perubahan yang tidak perlu pada DOM, yang mahal dari segi performa, karena perubahan pada DOM biasanya menyebabkan perenderan ulang laman. DOM Virtual juga memungkinkan untuk mengumpulkan beberapa perubahan untuk diterapkan sekaligus, jadi tidak setiap perubahan menyebabkan perenderan ulang, tetapi perenderan ulang hanya terjadi sekali setelah sekumpulan perubahan diterapkan ke DOM.
Shadow DOM
Shadow dom sebagian besar tentang enkapsulasi implementasi. Satu elemen khusus dapat mengimplementasikan logika yang lebih-atau-kurang kompleks yang dikombinasikan dengan DOM yang lebih-atau-kurang kompleks. Seluruh aplikasi web dengan kompleksitas yang sewenang-wenang dapat ditambahkan ke halaman dengan mengimpor dan <body><my-app></my-app>
juga komponen yang dapat digunakan kembali dan disusun yang lebih sederhana dapat diimplementasikan sebagai elemen khusus di mana representasi internal disembunyikan dalam shadow DOM seperti <date-picker></date-picker>
.
Enkapsulasi gaya Shadow DOM juga tentang mencegah gaya diterapkan secara tidak sengaja ke elemen yang tidak diinginkan oleh desainer, misalnya karena CSS atau pustaka komponen yang Anda gunakan mengubah pemilih yang sekarang berlaku untuk elemen lain yang menggunakan nama kelas CSS yang sama. Gaya yang ditambahkan ke komponen dicakup ke komponen itu dan perubahan gaya atau gaya dicegah.
Shadow DOM dan kinerja
Meskipun shadow DOM bukan tentang kinerja pada awalnya, shadow DOM juga memiliki implikasi kinerja. Karena gaya memiliki cakupan, browser dapat membuat asumsi tentang beberapa perubahan untuk hanya memengaruhi area halaman yang terbatas (shadow DOM dari elemen kustom) yang dapat membatasi rendering ulang ke area komponen seperti itu, alih-alih rendering ulang seluruh halaman.
Ini adalah alasan >>>
, /deep/
dan ::shadow
combinators CSS, yang memungkinkan untuk menerapkan gaya melintasi batas-batas bayangan DOM, yang usang dan tunduk segera dihapus dari Chrome (browser lain pernah mereka AFAIK). Keberadaan penggabung ini saja mencegah jenis pengoptimalan yang disebutkan di paragraf sebelumnya.
Angular2 menggunakan keuntungan dari kedua dunia.
Ini menggunakan aliran data searah dan menjalankan deteksi perubahan hanya pada model. Jika mendeteksi perubahan itu menyebabkan DOM yang akan diperbarui oleh binding memperbarui dan membuat arahan struktural seperti *ngFor
, *ngIf
, ... memperbarui DOM. Oleh karena itu, DOM hanya diperbarui ketika model benar-benar berubah.
Angular2 menggunakan shadow DOM (hanya ViewEncapsulation.Native
yang saat ini bukan default) untuk memanfaatkan kemampuan enkapsulasi gaya yang disediakan oleh browser, atau (default saat ini) hanya meniru enkapsulasi gaya dengan menulis ulang gaya yang ditambahkan ke komponen, sebagai solusi hingga variabel shadow DOM dan CSS asli (untuk perubahan gaya global yang dinamis) tersedia secara luas.
Tidak, Shadow DOM dan Virtual DOM tidak terkait, meskipun namanya agak mirip:
Virtual DOM: Konsep React menyimpan dua salinan DOM (asli, dan yang diperbarui) untuk alasan yang berbeda. Sebelum rendering, React membedakan kedua objek tersebut untuk menentukan apakah itu harus menerapkan pembaruan ke pohon DOM yang sebenarnya. Ini menghasilkan kinerja yang ditingkatkan, karena kami hanya memperbarui bagian tampilan yang memerlukannya, bukan seluruh layar.
Shadow DOM: Bagian dari spesifikasi Komponen Web seperti yang diusulkan oleh W3C, yang pada dasarnya memungkinkan enkapsulasi elemen DOM yang lebih kecil dan gaya CSS ke dalam satu elemen DOM:
Contoh Elemen Shadow DOM
<video width="300" height="150" />
Namun,
<video>
sebenarnya merangkum elemen-elemen berikut:<div> <input type="button" style="color: blue;">Play <input type="button" style="color: red;">Pause <source src="myVideo.mp4"> </div>
Jadi dengan menggunakan Shadow DOM, kami dapat menyembunyikan detail implementasi elemen web kami, dan hanya meneruskan informasi yang diperlukan ke sub-elemen (yaitu
height
,width
), yang, mungkin membingungkan, sangat mirip dengan idiom ReactJS untuk meneruskanprops
ke komponen. .Informasi disediakan melalui :
sumber
<video>
), Tetapi tidak ada harapan untuk peningkatan kinerja.