ES Modules๋ JavaScript์ ๊ณต์ ํ์ค ๋ชจ๋ ์์คํ
์ด๋ค. import/export ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋
๋ฆฝ์ ์ธ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ณ , ํ์ํ ๊ธฐ๋ฅ๋ง ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- JavaScript๋ ์๋ ๋ชจ๋ ์์คํ ์ด ์์๋ค โ ๋ชจ๋ ์ฝ๋๊ฐ ์ ์ญ ์ค์ฝํ๋ฅผ ๊ณต์
- ์ฑ์ด ์ปค์ง๋ฉด์ ์ฝ๋ ๊ด๋ฆฌ, ์์กด์ฑ ๊ด๋ฆฌ, ๋ค์์คํ์ด์ค ์ถฉ๋ ๋ฌธ์ ๋ฐ์
- CommonJS(Node.js), AMD(RequireJS) ๋ฑ ๋นํ์ค ๋ชจ๋ ์์คํ ์ด ๋ฑ์ฅํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ์ง์ ๋ถ์ฌ
- ES2015์์
import/exportํ์คํ โ ํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ดํฐ๋ธ๋ก ์ง์
AS-IS (๋ชจ๋ ์์คํ ์๋ ์์ )
<!-- ์ ์ญ ์ค์ฝํ ์ค์ผ, ์์ ์์กด์ฑ, ์๋ ๊ด๋ฆฌ -->
<script src="jquery.js"></script>
<script src="lodash.js"></script>
<script src="app.js"></script>
<!-- app.js์์ $ ์ _ ๋ฅผ ์ ์ญ์ผ๋ก ์ ๊ทผ -->TO-BE (ES Modules)
// ๋ช
์์ ์์กด์ฑ, ์ค์ฝํ ๊ฒฉ๋ฆฌ, ์๋ ๊ด๋ฆฌ
import { debounce } from './utils.js';
import { render } from './dom.js';
export function App() { /* ... */ }ํต์ฌ ๋ฌธ๋ฒ
Named Export / Import
// math.js
export const PI = 3.14;
export function add(a, b) { return a + b; }
// main.js
import { PI, add } from './math.js';Default Export / Import
// Button.js
export default function Button() { /* ... */ }
// main.js
import Button from './Button.js';Dynamic Import (์ง์ฐ ๋ก๋ฉ)
button.addEventListener('click', async () => {
const { Chart } = await import('./Chart.js');
new Chart(data);
});๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ
<!-- type="module" ํ์ -->
<script type="module" src="main.js"></script>๋ชจ๋ ์คํฌ๋ฆฝํธ์ ํน์ง:
- ์๋ strict mode ์ ์ฉ
- ์๋ defer (DOM ํ์ฑ ํ ์คํ)
- ํ ๋ฒ๋ง ์คํ (์ค๋ณต ์ฐธ์กฐํด๋)
- ์์ฒด ์ค์ฝํ (์ ์ญ ์ค์ผ ์์)
ESM vs CommonJS
| ํน์ฑ | ESM | CommonJS |
|---|---|---|
| ๋ฌธ๋ฒ | import/export | require()/module.exports |
| ๋ก๋ฉ | ๋น๋๊ธฐ (๋ธ๋ผ์ฐ์ ์ต์ ํ) | ๋๊ธฐ (์๋ฒ ์ต์ ํ) |
| ์ ์ ๋ถ์ | ๊ฐ๋ฅ (tree-shaking ์ง์) | ๋ถ๊ฐ |
| ๋ธ๋ผ์ฐ์ ์ง์ | ๋ค์ดํฐ๋ธ | ๋ฒ๋ค๋ฌ ํ์ |
| ํ๊ฒฝ | ๋ธ๋ผ์ฐ์ + Node.js | ์ฃผ๋ก Node.js |
Vite์์ ESM์ด ์ค์ํ ์ด์ : Vite๋ ๊ฐ๋ฐ ์๋ฒ์์ Native ESM์ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ํ ๋ชจ๋๋ง on-demand๋ก ์์ฒญํ๊ฒ ํ๋ค. ์ด๊ฒ์ด ๊ธฐ์กด ๋ฒ๋ค๋ฌ ๋๋น ๋น ๋ฅธ ์๋ฒ ์์๊ณผ HMR์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ์๋ฆฌ๋ค.