์ฒ์์๋ ํ์ด์ง ํ๋์ ์ฝ๋๊ฐ ๋ช๋ฐฑ ์ค๋ฐ์ ์์๋๋ฐ,
์ปดํฌ๋ํธ๊ฐ ๋ง์์ง๊ณ ๊ธฐ๋ฅ์ด ๋์ด๋๋ฉด ์ด๋ ์๊ฐ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ปค์ง๊ณ ๋ก๋ฉ์ด ๋๋ ค์ง๋ค.
์ด๋ด ๋ ์ฌ์ฉํ๋ ๊ฒ ๋ฐ๋ก ์ฝ๋ ์คํ๋ฆฌํ
(Code Splitting)๊ณผ Lazy Loading์ด๋ค.
์ด๋ฒ ๊ธ์ ์ฝ๋ ์คํ๋ฆฌํ
์ด ์ ํ์ํ์ง, React์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง,
๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ์ ์ผ๋ง๋ ์ํฅ์ ์ฃผ๋์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ค.
์ฑ์ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฒ๋ค๋ก ๋๋๋ ๊ฒ
์ฌ์ฉ์๊ฐ ํ์ํ ์์ ์ ํ์ํ ์ฝ๋๋ง ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค.
์์ ์๋ ํ๋์ JS ํ์ผ๋ก ๋ชจ๋ ์ฑ์ ๋ฌถ์์ง๋ง,
์์ฆ์ ํ์ด์ง ๋จ์, ๋ผ์ฐํธ ๋จ์, ์ปดํฌ๋ํธ ๋จ์๋ก ๋๋ ์ ๋ก๋ฉํ๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ด ์ด๋ฃจ์ด์ง ์ฝ๋๋ค์ ํ์ํ ๋ ๋น๋๊ธฐ๋ก ๋ถ๋ฌ์ค๋ ๊ธฐ์ ์ด Lazy Loading์ด๋ค.
์ฆ, ์ฝ๋ ์คํ๋ฆฌํ
= ๋๋ ๋๊ธฐ,
Lazy Loading = ๋๋ ๋์ ๊ฑธ ์ํฉ์ ๋ฐ๋ผ ๋ถ๋ฌ์ค๊ธฐ
React.lazy
+ Suspense
import React, { Suspense } from 'react';
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
function App() {
return (
<Suspense fallback={<div>๋ก๋ฉ ์ค...</div>}>
<HeavyComponent />
</Suspense>
);
}
React.lazy()
๋ก ์ปดํฌ๋ํธ๋ฅผ ๋น๋๊ธฐ๋ก ๋ถ๋ฌ์ด<Suspense>
๋ก ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํด์ผ ํจnext/dynamic
import dynamic from 'next/dynamic';
const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
loading: () => <p>๋ก๋ฉ ์ค...</p>,
ssr: false, // SSR ์์ ์ ๋ก๋ฉํ์ง ์๊ฒ ์ค์ ๊ฐ๋ฅ
});
React.lazy
๋ณด๋ค ์ ์ฐํ๊ฒ ์ค์ ๊ฐ๋ฅ์ ์ฉ ์์น | ์ค๋ช |
---|---|
Modal, Dialog | ํ์์๋ ์ ์ฐ๋ค๊ฐ ํ์ํ ๋๋ง ๋์ |
Chart, Map | ์ด๊ธฐ์ ๋ถ๋ฌ์ฌ ํ์ ์์, ํด๋ฆญ ์ ๋ก๋ฉ |
๊ด๋ฆฌ์ ํ์ด์ง ๋์๋ณด๋ | ๋ผ์ฐํ ์ดํ์ ๋ถ๋ฌ์ค๋ฉด ๋จ |
3D ๋ ๋๋ง, PDF ๋ทฐ์ด ๋ฑ | ๋ฒ๋ค ์ฌ์ด์ฆ ํฐ ๊ฒฝ์ฐ โ ๋ถ๋ฆฌ ํ์ |
โ ๋์ ๋๋ ์ด๊ธฐ ๋ก๋ฉ ์๋ ํฅ์
โ ์ฌ์ฉ์ ์ฒด๊ฐ ์ฑ๋ฅ ์์น
React.lazy
๋ client-side only next/dynamic
์ฌ์ฉfallback
์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ข์ฐํจ โ ๋ก๋ฉ UI ๋์์ธ ์ค์์ฝ๋ ์คํ๋ฆฌํ
์ ์ฒ์์ โ๊ทธ๋ฅ ์ฝ๋ ๋๋๋ ๊ฑฐ์ง ๋ญโ ์์ค์ผ๋ก ๋ดค๋๋ฐ,
์ค์ ๋ก ๋ํ ํ๋ก์ ํธ์์ ์ด๊ธฐ ๋ก๋ฉ ์๋ ์ฐจ์ด๊ฐ 3์ด ์ด์ ๋๋ ๊ฑธ ๋ณด๊ณ ํ ์ฒด๊ฐํ๋ค.
ํนํ Next.js์์๋ ํ์ด์ง ๋จ์๋ก ์๋ ์คํ๋ฆฌํ
๋ ๋๋๊น
๋ ์ ๊ทน์ ์ผ๋ก dynamic()
์ ํ์ฉํ๊ฒ ๋๋ค.
๐ "์ฌ์ฉ์๋ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๋ ์ฑ์ ์ํ๊ณ ,
๊ทธ๊ฑด ์ฝ๋๋ฅผ ๋๋ํ๊ฒ ๋๋๋ ๋ฐ์ ์์๋๋ค."