๐ 1...2...3... ์๋ ...
๊ตฌ๊ธ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด 3์ด ์ด์ ์น์ฌ์ดํธ๊ฐ ์ง์ฐ๋๋ฉด 53%๊ฐ ๋ ๋๊ฐ๋ค๋ ํต๊ณ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ต์ ํ๋ ์ ๋ง ์ค์ํ๋ค. ์น์ฌ์ดํธ์ ์ต์ ํ๋ฅผ ์ํด ์ฝ๋์คํ๋ฆฌํ ์ด ์ฌ์ฉ๋๋๋ฐ ์ด๋ค ๊ธฐ์ ์ธ์ง ์์๋ณด์!
How mobile latency impacts publisher revenue - Think with Google
As people’s expectations for mobile experiences have grown, simply loading on a mobile device is no longer enough; mobile sites must be fast and relevant. Learn why.
www.thinkwithgoogle.com
๐ ์ฝ๋์คํ๋ฆฌํ (CodeSplitting)๋?
์ฝ๋ ์คํ๋ฆฌํ (Code Splitting)์ ์ฃผ๋ก ์น ๊ฐ๋ฐ์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ผ๋ก,
ํฐ JavaScript ํ์ผ์ ์ฌ๋ฌ ์์ ์ฒญํฌ(chunks)๋ ๋ฒ๋ค(bundles)๋ก ๋๋์ด์ ํ์ํ ๋๋ง ๋ก๋ํ๋ ๋ฐฉ์์ ๋งํ๋ค.
์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ด๊ณ , ์ฌ์ฉ์ ๊ฒฝํ์ ์ข๊ฒ ๋ง๋ ๋ค.
์ฆ ์ฌ์ด์ฆ๊ฐ ๋๋ฌด ํฌ๋๊น ๋๋ ์ ํ์ํ ๋ ํ์ํ ๊ฒ๋ง ๊บผ๋ด์ฐ๊ฒ ๋ค๋ ์๋ฏธ.
์ผ๋ฐ์ ์ผ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์ (Javascript,css,html ๋ฑ)์ ์น๋ธ๋ผ์ฐ์ ์์ ๋๋๋งํ ๋ ํ๋์ bundle๋ก ๋ฌถ์ด์ ๋ก๋ํ๋ค. ํ๋ก์ ํธ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋ฉด bundle์ ์ฉ๋์ด ์ปค์ง๊ณ ์ต์ด ๋๋๋ง ์ ๋ฆ๊ฒ ๋ก๋๊ฐ ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์์๊ฒ ๋ฆ๊ฒ ๋ก๋๋๊ณ ์์ค์ปฌ๋ ์ดํฐ๋ ๊ฑธ์ด๋ค๋๋ ํ๊ตญ์ธ์๊ฒ ์ฐธ์ ์ ์๋ ๋จ์ ์ธ ๊ฒ...! ๋ฐ๋ผ์ ๋๋ํ ์ฌ๋๋ค์ด ๋จ์ ์ ๋ณด์ํ๋๋ก ๋ง๋ ๊ธฐ์ ์ด ์ฝ๋ ์คํ๋ฌํ ์ด๋ค
โญ๏ธ CodeSplitting ๋ฐฉ๋ฒ
codesplitting์ ํ๊ธฐ ์ํด์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
์ด ์ค์์ React.lazy( ) ์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํ๋ค.
React.lazy() & Suspense
React.Lazy ์ Suspense ๋ React v16.6 ๋ถํฐ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก React.Lazy ์ ๊ฒฝ์ฐ Component ๋ฅผ rendering ํ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ฉ ํ๊ฒ ํด์ฃผ๋ ํจ์ ์ด๋ค.
import React, { lazy } from 'react';
const Article = lazy(()=>import('@layouts/Article'))
- lazy๋ฅผ import ํด์ฃผ๊ณ codeSplittingํ component๋ฅผ ํจ์๋ก ๋ง๋ค์ด์ค๋ค.
function App() {
return (
<Suspense fallback={<p>๋ก๋ฉ์ค...</p>}>
<Article></Article>
</Suspense>
);
}
- Suspense๋ codesplitting๋์ด ๋ก๋๋์ง ์์ component๋ฅผ ๋ก๋ํ ๋ ์ฌ์ฉ๋๋ค. fallback๋ฅผ ์ฌ์ฉํ๋ฉฐ component๊ฐ ์์ง ๋ก๋ ๋์ง ์์์ ๋ UI๋ฅผ custom ํ ์ ์๋ค.
//codesplitting ์ฌ์ฉํ ์ ์ฒด์ฝ๋ (App.jsx)
import React, { Suspense, lazy } from 'react';
const Article = lazy(()=>import('@layouts/Article'))
function App() {
return (
<Suspense fallback={<p>๋ก๋ฉ์ค...</p>}>
<Article></Article>
</Suspense>
);
}
export default App;
//codeSplitting ์ฌ์ฉ์ํ ์ฝ๋
import React from 'react';
import Article from '@layouts/Article';
function App() {
return (
<div>
<Article></Article>
</div>
);
}
export default App;
๐ผ ๊ฒฝ๋ก๊ธฐ๋ฐ CodeSplitting (Route ์ฌ์ฉ)
๊ทธ๋ ๋ค๋ฉด CodeSplitting์ ์ด๋์ ์ ์ฉ์ํฌ์ง ๊น๋ค๋ก์ธ ์ ์๋ค. ๋ฐ๋ผ์ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก CodeSplitting์ ํ๋ ๊ฒ. React์์ Route๋ฅผ ํ์ฉํ์ฌ ํ์ด์ง ์ ์์ ํ๋๋ฐ ์ด ๋ codeSplitting์ ์ ์ฉ์ํจ๋ค. ์๋๋ ๋ผ์ฐํธ ๊ธฐ๋ฐ codeSplitting ์์์ด๋ค.
import React, { Suspense, lazy } from 'react';
import { Routes, Route } from 'react-router-dom';
const Article = lazy(()=>import('@layouts/Article'))
const Login = lazy(()=>import('@pages/login'))
const Post = lazy(()=>import('@pages/post'))
function App() {
return (
<Suspense fallback={<p>๋ก๋ฉ์ค...</p>}>
<Routes>
<Route path='/' element={<Article/>}></Route>
<Route path='/post' element={<Post/>}></Route>
<Route path='/login' element={<Login/>}></Route>
</Routes>
</Suspense>
);
}
export default App;
๐ CodeSplitting ์ ๊ณผ ํ ๋น๊ต
๊ฒฝ๋ก ๊ธฐ๋ฐ CodeSplitting์ ์ฌ์ฉํ ๋์ ์ํ ๋, localhost:3000/์ผ๋ก ์ ์ ์ ์ด๋ค ํ์ผ์ด ๋ก๋๋๋์ง ํ์ธํ ๊ฒฐ๊ณผ์ด๋ค
- ์ผ์ชฝ: codesplitting โ => src์ ๋ชจ๋ ํ์ผ๋ค(layouts,pages ๋ฑ)์ด ํ๋ฒ์ ๋ค ๋ก๋๋๋ ๊ฒ์ ๋ณผ ์ ์์
- ์ค๋ฅธ์ชฝ: codesplitting โญ๏ธ => codesplitting์ ํ๊ธฐ ๋๋ฌธ์ Article ํ์ผ๋ง ๋ก๋๋ ๊ฒ์ ๋ณผ ์ ์์.
๐ ๋ง์น๋ฉฐ...
CodeSplitting๋ ์ฑ๋ฅ์ต์ ํ์ ๊ด๋ จ๋ ๊ธฐ์ ์ด๋ค. ๊ฐ๋ฐ๊ณผ์ ์์ ๋ชจ๋ ๊ฒ์ ๊ณ ๋ คํ์ฌ ๊ฐ๋ฐํ๊ธฐ๋ณด๋ค๋ ๋ง๋ฌด๋ฆฌ ๋จ๊ณ์์ ์ฑ๋ฅ์ ํ ์คํธํ๋ ๊ณผ์ ์์ ์ ์ฉ์ํค๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ๋ฉฐ ๋ง์น๋ค.
์ฐธ๊ณ
https://react-ko.dev/reference/react/lazy
lazy – React
The library for web and native user interfaces
react-ko.dev
'frontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ์ญ์ํ๊ด๋ฆฌ๋ ๋ญ๊ฐ์ข์๊น?(Redux,Zustand,Mobx) (0) | 2024.04.19 |
---|---|
๋ ์ง์ ์๊ฐ ํฌ๋งท ์ปค์คํ ํ๊ธฐ :Day.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ (1) | 2024.02.14 |
path ๊น๋ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ (0) | 2024.02.05 |
์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ : Socket.io (0) | 2024.01.09 |
Return ๋ฌธ์ Hook ์๋์ชฝ์ ์์ด์ผํ๋ค :Hook ๊ท์น (2) | 2024.01.08 |