Original DOM vs. Shadow DOM vs. Virtual DOM
11570 단어 JavaScript
Introduction
For people who works as a Web Developer might be familiar with the concept of DOM
or more specifically Original DOM
, huh 😃
Have you ever wondered huge sites like Facebook, Twitter, GMail, etc with million lines of code, how they could manage DOM Tree ?
And of course, with DOM only, it is difficult for web developers to handle such million stuffs. From there, it came out the concept Virtual DOM
and Shadow DOM
.
So in this article, let's learn more about the Original DOM
, Shadow DOM
and Virtual DOM to get a full view of them.
Let's get started ^^
Original DOM
Overview
DOM stands for Document Object Model
.
The DOM includes:
Overview
DOM stands for
Document Object Model
.The DOM includes:
They are treated as nodes and are represented as DOM Tree.
<html> -> document node
<head> -> element node - head
<title>
HTML DOM -> text node
</title> -> element node - title
</head>
<body> -> element node - body
</body>
</html>
Specific examples of APIs can be mentioned as
getElementById ()
used to access an element by id or removeChild ()
used to remove a child element based on its parent.Shadow DOM
Overview
Mozilla has summarized 3 basic characteristics of the Shadow DOM:
Shadow DOM can be thought of as:
- Isolated DOM
- A “lite” version of the DOM
- NOT of a full standalone document
The reason for saying so is that the stylesheet
or javascript
from outside can't affect the Shadow DOM
and vice versa.
For example, we have the <Video>
tag as a custom element.
The structure of a DOM shadow
With Shadow DOM
, we will learn a new concept called Shadow Root
. Shadow Root
's content will not be rendered by the browser but the Shadow Host
. The Shadow Host
is treated as a normal element, but the content inside it (including the stylesheet) will be packaged and independent with the outside world:
Create a DOM shadow
<style> p { color: green } </style>
<p id="sd-root">I am Shadow Root</p>
<script>
const host = document.querySelector('#sd-root');
const root = host.createShadowRoot();
root.innerHTML = `
<style> p { color: gray }</style>
<p>Hello <strong>Shadow DOM</strong></p>
`;
</script>
Guess what the result will be 🤔🤔. . .
Here when the browser is finished rendering we will get:
instead of
When inspecting the element, we will see like this:
Thus, we will have a few comments as follows:
<style> p { color: green } </style>
<p id="sd-root">I am Shadow Root</p>
<script>
const host = document.querySelector('#sd-root');
const root = host.createShadowRoot();
root.innerHTML = `
<style> p { color: gray }</style>
<p>Hello <strong>Shadow DOM</strong></p>
`;
</script>
Shadow DOM
's inner styles are conflicted with the outside's one, it's still okay because of the characteristics of Shadow DOM
(scoped style sheet) .innerHTML ()
of element #sd-root
, we ONLY get the initialization text: "I am Shadow Root"and also can not affect anything inside Shadow Root
. DOM
- The bright part (or often called the Light DOM) is what we can interact with.- The dark part of it, the shadow (Shadow DOM) only reflects on how it will be rendered when the Light DOM changes.
And of course, we can never touch the shadow of an object 😄😄
Oohh,
DOM
is so good, so why do we need Virtual DOM
? 🙄🙄Let's find out more together 😛😛
Virtual DOM
Overview
Although this concept has existed for a long time, it only became popular when it's used in popular libraries like ReactJS, VueJS
...
As its name implies, Virtual DOM
. Virtual, means unreal.
Virtual-DOM is an Object that contains the information needed to create a DOM (Document Object Model).Virtual DOM
is capable of calculating and updating node without using DOM APIs
. After updating the Virtual DOM
, changes will be made to Original DOM
.
As some of the features I mentioned above, Virtual DOM
are seen as an effective way to solve the updating problem with DOM, it's no need to re-render the whole DOM Tree.
Here is a specification DOM Tree:
and is converted to Virtual DOM
:
In fact, instead of having to work with all objects, we often work with the smaller object corresponding to Virtual DOM
's components.
Mechanism
Initially, an object that serves as a virtual DOM
's snapshot will be created:
This copy version is used to create a diff comparison with the virtual DOM
original version , basically it will look like this:
From there, Engine will know which elements have to be updated in original DOM
, it only executes update when there is a change.
To do this, just loop through the diff
whether when adding a new node or when updating existed one:
Then, update list, rewrite the entire template, run the function render()
, display the changes view.
Although it is said to be entire template, only the parts that have actually changed will be updated. The changes made to this object are then collated and modified against original DOM.
Why use Virtual DOM?
1. Speed
Previously, I thought the reason that Virtual DOM
is faster than Original DOM
is that setting the object's attributes is faster than updating the DOM , but it's not you guys 😂😂
The fact is that updating the DOM
not take much time compared to updating attributes of object.
What really affects speed performance here is that when the DOM
changes, the browser has to recalculate CSS, build layout, paint template ...
Because the structure of DOM is tree structure, so when you want to change element and its tags and sub tags, the browser has to rerun process Reflow/Layout
. The more items you have, the slower your web will be 😦
Hmmm ...
To understand this issue more deeply, let's explore one more concept that is about mechanism binding
.
2. Data-binding
The concept data-binding
can be understood simply as:
Data-binding: Data in Model changes <=> View changes.
Data-binding in the real DOM
In some famous frameworks using mechanism data-binding
such as BackboneJS
, AngularJS
, when Object Model
's datas change, it will:
event
+ related View Object
In the frameworks using
Virtual-DOM
, Virtual-DOM
acts as both Model
and View
Thus, when Virtual-DOM
changing, all the above changes on Model
will led to changes on View
and vice versa.Although it does not impact directly to the DOM elements, it's still able to implement mechanisms
data-binding
. This makes the application speed significantly increased.Conclusion
So we've got the idea what Original DOM
, Shadow DOM
, Virtual DOM
are. Hopefully this article can help you understand more about DOM
and related issues.
Wishing you a productive week !
Thanks for reading ❤
Reference
이 문제에 관하여(Original DOM vs. Shadow DOM vs. Virtual DOM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/duytang/items/3210c30ee9f756519ca5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Original DOM vs. Shadow DOM vs. Virtual DOM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/duytang/items/3210c30ee9f756519ca5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)