<aside> πŸ’‘

처음 JavaScriptλŠ” λͺ¨λ“ˆμ„ κ°€μ Έμ˜€κ±°λ‚˜ λ‚΄λ³΄λ‚΄λŠ” 방법이 μ—†μ–΄, ν•˜λ‚˜μ˜ νŒŒμΌμ— λͺ¨λ“  κΈ°λŠ₯듀이 λ“€μ–΄κ°€μ•Ό ν–ˆλ‹€. CJS, AMD, UMD, ESM이 λ“±μž₯ν•œ μ΄ν›„μ—λŠ” λͺ¨λ“ˆλ‘œ κ°œλ°œν•˜κ³  배포할 수 있게 λ˜μ—ˆλ‹€.

</aside>

1. CJS (CommonJS)


μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ„œλ²„μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 큰 이유 쀑 ν•˜λ‚˜λŠ” λͺ¨λ“ˆν™”κ°€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ˆν™” λͺ…μ„Έλ₯Ό λ§Œλ“  λŒ€ν‘œμ μΈ κ·Έλ£Ή 쀑 'CommonJS'κ°€ 있고, 이 CommonJS의 λͺ…μ„Έκ°€ ν˜„μž¬ Node.js의 ν‘œμ€€μ΄ λ˜μ–΄μžˆλ‹€.

Node.js ν‘œμ€€(CommonJS의 λͺ…μ„Έ)이 require와 module.exports이닀.

// require을 톡해 package/lib λͺ¨λ“ˆμ„ λ³€μˆ˜μ— 담을 수 μžˆλ‹€.
const lib = require('package/lib');

function foo() {
  lib.log('hello world!');
}

// foo ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ νŒŒμΌμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λͺ¨λ“ˆλ‘œ μΆ”μΆœν•œλ‹€.
exports.foobar = foo;

CJS의 κ°€μž₯ 큰 νŠΉμ§•μ€ λ™κΈ°μ μœΌλ‘œ λ™μž‘ν•œλ‹€λŠ” 점이닀. require 호좜이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°€μ§€ μ•ŠλŠ”λ‹€. μ„œλ²„ ν™˜κ²½μ—μ„œλŠ” 파일 μ‹œμŠ€ν…œμ—μ„œ λͺ¨λ“ˆμ„ μ½μ–΄μ˜€λŠ” I/Oκ°€ λΉ λ₯΄κΈ° λ•Œλ¬Έμ— 이 방식이 μ‹€μš©μ μ΄μ§€λ§Œ, λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” λ„€νŠΈμ›Œν¬λ₯Ό 톡해 νŒŒμΌμ„ 가져와야 ν•˜λ―€λ‘œ 동기 방식이 λΈ”λ‘œν‚Ήμ„ 일으켜 μ ν•©ν•˜μ§€ μ•Šλ‹€.

// λ™κΈ°μ μœΌλ‘œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λœλ‹€.
const foo = require('foo');
const bar = require('bar');

foo.log('It is foo');
bar.log('It is bar');

그런데 ES6둜 λ„˜μ–΄μ˜€λ©΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ μžμ²΄μ—μ„œ ES6 Moduleμ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ λͺ¨λ“ˆν™”λ₯Ό μ§€μ›ν•˜κΈ° μ‹œμž‘ν–ˆκ³ , 이것이 λ°”λ‘œ import와 export이닀.

2. ESM (ECMAScript Module)


ES6(ES2015)에 μžλ°”μŠ€ν¬λ¦½νŠΈ 곡식 λͺ¨λ“ˆ κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€. ESM은 ECMAScript ν‘œμ€€μ— ν¬ν•¨λœ λͺ¨λ“ˆ μ‹œμŠ€ν…œμœΌλ‘œ, λΈŒλΌμš°μ €μ™€ Node.js λͺ¨λ‘μ—μ„œ κ³΅μ‹μ μœΌλ‘œ μ§€μ›ν•œλ‹€.

import lib from 'package/lib';

function foo() {
  lib.log('hello world!');
}

export { foo as foobar };

2-1) export vs export default

export와 export defaultλŠ” λͺ¨λ“ˆμ—μ„œ 값을 λ‚΄λ³΄λ‚΄λŠ” 두 κ°€μ§€ 방식이닀.

named export (export) λŠ” ν•˜λ‚˜μ˜ νŒŒμΌμ—μ„œ μ—¬λŸ¬ 값을 내보낼 수 있으며, κ°€μ Έμ˜¬ λ•ŒλŠ” λ°˜λ“œμ‹œ {}둜 감싸고 내보낸 이름과 λ™μΌν•˜κ²Œ 써야 ν•œλ‹€. as ν‚€μ›Œλ“œλ‘œ aliasλ₯Ό 쀄 수 μžˆλ‹€.

// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;

// main.js
import { add, subtract } from './math.js';
import { add as plus } from './math.js'; // alias μ‚¬μš©

default export (export default) λŠ” νŒŒμΌλ‹Ή ν•˜λ‚˜λ§Œ μ‚¬μš©ν•  수 있으며, κ°€μ Έμ˜¬ λ•Œ {}κ°€ ν•„μš” μ—†κ³  μž„μ˜μ˜ μ΄λ¦„μœΌλ‘œ 받을 수 μžˆλ‹€.

// calculator.js
export default function calculate(a, b) {
  return a + b;
}

// main.js
import calc from './calculator.js';       // 이름 자유둭게 μ§€μ • κ°€λŠ₯
import myCalc from './calculator.js';     // 이것도 λ™μΌν•˜κ²Œ λ™μž‘