Czy Shadow DOM jest szybki jak Virtual DOM w React.js?


Odpowiedzi:


125

Wirtualny DOM

Wirtualny DOM polega na unikaniu niepotrzebnych zmian w DOM, które są kosztowne pod względem wydajności, ponieważ zmiany w DOM zwykle powodują ponowne renderowanie strony. Wirtualny DOM pozwala również zebrać kilka zmian do zastosowania na raz, więc nie każda pojedyncza zmiana powoduje ponowne renderowanie, ale zamiast tego ponowne renderowanie odbywa się tylko raz po zastosowaniu zestawu zmian do DOM.

Shadow DOM

Shadow dom dotyczy głównie hermetyzacji implementacji. Pojedynczy element niestandardowy może implementować mniej lub bardziej złożoną logikę w połączeniu z mniej lub bardziej złożonym DOM. Cała aplikacja internetowa o dowolnej złożoności może zostać dodana do strony przez import, <body><my-app></my-app>ale także prostsze komponenty wielokrotnego użytku i komponowalne mogą być implementowane jako elementy niestandardowe, gdzie wewnętrzna reprezentacja jest ukryta w cieniu DOM <date-picker></date-picker>.

Hermetyzacja stylów Shadow DOM polega również na zapobieganiu przypadkowemu zastosowaniu stylów do elementów, których projektant nie zamierzał, na przykład dlatego, że używana biblioteka CSS lub komponentów zmieniła selektor, który teraz ma zastosowanie do innych elementów, które używają tych samych nazw klas CSS. Style dodane do komponentów są ograniczone do tego komponentu, co zapobiega wykrwawianiu się lub wnikaniu stylów.

Shadow DOM i wydajność

Mimo że w shadow DOM nie chodzi przede wszystkim o wydajność, ma on również wpływ na wydajność. Ponieważ style mają określony zakres, przeglądarka może przyjąć założenia dotyczące pewnych zmian, aby wpłynąć tylko na ograniczony obszar strony (cień DOM elementu niestandardowego), co może ograniczyć ponowne renderowanie do obszaru takiego komponentu, zamiast ponownego renderowania całą stronę.

To jest powód, dla którego >>>, /deep/i ::shadowkombinatorów CSS, co pozwoliło zastosować style ponad granicami cień dom, były przestarzałe i podlegają wkrótce usunięta z Chrome (innych przeglądarek nigdy ich AFAIK). Samo istnienie tych kombinatorów uniemożliwia rodzaj optymalizacji, o którym mowa w poprzednim akapicie.

Angular2 wykorzystuje zalety obu światów.

Wykorzystuje jednokierunkowy przepływ danych i uruchamia wykrywanie zmian tylko w modelu. Jeśli wykryje zmianę powoduje DOM być aktualizowane przez aktualizację i powiązań strukturalnych jak zrobić dyrektyw *ngFor, *ngIf... aktualizuje DOM. Dlatego DOM jest aktualizowany tylko wtedy, gdy model faktycznie się zmienił.

Angular2 używa shadow DOM (tylko w przypadku ViewEncapsulation.Nativektórego obecnie nie jest to opcja domyślna), aby wykorzystać możliwości enkapsulacji stylów zapewniane przez przeglądarkę lub (bieżące ustawienie domyślne) po prostu emulować hermetyzację stylów przez przepisanie stylów dodanych do komponentów, jako obejście aż do natywnych zmiennych Shadow DOM i CSS (dla dynamicznych globalnych zmian stylu) stają się szeroko dostępne.



jakaś praktyczna odpowiedź mogłaby dodać więcej znaczenia.
Kod

@Kod Jakiego znaczenia brakuje? Pytania dotyczące wydajności są generalnie bezcelowe. Jeśli naprawdę chcesz wiedzieć, zbuduj test porównawczy, który obejmie Twój przypadek użycia.
Günter Zöchbauer

70

Nie, Shadow DOM i Virtual DOM nie są ze sobą powiązane, chociaż mają podobną nazwę:

Wirtualny DOM: Reaguj na koncepcję zachowania dwóch kopii DOM (oryginalnego i zaktualizowanego) z powodów różnicowych. Przed renderowaniem, React porównuje dwa obiekty, aby określić, czy powinien zastosować aktualizację do aktualnego drzewa DOM. Skutkuje to zwiększoną wydajnością, ponieważ aktualizujemy tylko te części widoku, które tego wymagają, a nie cały ekran.

Shadow DOM: Część specyfikacji Web Components zaproponowana przez W3C, która w zasadzie pozwala na hermetyzację mniejszych elementów DOM i stylów CSS w jednym elemencie DOM:

Przykładowy element Shadow DOM

<video width="300" height="150" />

Jednak w <video>rzeczywistości zawiera następujące elementy:

<div>
   <input type="button" style="color: blue;">Play
   <input type="button" style="color: red;">Pause
   <source src="myVideo.mp4">
</div>

Więc za pomocą cienia DOM, jesteśmy w stanie ukryć szczegóły realizacji naszej elementu internetowej i przechodzą tylko wzdłuż niezbędnych informacji do podelementów (tj height, width), które, być może mylnie, mocno przypomina ReactJS idiom przechodząc propsdo komponentów .

Informacje dostarczane przez :


Czy masz na myśli, że wydajność Shadow DOM jest jak DOM, ale jest po prostu hermetyzowana?
Hmoo_oomH

3
@Hmoo_oomH Rozumiem, że Shadow DOM jest bardziej czytelny - ponieważ ukrywamy szczegóły implementacji złożonych elementów internetowych za elementem wyższego rzędu (np. <video> ), Ale nie oczekujemy wzrostu wydajności.
lux
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.