โ(1) ๋ด๊ฐ ์์ฑํ ์ฝ๋ โ ์น ํ๋ฉด์ ๋์ค๊ธฐ๊น์ง - ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ โ ์์ฑ์ ์ํด ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ๊ฒ์ ํ๋ค๊ฐ HTML ํ์๋ฅผ ๊ฐ๋จํ ๊ตฌํํ ๋ถ์ ๊ธ์ ์ฝ์๋ค!๐ซข
๋ฐ๋ก ์ด ๊ธ! ๋ธ๋ผ์ฐ์ ์๋๋ฐฉ์ ํ๊ตฌ - HTML ํ์(Parser) ๊ตฌํํ๊ธฐ
ํ๊ตฌํ๊ณ ๋ ๊น์ด ํ๊ณ ๋ค์ด๊ฐ๋ ๋ถ๋ค์ ๋ชจ์ต ์ง์ง ๋๋ฌด๋ ๋ฉ์ง๊ณ ๋ณธ๋ฐ๊ณ ์ถ์ ๋ชจ์ต!
๊ณผ์ฐ HTML ํ์๋ฅผ ํตํด DOM ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ด๋ป๊ฒ ์งํ๋ ๊น?
๊ทธ๋ฆฌ๊ณ ๊ตฌํํด๋ณธ๋ค๋ฉด ์ด๋ค ์ฝ๋๋ค์ด ๋์ฌ๊น?
(์ค์ HTML ํ์๊ฐ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ง์ฌ์ง ์ฝ๋๊ฐ ์๋ ํ์ตํ ํ ๊ตฌํํด๋ณด๊ณ ์ถ์๋๋ก ๊ตฌํํ ๊ณผ์ ์ ๋ด์์ต๋๋ค!)
(์ด๋ฒ ํ๋ก์ ํธ ๊นํ๋ธ ์ฃผ์)
๊ทธ๋ฌ๋ฉด ์์โ๏ธ
๋ชฉ์ฐจ
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ๊ฐ๋จํ ์ ๋ฆฌ
- ํ์ฑ์ ๋ํ ๊ฐ๋จํ ์ ๋ฆฌ
- ๋ ธ๋ ๊ตฌํ - ์์๋ก ๋ง๋ Node ๊ณ์ธต ํธ๋ฆฌ
- ํ์ ๊ตฌํ -
๋ฌธ์ โ ํ ํฐ
,ํ ํฐ โ ๋ ธ๋ โ ๊ฐ์ฒด ๋ชจ๋ธ
์ ๊ฐ ๊ณผ์
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ๊ฐ๋จํ ์ ๋ฆฌ
๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ง๋๋ ๋จ๊ณ์ธ ๋ ๋๋ง ๊ณผ์ ์ Critical Rendering Path
๋ผ๊ณ ํ๋ค.
๊ทธ ์ค HTML์ ํ์ฑํ์ฌ DOM ํธ๋ฆฌ๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ฐ์ดํธ โ ๋ฌธ์ โ ํ ํฐ โ ๋
ธ๋ โ ๊ฐ์ฒด ๋ชจ๋ธ
์ด๋ค.
ํ์ฑ์ ๋ํ ๊ฐ๋จํ ์ ๋ฆฌ
2 - 1) ๋ฌธ๋ฒ
2 - 2) ํ์-์ดํ ๋ถ์๊ธฐ ์กฐํฉ
2 - 3) ํ์ฑ ๊ณผ์
๋ ธ๋ ๊ตฌํ - ์์๋ก ๋ง๋ Node ๊ณ์ธต ํธ๋ฆฌ
์์๋ก ๋ง๋ Node ๊ณ์ธต ํธ๋ฆฌ
(์ค์ ๋ ธ๋ ๊ณ์ธต๊ณผ ํฐ ์ฐ๊ด์ด ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ ํด๋์ผ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฆ๋๋ก ๋ง๋ค์ด ๋ณด์๋ค!)
CommonNode: Node ๊ฐ์ฒด์ ํด๋นํ๋ ๊ฐ์ฅ ์์ ๊ฐ์ฒด
EachNode: CommonNode์ ํ์ ๊ฐ์ฒด์ด๋ฉด์ ElementNode ์ธ์ ๋ชจ๋ ํ ์คํธ๋ฅผ ์๋ฏธํ๋ ๋ ธ๋
EachELement: CommonNode์ ํ์ ๊ฐ์ฒด์ด๋ฉด์ element์ ํด๋นํ๋ ๋ชจ๋ ๋ ธ๋
๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํด๋์ค๋ก ์ ์ํ์๋ค.
export class CommonNode {
depth: number;
nodeName: string;
nodeType: number;
innerHTML: string;
value: string | null;
childNodes: Array<IEachNode | IEachElement>;
nodeValue?: string;
tagName?: string;
attributes?: string;
children?: Array<IEachNode | IEachElement>;
constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes }: ICommonNode) {
this.depth = depth;
this.nodeName = nodeName;
this.nodeType = nodeType;
this.innerHTML = innerHTML;
this.value = value;
this.childNodes = childNodes;
}
}
export class EachNode extends CommonNode {
constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes, nodeValue }: IEachNode) {
super({ depth, nodeName, nodeType, innerHTML, value, childNodes, nodeValue });
this.nodeValue = nodeValue;
}
}
export class EachElement extends CommonNode {
constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes, tagName, attributes, children }: IEachElement) {
super({ depth, nodeName, nodeType, innerHTML, value, childNodes, tagName, attributes, children });
this.tagName = tagName;
this.attributes = attributes;
this.children = children;
}
}
ํ์ ๊ตฌํ - ๋ฌธ์ โ ํ ํฐ
, ํ ํฐ โ ๋
ธ๋ โ ๊ฐ์ฒด ๋ชจ๋ธ
์ ๊ฐ ๊ณผ์
๋ฌธ์ โ ํ ํฐ
, ํ ํฐ โ ๋
ธ๋ โ ๊ฐ์ฒด ๋ชจ๋ธ
์ ๊ฐ ๊ณผ์ ์ ๋จผ์ ๊ทธ๋ ค๋ณด๊ณ ์ ํ๋ค!
4 - 1) ๋ฌธ์ โ ํ ํฐ
์ค์ ๋ฌธ์ โ ํ ํฐ
๋จ๊ณ์์ ํ๊ทธ ๋ฐฐ์ด์ depth๋ฅผ ์ฃผ๋ ๊ฒ ๊ฐ์ง๋ ์์์ง๋ง, ๊ฐ๋ฐ์ ํธ์๋ฅผ ๊ณ ๋ คํ์ฌ ๋ฃ์๊ณ ,
์์๋ฅผ ๊ธ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
4 - 2) ํ ํฐ โ ๋
ธ๋
์ถ์ฒ
๋ธ๋ผ์ฐ์ ์๋๋ฐฉ์ ํ๊ตฌ - HTML ํ์(Parser) ๊ตฌํํ๊ธฐ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์๊ณ ์์ด์ผ ํ ๋ธ๋ผ์ฐ์ ์ ๋์ ๊ณผ์ (2)
๋ ๋๋ง ์์ง(1) - ํ์ฑ๊ณผ DOMํธ๋ฆฌ ๊ตฌ์ถ