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

ํŠน์„ฑESMCommonJS
๋ฌธ๋ฒ•import/exportrequire()/module.exports
๋กœ๋”ฉ๋น„๋™๊ธฐ (๋ธŒ๋ผ์šฐ์ € ์ตœ์ ํ™”)๋™๊ธฐ (์„œ๋ฒ„ ์ตœ์ ํ™”)
์ •์  ๋ถ„์„๊ฐ€๋Šฅ (tree-shaking ์ง€์›)๋ถˆ๊ฐ€
๋ธŒ๋ผ์šฐ์ € ์ง€์›๋„ค์ดํ‹ฐ๋ธŒ๋ฒˆ๋“ค๋Ÿฌ ํ•„์š”
ํ™˜๊ฒฝ๋ธŒ๋ผ์šฐ์ € + Node.js์ฃผ๋กœ Node.js

Vite์—์„œ ESM์ด ์ค‘์š”ํ•œ ์ด์œ : Vite๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ Native ESM์„ ํ™œ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ on-demand๋กœ ์š”์ฒญํ•˜๊ฒŒ ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€๋น„ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ์›๋ฆฌ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ