π‘ Ref: https://velog.io/@velopert/react-code-splitting#1-μ§μ§-κΈ°λ³Έμ μΈ-μ½λ-μ€ν리ν
μ½λ μ€ν리ν ?
리μ‘νΈ μμμ μ½λ μ€ν리ν ? From gpt
리μ‘νΈ μ½λ μ€ν리ν μ μ ν리μΌμ΄μ μ JavaScript μ½λλ₯Ό λ μμ μ²ν¬λ‘ λΆν νμ¬ νμν λ λμ μΌλ‘ λ‘λνλ κΈ°μ μ λλ€. μ΄λ₯Ό ν΅ν΄ μ΄κΈ° λ²λ€ ν¬κΈ°λ₯Ό μ€μ΄κ³ νμ΄μ§ λ‘λ© μλλ₯Ό ν₯μμν¬ μ μμ΅λλ€.
μΌλ°μ μΌλ‘ 리μ‘νΈ μ ν리μΌμ΄μ μ νλμ λ²λ€ νμΌμ λͺ¨λ JavaScript μ½λκ° ν¬ν¨λμ΄ μμ΅λλ€. κ·Έλ¬λ ν° κ·λͺ¨μ μ ν리μΌμ΄μ μ κ²½μ° μ΄ λ²λ€ νμΌμ ν¬κΈ°κ° μ»€μ Έ μ΄κΈ° λ‘λ© μκ°μ΄ μ¦κ°νκ² λ©λλ€. μ½λ μ€ν리ν μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μ¬λ¬ κ°μ μμ μ²ν¬λ‘ λΆν ν μ μμ΅λλ€.
λΆν λ μ²ν¬λ κ°κ°μ κΈ°λ₯ λλ λΌμ°νΈμ μ°κ΄λμ΄ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° νΉμ νμ΄μ§λ‘ μ΄λν λ ν΄λΉ νμ΄μ§μ νμν μ½λλ§ λμ μΌλ‘ λ‘λλ©λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ μ¬μ©μκ° μ ν리μΌμ΄μ μ μ μν λ νμνμ§ μμ μ½λλ₯Ό λΆλ¬μ€μ§ μμλ λλ―λ‘ μ΄κΈ° λ‘λ© μλκ° ν₯μλ©λλ€.
리μ‘νΈ μ½λ μ€ν리ν μ **React.lazy()**μ **Suspense**λ₯Ό μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. React.lazy() ν¨μλ λμ μΌλ‘ λΆλ¬μ¬ μ»΄ν¬λνΈλ₯Ό μ μνλ λ° μ¬μ©λλ©°, Suspense μ»΄ν¬λνΈλ λμ μΌλ‘ λ‘λλλ μ»΄ν¬λνΈλ₯Ό λκΈ°νκ³ λ‘λ© μνλ₯Ό μ²λ¦¬νλ λ° μ¬μ©λ©λλ€.
κ°λ¨ν μμλ₯Ό ν΅ν΄ μ½λ μ€ν리ν μ μ΄ν΄ν΄ λ³΄κ² μ΅λλ€:
import React, { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
const App = () => {
return (
<div>
<h1>My React App</h1>
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
</div>
);
};
export default App;
μ°Έκ³ ) lazy, suspenseλ₯Ό μ¬μ©νλκ² μλ μΌλ° μ½λ μ€ν리ν
import React, { Component } from 'react';
class App extends Component {
state = {
SplitMe: null
};
handleClick = () => {
import('./SplitMe').then(({ default: SplitMe }) => {
this.setState({
SplitMe
});
});
};
render() {
const { SplitMe } = this.state;
return (
<div>
<button onClick={this.handleClick}>Click Me</button>
{SplitMe && <SplitMe />}
</div>
);
}
}
export default App;
μμ μμμμ **LazyComponent**λ μ½λ μ€ν리ν μ μ μ©νκ³ μ νλ μ»΄ν¬λνΈμ λλ€. React.lazy() ν¨μλ₯Ό μ¬μ©νμ¬ ν΄λΉ μ»΄ν¬λνΈλ₯Ό λμ μΌλ‘ λ‘λν©λλ€. Suspense μ»΄ν¬λνΈλ **LazyComponent**κ° λ‘λ©λλ λμ λ‘λ© μνλ₯Ό μ²λ¦¬ν©λλ€.
μ΄λ κ² μ½λλ₯Ό μμ±νλ©΄ **LazyComponent**λ νμ΄μ§μ μ€μ λ‘ νμν μμ μμλ§ λ‘λλλ―λ‘ μ΄κΈ° λ‘λ© μκ°μ΄ μ€μ΄λ€κ² λ©λλ€.
리μ‘νΈ μ½λ μ€ν리ν μ μ£Όλ‘ λμ λ‘λ©, λΌμ°ν λλ μ¬μ©μ μ‘μ μ λ°λ₯Έ νμν μ»΄ν¬λνΈμ λ‘λ μμ μ μ‘°μ νλ λ° μ¬μ©λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ μ±λ₯μ μ΅μ ννκ³ μ¬μ©μ κ²½νμ κ°μ ν μ μμ΅λλ€.
μ½λ μ€ν리ν μ λ¬Έμ μ
SSR
μ»΄ν¬λνΈκ° SSRμμ λλλ§ λ λ, λ¬Έμμ΄ νμμΌλ‘ λλλ§μ΄ λλ€.
λ¬Έμμ΄ νμμ΄λΌ ν¨μ μλ μ½λλ₯Ό μ°Έκ³ νλ©΄ μ’μ λ― νλ€.
import React from 'react';
import ReactDOMServer from 'react-dom/server';
const App = () => {
return <h1>Hello, World!</h1>;
};
const html = ReactDOMServer.renderToString(<App />); <-- μλΆλΆ
console.log(html); // Output: <h1>Hello, World!</h1>
μ¦, λ¬Έμμ΄ νμμ HTML markup λ΄μ©λ§ μμ λΏμ΄λ€. λ°λΌμ λ¬Έμμ΄ νμμΌλ‘ λλλ§ λλ€λ κ²μ HTML markup λ΄μ©λ§ λλκ° λλ€λ κ²κ³Ό λμΌνλ€.
κ·Έλ κΈ° λλ¬Έμ, μ½λ μ€ν리ν μ μν dynamic importsμ μ€ν ν μκ° μλ€.
ν΄κ²°λ°©μ
- react-loadableμ μ¬μ©ν¨μΌλ‘μ¨, νμ΄μ§ λ‘λ©μ ν λ λΆν° μ²ν¬νμΌλ€μ λ€λ₯Έ μλ°μ€ν¬λ¦½νΈνμΌλ€κ³Ό λμΌν μμ μμ λ‘λ©μ μμ ν μ μμ΅λλ€.