λΈλΌμ°μ κ° μλλ λμλ λ λλ§ κ³Όμ μμ Repaint, Reflowμ κ³Όμ μ κ±°μΉκ² λλ€. λ§ κ·Έλλ‘ ν΄λΉ elementλ₯Ό λ€μ μΉ νκ³ λ€μ flow(?) νλκ²μ΄λ€. reactλ₯Ό μ΄μ©νλ μ
μ₯μμ λ λλ§ μ΅μ νλ₯Ό μνν λ λ°λμ κ³ λ €ν΄μΌνλ νλͺ©μ΄κΈ°λ νλ€. μ΄ ν¬μ€ν
μμλ μ λ§€νκ² μκ³ μλ λκ°μ§μ κ°λ
μ μ νν μ§κ³ λμ΄κ°λλ‘ νκ² λ€.
The rendering process of a web page
κ·Έμ μμ λΈλΌμ°μ κ° μμλ₯Ό λ λλ§ν λ μ΄λ€ κ³Όμ μ κ±°μΉκ² λλμ§ μμ보μ.
κ°λ¨ν μμ½νλ©΄,
HTMLμparsingν΄μDOM Treeλ₯Ό λ§λ€κ³ ,CSSλ₯Όparsingν΄μ μ€νμΌ κ΅¬μ‘°μ²΄λ₯Ό λ§λ€μ΄λ΄λλ° μ΄λ₯ΌCSSOM TreeλΌκ³ νλ€DOM TreeμCSSOM Treeμ΄ λμ μ΄μ©νμ¬Render Treeλ₯Ό μμ±νλ€ (μ€μ νλ©΄μ ννλλNodeλ€λ‘ ꡬμ±)viewportλ΄μμ κ°nodeλ€μ μ νν μμΉμ ν¬κΈ°λ₯Ό κ³μ°νλ€ (Layout)layoutκ³μ°μ΄ μλ£λλ©΄ μ΄μ μμλ€μ νλ©΄μ κ·Έλ¦°λ€ (Paint)
Reflow(Layout change)
μμμ μ§μ΄λ³΄μλ λ λλ§ κ³Όμ μ κ±°μΉ λ€μ μ΅μ’
μ μΌλ‘ web pageκ° κ·Έλ €μ§λ€. νμ§λ§ μ΄κ²μ λλκ²μ΄ μλλ€. μ΄ν μ΄λ ν μ΄λ²€νΈμ λ°λΌ elementμ ν¬κΈ°, μμΉ λ± layoutμ λ³κ²½νλ©΄ κ·Έ μν₯μ λ°λ child node, parent nodeλ€μ ν¬ν¨νμ¬ λ€μ layoutκ³Όμ μ μννλ€. μ΄λ render treeμ κ° elementμ ν¬κΈ°μ μμΉλ₯Ό λ€μ μ°μ°νκ² λλλ° μ΄λ₯Ό ReflowλΌκ³ νλ€.
Reflowμ κ²½μ° λ€μμ λνμ μΈ κ²½μ°μ λ°μνλ€
nodeμ μΆκ° λλ μ κ±°elementμ μμΉ, ν¬κΈ°(margin,padding,width,height...)λ³κ²½fontλ³κ²½,imageν¬κΈ° λ³κ²½page initial renderingwindow resizingJSλ₯Ό μ΄μ©νDOMμ λμ λ³ν
Repaint(Redraw)
reflowμ²λΌ styleμ λ³κ²½νλ λͺ¨λ κ²μ΄ layout μμΉμ μν₯μ λ°μ§λ μλλ€. background-color, visibility, outline λ±μ style λ³κ²½μμλ layoutμ λ³νμ§ μκ³ reflowκ° μλ΅λ repaint κ³Όμ λ§ λ°μνλ€.
reflowμ repaintλ₯Ό μμ ν νΌν μλ μλ€. repaintμ κ²½μ° dom apiλ₯Ό ν΅ν΄ visibilityλ₯Ό λ³κ²½νμμλ, child nodeλ€κΉμ§ λ€ κ²μνκΈ° λλ¬Έμ μ±λ₯μ΄ μ νλ μ μλ€. reflowμ κ²½μ° ν΄λΉ μμμ child, parent λͺ¨λ layoutμ μλ‘ μ°μ°νκΈ° λλ¬Έμ λ μ¬κ°ν μ±λ₯μ νλ₯Ό μΌμΌν€κΈ°λ νλ€.
Reflowλ₯Ό νΌνκ±°λ κ·Έ μν₯μ μ€μΌ μ μλ λͺκ°μ§ λ°©λ²μ λ€μκ³Ό κ°λ€.
inline styleμ μ΅λν μμ€λ€inlineμμstyleμ΄ μ£Όμ΄μ§ κ²½μ°, νμ΄μ§ μ 체μ κ±Έμ³μreflowκ° μμ°¨λ‘ λ°μνκ² λλ€. λ§μΌ μμκ²½μ°μλ μΈλΆμ€νμΌ class μ‘°ν©μΌλ‘ νλ²λ§ reflowλ₯Ό λ°μμν¨λ€animationμ΄ λ€μ΄κ°elementμ κ²½μ°position: fix;λλposition: absolute;λ‘ μ§μ νλ€.animationμ κ²½μ° μ΄λ¨μλ‘ μλΉνreflowλ₯Ό λΆλ¬μΌμΌν¨λ€. μ΄ κ²½μ°μ μ λκ°μ§ μμ±μ μ¬μ©νμ¬ λ€λ₯Έ μμλ€μ μν₯μ λΌμΉμ§ μλλ‘ νλ©΄, ν΄λΉ μμλ§μ repaintλ§μ μ λ°νλ―λ‘ ν¨μ¨μ μ΄λ€JSλ₯Ό ν΅ν΄styleλ³νλ₯Ό μ€ κ²½μ° κ°κΈμ νλ²μ μ²λ¦¬νλ€
// (X)
var newElement = document.getElementById('elem');
newElement.style.background = 'blue';
newElement.style.color = '#fff';
newElement.style.border = '1px solid #ccc';
// μλμ²λΌ λ°κΎΌλ€
// (O)
/* CSS */
// #elem1 { border:1px solid #000; color:#000; background:#ddd; }
// .coloring { border-color:#00f; color:#fff; background:blue; }
/* js */
document.getElementById('elem1').className = 'coloring';tableλ μ΄μμμ μ€μΈλ€tableλ‘ κ΅¬μ±λ μμμ κ²½μ° μ μ§μ νμ΄μ§ λ λλ§μ΄ μ μ©λμ§ μμΌλ©°, λͺ¨λ load λκ³μ°μ°λνμ νλ©΄μ 보μ¬μ§λ€. λν μμ£Ό μμ λ³νλ§μ λtableμ 체 λͺ¨λnodeμ λνreflowλ₯Ό μ λ°νλ€κ³ νλ€
reflowμ repaintλ₯Ό κ³ λ €ν΄μ κ°λ°μ μ§ννλ κ²λ μ€μνμ§λ§, λ무 μ±λ₯/ν¨μ¨μ±μ μΉμ°μΉ κ²½μ° ν리ν°μ λ¬Έμ κ° μκΈΈ μ μλ€. μ μ ν trade-offλ₯Ό μκ°νλ©΄μ κ°λ°μ μ§ννλ©΄ 보기μλ νλ₯νκ³ μ±λ₯μ μΌλ‘λ μ°μν λ©μ§ μΉνμ΄μ§κ° νμν κ²μ΄λ€.
- https://medium.com/@gneutzling/the-rendering-process-of-a-web-page-78e05a6749dc