React ì íì íìŽëë ìŽì ì íìíì¬ ì»Ží¬ëíž íìŽëë ìŽì ì ì ëµì ì°ì ìì륌 ì§ì íšìŒë¡ìš ì¹ ì í늬ìŒìŽì ì±ë¥ì ê°ì íë ìµì²šëš êž°ì ì ëë€. ìë ë°©ì곌 구í ë°©ë²ì ìì볎ìžì.
React ì íì íìŽëë ìŽì : 컎í¬ëíž ë¡ë© ìží 늬ì ì€
íë ì¹ ê°ë° ììììë ë°ìŽë ì¬ì©ì 겜íì ì ê³µíë ê²ìŽ ê°ì¥ ì€ìí©ëë€. ë늰 ë¡ë© ìê°ê³Œ ë늰 ìíž ìì©ì ì¬ì©ì ë¶ë§ê³Œ ìŽíë¡ ìŽìŽì§ ì ììµëë€. ì¬ì©ì ìží°íìŽì€ 구ì¶ì ìí ë늬 ì¬ì©ëë JavaScript ëŒìŽëžë¬ëŠ¬ìž Reactë ì±ë¥ì í¥ììí€êž° ìí ë€ìí ìµì í êž°ì ì ì ê³µí©ëë€. ìŽ ì€ììë ì íì íìŽëë ìŽì ì ìŽêž° ë¡ë© ìê°ê³Œ ìžì§ë ìëµì±ì í¬ê² í¥ììí€ë ê°ë ¥í ì ê·Œ ë°©ììŒë¡ ëëë¬ì§ëë€.
React íìŽëë ìŽì ìŽë 묎ììžê°ì?
ì íì íìŽëë ìŽì ì ìŽíŽë³Žêž° ì ì 뚌ì Reactìì íìŽëë ìŽì ì ê°ë ì ìŽíŽíŽ ë³Žê² ìµëë€. íìŽëë ìŽì ì Reactê° ìë² ë ëë§ë HTMLì ê°ì žì íŽëŒìŽìžíž ìž¡ìì ìŽë²€íž 늬ì€ë ë° êž°í ìíž ìì©ì ì°ê²°íë íë¡ìžì€ì ëë€. Ʞ볞ì ìŒë¡ ì ì HTMLì ìì í ìëíë ëíí React ì í늬ìŒìŽì ìŒë¡ ë³íí©ëë€.
Ʞ졎ì ìë² ì¬ìŽë ë ëë§(SSR) ì€ì ìì ìë²ë ì 첎 ì í늬ìŒìŽì ì HTMLë¡ ë ëë§í ë€ì íŽëŒìŽìžížë¡ ì ì¡í©ëë€. ê·žë° ë€ì íŽëŒìŽìžíž ìž¡ React ìœëë ìŽ HTMLì "íìŽëë ìŽì "íì¬ ëííìŒë¡ ë§ëëë€. SSRì ì¬ì ë ëë§ë HTML 구조륌 ì ê³µíì¬ ìŽêž° ë¡ë© ìê°ì ê°ì íì§ë§, í¹í ìë§ì 컎í¬ëížê° ìë ë³µì¡í ì í늬ìŒìŽì ì ê²œì° íìŽëë ìŽì íë¡ìžì€ê° ì¬ì í ë³ëª© íììŽ ë ì ììµëë€.
Ʞ졎 íìŽëë ìŽì ì 묞ì ì
Ʞ졎 íìŽëë ìŽì ì ì 첎 ì í늬ìŒìŽì ì í ë²ì ì ê·¹ì ìŒë¡ íìŽëë ìŽì í©ëë€. ìŽë¡ ìžíŽ ëª ê°ì§ 죌ì 묞ì ê° ë°ìí ì ììµëë€.
- ìíž ìì© ì§ì°: ì¬ì©ìë ì 첎 ì í늬ìŒìŽì ìŽ íìŽëë ìŽì ë ëê¹ì§ êž°ë€ë €ìŒ ì í늬ìŒìŽì ì ìŒë¶ë¥Œ ìíž ìì©í ì ììµëë€. íìŽì§ì 볎ìŽë ë¶ë¶ìŽ ìë²ìì ë¹ ë¥Žê² ë ëë§ëëëŒë ì 첎 íìŽëë ìŽì íë¡ìžì€ê° ìë£ë ëê¹ì§ ì¬ì©ìë íŽë¹ ë¶ë¶ê³Œ ìíž ìì©í ì ììµëë€.
- CPU ì§ìœì : ëê·ëªš ì í늬ìŒìŽì ì íìŽëë ìŽì íë ë°ë í¹í ì±ë¥ìŽ ë®ì ì¥ì¹ìì ê³ì° ë¹ì©ìŽ ë§ìŽ ë€ ì ììµëë€. ìŽë¡ ìžíŽ í¹í ìŽêž° ë¡ë ì€ì ì¬ì©ì 겜íìŽ ì íë ì ììµëë€.
React ì íì íìŽëë ìŽì ìê°
ì íì íìŽëë ìŽì ì 뚌ì íìŽëë ìŽì íŽìŒ íë 컎í¬ëížì ì°ì ìì륌 ì§ì í ì ìëë¡ íì¬ ìŽë¬í 묞ì 륌 íŽê²°í©ëë€. ìŠ, ì¬ì©ììê² íìëê³ ìŽêž° ìíž ìì©ì íìì ìž ì€ì 컎í¬ëížë ë ì€ìíê±°ë í멎ì ìë 컎í¬ëížë³Žë€ 뚌ì íìŽëë ìŽì ë ì ììµëë€. 컎í¬ëížë¥Œ ì ëµì ìŒë¡ íìŽëë ìŽì í멎 ë€ìì ìíí ì ììµëë€.
- TTI(ìíž ìì© ìê°) ê°ì : ì¬ì©ìê° íìŽì§ì ìíž ìì©íë ë° ê±žëŠ¬ë ìê°ì ì€ì ëë€.
- ìžì§ë ì±ë¥ í¥ì: ì 첎 íìŽì§ê° ìì í íìŽëë ìŽì ëì§ ìì 겜ì°ìë ì í늬ìŒìŽì ìŽ ë ë¹ ë¥Žê³ ìëµì±ìŽ ë°ìŽëë€ê³ ëëŒê² í©ëë€.
- 늬ìì€ íì© ìµì í: ë ì€ìí 컎í¬ëížì íìŽëë ìŽì ì ì°êž°íì¬ ë ì€ìí ìì ì 늬ìì€ë¥Œ í볎í©ëë€.
ì íì íìŽëë ìŽì ì ìŽë»ê² ìëíëì?
ì íì íìŽëë ìŽì ì íµì¬ ììŽëìŽë íìŽëë ìŽì íë¡ìžì€ë¥Œ ë ìê³ êŽëЬíêž° ì¬ìŽ ì²í¬ë¡ ëëê³ ì€ìëì ë°ëŒ ì°ì ìì륌 ì§ì íë ê²ì ëë€. ìŽë ë€ìì í¬íší ë€ìí êž°ì ì íµíŽ ë¬ì±í ì ììµëë€.
- ì§ì° íìŽëë ìŽì : 컎í¬ëížê° íìëê±°ë íìí ëê¹ì§ íìŽëë ìŽì ì ì°êž°í©ëë€.
- ì¡°ê±Žë¶ íìŽëë ìŽì : ì¬ì©ì ìíž ìì© ëë ì¥ì¹ êž°ë¥ê³Œ ê°ì í¹ì 조걎ì ë°ëŒ 컎í¬ëížë¥Œ íìŽëë ìŽì í©ëë€.
- ì°ì ììê° ì§ì ë íìŽëë ìŽì : 컎í¬ëížë¥Œ íìŽëë ìŽì íŽìŒ íë ìì륌 ëª ìì ìŒë¡ ì§ì í©ëë€.
ìŽë¬í êž°ì ì ì¢
ì¢
Reactì ëŽì¥ êž°ë¥ìž React.lazy, Suspense ë° ì¬ì©ì ì ì í
ì ì¬ì©íì¬ íìŽëë ìŽì
íë¡ìžì€ë¥Œ ì ìŽí©ëë€.
ì íì íìŽëë ìŽì ì ìŽì
ì íì íìŽëë ìŽì ì 구íí멎 React ì í늬ìŒìŽì ì ìë¹í ìŽì ì ì ê³µí ì ììµëë€.
- ë ë¹ ë¥ž ìŽêž° ë¡ë© ìê°: ì€ì 컎í¬ëížì íìŽëë ìŽì ì°ì ìì륌 ì§ì íì¬ íìŽì§ê° ëííìŽ ëë ë° ê±žëŠ¬ë ìê°ì ì€ìŒ ì ììµëë€.
- í¥ìë ì¬ì©ì 겜í: ëì± ë°ìì±ìŽ ì¢ê³ ëíí ì í늬ìŒìŽì ì í¹í ì°ê²° ìëê° ë늬거ë ì¥ì¹ ì±ë¥ìŽ ë®ì ì¬ì©ìì ê²œì° ë ëì ì¬ì©ì 겜íìŒë¡ ìŽìŽì§ëë€.
- í¥ìë SEO: ë¡ë© ìê°ìŽ ë¹ ë¥Žë©Ž ì¹ì¬ìŽížì ê²ì ìì§ ìì륌 ëìŒ ì ììµëë€.
- ìµì íë 늬ìì€ ìë¹: ë ì€ìí 컎í¬ëížì íìŽëë ìŽì ì ì°êž°íì¬ íŽëŒìŽìžíž ì¥ì¹ì ìŽêž° CPU ë¡ë륌 ì€ìŒ ì ììµëë€.
ì íì íìŽëë ìŽì 구í: ì€ì ìì
React ì í늬ìŒìŽì ìì ì íì íìŽëë ìŽì ì 구ííë ë°©ë²ì ëí ëª ê°ì§ ì€ì ìì 륌 ìŽíŽë³Žê² ìµëë€.
1. React.lazy ë° Suspense륌 ì¬ì©í ì§ì° íìŽëë ìŽì
React.lazy륌 ì¬ì©í멎 컎í¬ëížë¥Œ ëì ìŒë¡ ê°ì žì¬ ì ììµëë€. ìŠ, ì€ì ë¡ íìí ëë§ ë¡ëë©ëë€. ìŽë Suspenseì ê²°í©íì¬ ì»Ží¬ëížê° ë¡ëëë ëì íŽë°± UI륌 íìí ì ììµëë€.
ì:
import React, { Suspense, lazy } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
function MyComponent() {
return (
Some important content
Loading... }>
ìŽ ìì ìì LazyComponentë Suspense ê²œê³ ëŽìì ë ëë§ë ëë§ ë¡ëë©ëë€. ì¬ì©ìë 컎í¬ëížê° ë¡ëëê³ íìŽëë ìŽì
ë ëê¹ì§ "Loading..." íŽë°± UI륌 ë³Žê² ë©ëë€.
êžë¡ë² êŽì : ìŽ ì ê·Œ ë°©ìì ì§ìë³ ìœí ìž ë¥Œ íìíê±°ë ì¬ì©ì ìì¹ì ë°ëŒ ìëµ ìê°ìŽ ë¬ëŒì§ ì ìë ìžë¶ APIê° íìí 컎í¬ëížì í¹í ì ì©í©ëë€. ìŽë¬í 컎í¬ëížì ë¡ë© ë° íìŽëë ìŽì ì íìí ëê¹ì§ ì°êž°í멎 ìì¹ì êŽê³ììŽ ëªšë ì¬ì©ìì ìŽêž° ë¡ë© ìê°ì ê°ì í ì ììµëë€.
2. ì¬ì©ì ì ì í ì ì¬ì©í ì¡°ê±Žë¶ íìŽëë ìŽì
ì¬ì©ì ì ì í ì ìì±íì¬ í¹ì êž°ì€ì ë°ëŒ 컎í¬ëížë¥Œ 조걎ë¶ë¡ íìŽëë ìŽì í ì ììµëë€. ì륌 ë€ìŽ ë·°í¬ížì íìë ëë§ ì»Ží¬ëížë¥Œ íìŽëë ìŽì í ì ììµëë€.
ì:
import React, { useState, useEffect, useRef } from 'react';
function useInView(ref) {
const [isInView, setIsInView] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
setIsInView(entry.isIntersecting);
},
{ threshold: 0.1 }
);
if (ref.current) {
observer.observe(ref.current);
}
return () => {
if (ref.current) {
observer.unobserve(ref.current);
}
};
}, [ref]);
return isInView;
}
function MyComponent() {
const ref = useRef(null);
const isInView = useInView(ref);
return (
Some content
{isInView && }
);
}
export default MyComponent;
ìŽ ìì ìì InteractiveComponentë ë·°í¬ížì íìë ëë§ ë ëë§ëê³ íìŽëë ìŽì
ë©ëë€. ìŽë íŽë ìë ëë ì¬ì©ììê² ìŠì íìëì§ ìë ììì ìë 컎í¬ëížì ì ì©í ì ììµëë€.
êžë¡ë² êŽì : íží°ì ìžìŽ ì íêž°ê° ìë ì¹ì¬ìŽížë¥Œ ê³ ë €íììì€. ì¡°ê±Žë¶ íìŽëë ìŽì ì ì¬ì©í멎 ì¬ì©ìê° íží°ë¡ ì€í¬ë¡€í ëë§ ìžìŽ ì íêž° 컎í¬ëížë¥Œ íìŽëë ìŽì í ì ììµëë€. ìŽë ìë§ì ìžìŽ ìµì ìŒë¡ ì ìžê³ ì¬ì©ì륌 ëììŒë¡ íë ì¹ì¬ìŽížì í¹í ì ì©í©ëë€. ìŽë 몚ë ì¬ì©ììê² ìŠì êŽë šìŽ ìì ì ìë 컎í¬ëížì ë¶íìí íìŽëë ìŽì ì ë°©ì§íêž° ë묞ì ëë€.
3. ëª ìì ì ìŽë¥Œ ì¬ì©í ì°ì ììê° ì§ì ë íìŽëë ìŽì
ë ë³µì¡í ìë늬ì€ì ê²œì° ì»Ží¬ëížë¥Œ íìŽëë ìŽì íë ìì륌 ëª ìì ìŒë¡ ì ìŽíŽìŒ í ì ììµëë€. ìŽë ì¬ì©ì ì ì ë ŒëŠ¬ë¥Œ ì¬ì©íì¬ íìŽëë ìŽì íë¡ìžì€ë¥Œ êŽëЬíì¬ ë¬ì±í ì ììµëë€.
ì:
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [hydratedComponents, setHydratedComponents] = useState([]);
const componentsToHydrate = [
'Header',
'MainContent',
'Footer',
];
useEffect(() => {
const hydrateNextComponent = () => {
if (hydratedComponents.length < componentsToHydrate.length) {
const nextComponent = componentsToHydrate[hydratedComponents.length];
// Simulate hydration delay
setTimeout(() => {
setHydratedComponents([...hydratedComponents, nextComponent]);
}, 500);
}
};
hydrateNextComponent();
}, [hydratedComponents]);
return (
{hydratedComponents.includes('Header') ? : Loading Header...
}
{hydratedComponents.includes('MainContent') ? : Loading MainContent...
}
{hydratedComponents.includes('Footer') ? : Loading Footer...
}
);
}
export default MyComponent;
ìŽ ìì ìì 컎í¬ëížë componentsToHydrate ë°°ìŽì ì ìë í¹ì ììë¡ íìŽëë ìŽì
ë©ëë€. ìŽë¥Œ íµíŽ í€ë ëë 죌ì ìœí
ìž ì ê°ì ì€ì 컎í¬ëížì íìŽëë ìŽì
ì íží°ì ê°ì ë ì€ìí 컎í¬ëížë³Žë€ 뚌ì ì°ì ìì륌 ì§ì í ì ììµëë€.
êžë¡ë² êŽì : ì ìžê³ ì¬ì©ì륌 ëììŒë¡ íë ì ì ìê±°ë ì¹ì¬ìŽížë¥Œ ììíŽ ë³Žììì€. ì¬ì©ìì ì§ì곌 êŽë šë í목ì íìíë ì í 칎íë¡ê·ž 컎í¬ëížë ì§ëЬì ìì¹ ë°ìŽí°ë¥Œ êž°ë°ìŒë¡ íìŽëë ìŽì ì°ì ììê° ì§ì ë ì ììµëë€. ìŽë ê² í멎 ì¬ì©ì 늬뷰 ëë ìì 믞ëìŽ íŒëì ê°ì íìŽì§ì ë€ë¥ž ë¶ë¶ìŽ ëì€ì íìŽëë ìŽì ëëëŒë ì¬ì©ìê° êŽë š ì íì ë¹ ë¥Žê² ë³Œ ì ììµëë€.
곌ì ë° ê³ ë € ì¬í
ì íì íìŽëë ìŽì ì ìë¹í ìŽì ì ì ê³µíì§ë§ 구í곌 êŽë šë 곌ì ì ê³ ë € ì¬íì ìììŒ í©ëë€.
- ë³µì¡ì±: ì íì íìŽëë ìŽì ì 구íí멎 í¹í í¬ê³ ë³µì¡í ì í늬ìŒìŽì ì ê²œì° ìœëë² ìŽì€ì ë³µì¡ì±ìŽ ì¶ê°ë ì ììµëë€.
- í ì€íž: ì íì íìŽëë ìŽì ì íì±íí ìíìì ì í늬ìŒìŽì ìŽ ì¬ë°ë¥Žê² ìëíëì§ íìžíë €ë©Ž ì² ì í í ì€ížê° ì€ìí©ëë€. ì ì¬ì ìž ë¬žì 륌 ìë³íêž° ìíŽ ë€ìí ìë늬ì€ì ì¬ì©ì ìíž ìì©ì í ì€ížíŽìŒ í©ëë€.
- ëë²ê¹ : ì íì íìŽëë ìŽì 곌 êŽë šë 묞ì 륌 ëë²ê¹ íë ê²ì ìŽë €ìž ì ììµëë€. ìŽë 컎í¬ëížê° íìŽëë ìŽì ëë ììì ìë¡ ìíž ìì©íë ë°©ìì ìŽíŽíŽìŒ íêž° ë묞ì ëë€.
- ì ì¶©ì : ì±ë¥ê³Œ ë³µì¡ì± ì¬ìŽìë íì ì ì¶©ì ìŽ ììµëë€. ì íì íìŽëë ìŽì ì ìŽì ì ì¶ê°ë ë³µì¡ì± ë° ì ì§ êŽëЬ ì€ë²í€ëì ì ì€íê² ë¹êµíŽìŒ í©ëë€.
ì íì íìŽëë ìŽì ì ìí ëªšë² ì¬ë¡
ì íì íìŽëë ìŽì ì íšê³Œì ìŒë¡ 구ííë €ë©Ž ë€ì ëªšë² ì¬ë¡ë¥Œ ê³ ë €íììì€.
- ì€ì 컎í¬ëíž ìë³: ìŽêž° ì¬ì©ì ìíž ìì©ì ê°ì¥ ì€ìí 컎í¬ëížë¥Œ ìë³íê³ íŽë¹ 컎í¬ëížì íìŽëë ìŽì ì°ì ìì륌 ì§ì í©ëë€.
- ì±ë¥ ìž¡ì : ì±ë¥ 몚ëí°ë§ ë구륌 ì¬ì©íì¬ ì íì íìŽëë ìŽì ìŽ ì í늬ìŒìŽì ì±ë¥ì 믞ì¹ë ìí¥ì ìž¡ì í©ëë€. ìŽë íìŽëë ìŽì íë¡ìžì€ë¥Œ ì¶ê°ë¡ ìµì íí ì ìë ììì ìë³íë ë° ëììŽ ë©ëë€.
- ì² ì í í ì€íž: ì íì íìŽëë ìŽì ì íì±íí ìíìì ì í늬ìŒìŽì ìŽ ë€ìí ìë늬ì€ì ë€ìí ì¥ì¹ìì ì¬ë°ë¥Žê² ìëíëì§ íìžíêž° ìíŽ ì² ì í í ì€íží©ëë€.
- ì ê·Œ ë°©ì 묞ìí: ë€ë¥ž ê°ë°ìê° ìŽíŽíê³ ì ì§ êŽëЬíêž° ìœëë¡ ì íì íìŽëë ìŽì ì ëµ ë° êµ¬í ìžë¶ ì 볎륌 묞ìíí©ëë€.
- ì ì§ì ê°ì : JavaScriptê° ë¹íì±íëìê±°ë ë¡ëì ì€íší ê²œì° ì í늬ìŒìŽì ìŽ ì ìì ìŒë¡ ì íëëë¡ í©ëë€. ìŽë ì°ê²° ìëê° ë늬거ë 구í ì¥ì¹ë¥Œ ì¬ì©íë ì¬ì©ììê² í¹í ì€ìí©ëë€.
ë구 ë° ëŒìŽëžë¬ëЬ
ëª ê°ì§ ë구 ë° ëŒìŽëžë¬ëŠ¬ë¥Œ ì¬ì©í멎 React ì í늬ìŒìŽì ìì ì íì íìŽëë ìŽì ì 구ííë ë° ëììŽ ë ì ììµëë€.
- React.lazy ë° Suspense: ì§ì° ë¡ë© ë° íŽë°± UI íì륌 ìí ëŽì¥ React êž°ë¥ì ëë€.
- Intersection Observer API: ììê° ë·°í¬ížì ë€ìŽê°ê±°ë ëê° ë륌 ê°ì§íêž° ìí ëžëŒì°ì APIì ëë€.
- íì¬ ëŒìŽëžë¬ëЬ:
react-intersection-observerì ê°ì ëŒìŽëžë¬ëЬë Intersection Observer API ì¬ì© íë¡ìžì€ë¥Œ ê°ìíí ì ììµëë€. - ì±ë¥ 몚ëí°ë§ ë구: Google Lighthouse, WebPageTest ëë Chrome DevToolsì ê°ì ë구륌 ì¬ì©íì¬ ì í늬ìŒìŽì ì ì±ë¥ì ìž¡ì íê³ ê°ì ììì ìë³í©ëë€.
ê²°ë¡
React ì íì íìŽëë ìŽì ì í¹í ìë² ì¬ìŽë ë ëë§(SSR)ì ì¬ì©íë React ì í늬ìŒìŽì ì ì±ë¥ì ìµì ííë ê°ë ¥í êž°ì ì ëë€. 컎í¬ëíž íìŽëë ìŽì ì°ì ìì륌 ì ëµì ìŒë¡ ì§ì í멎 ìŽêž° ë¡ë© ìê°ì í¬ê² ê°ì íê³ ìžì§ë ì±ë¥ì í¥ììí€ë©° 늬ìì€ íì©ë¥ ì ìµì íí ì ììµëë€. ì íì íìŽëë ìŽì ì 구íí멎 ìœëë² ìŽì€ì ë³µì¡ì±ìŽ ì¶ê°ë ì ìì§ë§ ì¬ì©ì 겜í곌 ì±ë¥ 잡멎ìì ì ê³µíë ìŽì ì ë§ì ì í늬ìŒìŽì ìì í¬ìí ê°ì¹ê° ììµëë€. 곌ì 륌 ì ì€íê² ê³ ë €íê³ ëªšë² ì¬ë¡ë¥Œ ë°ë¥Žë©Ž ì íì íìŽëë ìŽì ì íšê³Œì ìŒë¡ íì©íì¬ ì ìžê³ ì¬ì©ììê² ë ë¹ ë¥Žê³ ìëµì±ìŽ ë°ìŽë ì¹ ì í늬ìŒìŽì ì ì ê³µí ì ììµëë€.
ì¹ ê°ë°ìŽ ê³ì ë°ì íšì ë°ëŒ ì íì íìŽëë ìŽì ë° ì ì¬í ì±ë¥ ìµì í êž°ì ì ë°ìŽë ì¬ì©ì 겜íì ì ê³µíê³ êžë¡ë² ëì§íž í겜ìì 겜ìë ¥ì ì ì§íë ë° ì ì ë ì€ìíŽì§ ê²ì ëë€. ìŽë¬í êž°ì ì ìì©íê³ ì í늬ìŒìŽì ì±ë¥ì ê°ì íë ë°©ë²ì ì§ìì ìŒë¡ 몚ìíë ê²ì ì€ëë ë¹ ë¥Žê² ë³ííë ì¹ í겜ìì ì±ê³µíë ë° ë§€ì° ì€ìí©ëë€.