useInsertionEffect Hook
useInsertionEffect Hook — CSS-in-JS գրադարանների օպտիմիզացում
useInsertionEffect-ը React-ի հատուկ hook է, որը հայտնվել է React 18-ում։ Այն նախատեսված է CSS-in-JS գրադարանների համար (օր. styled-components, Emotion, JSS և այլն)՝ ապահովելու, որ CSS style-ները ներարկվեն DOM-ի մեջ ճիշտ ժամանակին՝ մինչև rendering-ը։
Սա performance hook է, որը թույլ է տալիս React-ին կանխել “unstyled flash”-ը՝ երբ կոմպոնենտը երևում է էկրանին առանց իր CSS-ի և մի վայրկյան հետո նոր ձևավորվում։
React-ի rendering ընթացքը կարելի է բաժանել երեք փուլերի․
useInsertionEffect-ը աշխատում է հենց commit phase-ի սկզբում՝ նախքան React-ը կգրի DOM-ի փոփոխությունները, այսինքն՝ նախքան useLayoutEffect-ը։
Ահա թե ինչպես է hook-ը օգտագործվում React-ում․
import React, { useInsertionEffect } from 'react';
export default function StyledBox() {
useInsertionEffect(() => {
const style = document.createElement('style');
style.innerHTML = `
.styled-box {
background: linear-gradient(45deg, #2196f3, #21cbf3);
color: white;
padding: 20px;
border-radius: 8px;
transition: all 0.3s ease;
}
.styled-box:hover {
transform: scale(1.05);
}
`;
document.head.appendChild(style);
return () => {
document.head.removeChild(style);
};
}, []);
return <div className="styled-box">Beautiful styled box 💎</div>;
}
Այս օրինակում CSS-ը ներմուծվում է DOM-ի մեջ մինչև rendering-ը, այսինքն՝ երբ կոմպոնենտը render է լինում՝ այն արդեն ձևավորված է, առանց տեսանելի flicker-ի։
Նայենք՝ ինչ տարբերություն կլինի, եթե նույն բանն անենք `useEffect`-ով instead of `useInsertionEffect`․
useEffect(() => {
const style = document.createElement('style');
style.innerHTML = '.red { color: red; }';
document.head.appendChild(style);
}, []);
Այս դեպքում style-ը կավելացվի միայն այն բանից հետո, երբ React-ը render անի կոմպոնենտը։ Դա նշանակում է՝ օգտվողը կարող է կես վայրկյան տեսնել անձև, չձևավորված UI (“unstyled flash”)։
useInsertionEffect-ը լուծում է հենց այս խնդիրը՝ CSS-ը ներմուծելով նախքան browser-ի paint-ը։
Այս hook-ը նախատեսված չէ սովորական ծրագրավորողների համար։ Եթե դու չես գրում CSS-in-JS գրադարան կամ framework, շատ հավանական է՝ երբեք այն չպետք է կիրառես։
Այս hook-ը ոչ մի արժեք չի վերադարձնում։ Այն միայն կատարում է “side effect”՝ օգնելով React-ին ներդնել CSS-ը ճիշտ ժամանակին։
Գրիր կոմպոնենտ, որը․