CommonJS, ESModule 톺아보기 πŸ”Ž

우혁·2024λ…„ 6μ›” 23일
7

FE

λͺ©λ‘ 보기
3/11

λͺ¨λ“ˆ

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ  μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 λ§ν•œλ‹€.

일반적으둜 λͺ¨λ“ˆμ€ κΈ°λŠ₯을 κΈ°μ€€μœΌλ‘œ 파일 λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•œλ‹€. 이 λ•Œ λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜λ €λ©΄ λͺ¨λ“ˆμ€ μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„(λͺ¨λ“ˆ μŠ€μ½”ν”„)λ₯Ό κ°€μ§ˆ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ˜ μžμ‚°(λ³€μˆ˜, ν•¨μˆ˜, 객체 λ“±)은 기본적으둜 λΉ„κ³΅κ°œ μƒνƒœμ΄λ‹€. μΊ‘μŠν™”λ˜μ–΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Όν•  수 μ—†μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΆ„λ¦¬λ˜μ–΄ μ‘΄μž¬ν•œλ‹€.

λͺ¨λ“ˆμ€ κ³΅κ°œκ°€ ν•„μš”ν•œ μžμ‚°μ— ν•œμ •ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ export ν‚€μ›Œλ“œλ₯Ό 톡해 선택적 κ³΅κ°œκ°€ κ°€λŠ₯ν•˜λ‹€.

μ‚¬μš©μžλŠ” import ν‚€μ›Œλ“œλ₯Ό 톡해 λͺ¨λ“ˆμ΄ κ³΅κ°œν•œ μžμ‚°(export) 쀑 일뢀 λ˜λŠ” 전체λ₯Ό 선택해 μžμ‹ μ˜ μŠ€μ½”ν”„ λ‚΄λ‘œ λΆˆλŸ¬λ“€μ—¬ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ’‘ λͺ¨λ“ˆμ„ 톡해 μ½”λ“œμ˜ λ‹¨μœ„λ₯Ό λͺ…ν™•νžˆ λΆ„λ¦¬ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ성할 수 있고, μž¬μ‚¬μš©μ„±μ΄ μ’‹μ•„μ„œ 개발 νš¨μœ¨μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.


CommonJS

주둜 μ„œλ²„ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½, 특히 Node.jsμ—μ„œ μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œμ΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›Ή νŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ₯Ό λͺ©μ μœΌλ‘œ 생겨났닀.

μ΄λŸ¬ν•œ νƒœμƒμ  ν•œκ³„λ‘œ 인해 λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° 언어와 λΉ„κ΅ν–ˆμ„ λ•Œ λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 파일 μŠ€μ½”ν”„μ™€ import, exportλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•˜λ‹€.

πŸ”₯ ν΄λΌμ΄μ–ΈνŠΈ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” scriptνƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ‘œλ“œν•  수 μžˆμ§€λ§Œ νŒŒμΌλ§ˆλ‹€ 독립적인 파일 μŠ€μ½”ν”„λ₯Ό κ°–μ§€ μ•ŠλŠ”λ‹€.

// foo.js
var x = "foo";
console.log(window.x); // foo

// bar.js
// x λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜μ΄λ‹€. foo.js νŒŒμΌμ—μ„œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ x와 μ€‘λ³΅λœ 선언이닀.
var x = "bar";

// νŒŒμΌλ§ˆλ‹€ 독립적인 파일 μŠ€μ½”ν”„λ₯Ό κ°–μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— x의 값이 μž¬ν• λ‹Ήλ˜μ—ˆλ‹€.
console.log(window.x); // bar

μœ„μ™€ 같이 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ—¬λŸ¬ 개의 파일둜 λΆ„λ¦¬ν•˜μ—¬ scriptνƒœκ·Έλ‘œ λ‘œλ“œν•΄λ„ κ²°κ΅­ ν•˜λ‚˜μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 내에 μžˆλŠ” 것 처럼 λ™μž‘ν•œλ‹€.λ”°λΌμ„œ λΆ„λ¦¬λœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌλ“€μ˜ μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

κ²°κ΅­ μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ, 즉 λΈŒλΌμš°μ € ν™˜κ²½μ— κ΅­ν•œν•˜μ§€ μ•Šκ³  λ²”μš©μ μœΌλ‘œ μ‚¬μš©ν•˜λ €λŠ” μ›€μ§μž„μ΄ μƒκΈ°λ©΄μ„œ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ€ λ°˜λ“œμ‹œ ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” 핡심 κ³Όμ œκ°€ λ˜μ—ˆλ‹€.

μ΄λŸ¬ν•œ 배경듀을 톡해 μ„œλ²„ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ—μ„œλ„ λͺ¨λ“ˆκ³Ό 같은 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ CommonJSκ°€ νƒ„μƒν•˜μ˜€λ‹€!

CommonJS의 νŠΉμ§•

  • λͺ¨λ“ˆ μ •μ˜ 및 내보내기

    • λͺ¨λ“ˆμ€ module.exports 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 내보낼 수 μžˆλ‹€.
  • λͺ¨λ“ˆ κ°€μ Έμ˜€κΈ°

    • require ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“ˆμ„ 뢈러올 수 μžˆλ‹€.
  • 동기적 λ‘œλ”©

    • λͺ¨λ“ˆμ„ 뢈러올 λ•Œ 파일 μ‹œμŠ€ν…œμ΄λ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ ν•„μš”ν•˜λ©΄ ν•΄λ‹Ή μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ½”λ“œ 싀행이 블둝(block)λœλ‹€.
  • 캐싱

    • CommonJS의 λͺ¨λ“ˆμ€ ν•œ 번 λ‘œλ“œλ˜λ©΄ μΊμ‹œλœλ‹€. 같은 λͺ¨λ“ˆμ„ λ‹€μ‹œ requireν•˜λ©΄ μΊμ‹œλœ 버전을 λ°˜ν™˜ν•œλ‹€.

ESModule(ECMAScript Module)

μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€(ES6/ES2015)μ—μ„œ λ„μž…λœ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ΄λ‹€.
λΈŒλΌμš°μ €μ™€ μ„œλ²„ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈ(Node.js λ“±) ν™˜κ²½ λͺ¨λ‘μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

ESModule이 νƒ„μƒν•˜κΈ° μ „κΉŒμ§€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ €λ©΄ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE), AMD λ“±μ˜ λ°©μ‹μœΌλ‘œ ν‘œμ€€ν™”λœ 방식이 μ•„λ‹Œ 방법듀을 μ‚¬μš©ν•΄μ„œ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν–ˆμ—ˆλ‹€.

μ‚¬μš© 방법은scriptνƒœκ·Έμ— type="module" μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•˜μ—¬ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ λͺ¨λ“ˆλ‘œμ„œ λ™μž‘ν•œλ‹€!

<script type="module" src="app.mjs"></script>

λͺ¨λ“ˆ 파일의 ν™•μž₯μžλŠ” 일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ ESModuleμž„μ„ λͺ…ν™•νžˆ ν•˜κΈ° μœ„ν•΄ mjsλ₯Ό μ‚¬μš©ν•  것을 ꢌμž₯ν•œλ‹€.
ESModuleμ—λŠ” ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 기본적으둜 strict modeκ°€ μ μš©λœλ‹€.

ESModule의 νŠΉμ§•

  • λͺ¨λ“ˆ μ •μ˜ 및 내보내기

    • export ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“ˆμ„ 내보낼 수 μžˆλ‹€.
      default export와 named export도 μ§€μ›ν•œλ‹€.
  • λͺ¨λ“ˆ κ°€μ Έμ˜€κΈ°

    • import ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“ˆμ„ 뢈러올 수 μžˆλ‹€.
  • 비동기적 λ‘œλ”©

    • μ΄λŠ” λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ 특히 μœ μš©ν•˜λ©°, λͺ¨λ“ˆ λ‘œλ”©μ΄ λΉ„λ™κΈ°λ‘œ 처리될 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.
  • 엄격 λͺ¨λ“œ(strict mode)

    • 이λ₯Ό 톡해 였λ₯˜λ₯Ό μ‰½κ²Œ μ°Ύκ³  더 μ•ˆμ „ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
  • 트리 쉐이킹(Tree Shaking)

    • λͺ¨λ“ˆ λ²ˆλ“€λŸ¬(Webpack, Rollup λ“±)μ—μ„œ μ‚¬μš©λ  λ•Œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μ œκ±°ν•˜λŠ” μ΅œμ ν™”λ₯Ό μ§€μ›ν•œλ‹€.

CommonJS vs ESModule

ν˜Έν™˜μ„±

  • CommonJS: Node.js ν™˜κ²½μ—μ„œ 주둜 μ‚¬μš©λ˜λ©°, λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” λ°”λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.(λ²ˆλ“€λ§ν•˜κ±°λ‚˜ νŠΈλžœμŠ€νŒŒμΌλ§ν•˜λŠ” 도ꡬλ₯Ό μ‚¬μš©ν•΄μ•Ό 함)

  • ESModule: μ„œλ²„ ν™˜κ²½, λΈŒλΌμš°μ € ν™˜κ²½ λͺ¨λ‘μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

λ‘œλ”© 방식

  • CommonJS: 동기적인 λ‘œλ“œ λ°©μ‹μœΌλ‘œ 파일 μ‹œμŠ€ν…œμ΄λ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ ν•„μš”ν•˜λ©΄ ν•΄λ‹Ή μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ½”λ“œ 싀행이 블둝(block)λœλ‹€.

  • ESModule: 비동기적인 λ‘œλ“œ λ°©μ‹μœΌλ‘œ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ 특히 μœ μš©ν•˜λ‹€.

문법

  • CommonJS: require, module.exportsλ₯Ό μ‚¬μš©ν•œλ‹€.

  • ESModule: import, exportλ₯Ό μ‚¬μš©ν•œλ‹€.

μ‹€ν–‰ μ‹œμ 

  • CommonJS: requireλŠ” 파일이 싀행될 λ•Œ λͺ¨λ“ˆμ„ λ‘œλ“œν•œλ‹€. 즉 λͺ¨λ“ˆμ„ ν˜ΈμΆœν•˜λŠ” μ‹œμ μ— λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰ν•œλ‹€.
    λͺ¨λ“ˆμ΄ 호좜될 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ , μΊμ‹œλœ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

  • ESModule: importλŠ” 파일의 맨 μœ„μ—μ„œ μ„ μ–Έλ˜λ©°, 슀크립트 μ‹€ν–‰ 전에 λͺ¨λ“ˆμ΄ 미리 λ‘œλ“œλœλ‹€.
    μ΄λŠ” ν˜Έμ΄μŠ€νŒ… λ˜μ–΄, μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 λͺ¨λ“ˆμ΄ λ‘œλ“œλœλ‹€.

λͺ¨λ“ˆ μŠ€μ½”ν”„

  • CommonJS: ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λ©°, λͺ¨λ“ˆ λ‚΄μ˜ λͺ¨λ“  μ½”λ“œλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„ μ•ˆμ—μ„œ μ‹€ν–‰λœλ‹€.

  • ESModule: 파일 μŠ€μ½”ν”„λ₯Ό κ°€μ§€λ©°, λͺ¨λ“ˆ λ‚΄μ˜ λͺ¨λ“  μ½”λ“œλŠ” 파일 μŠ€μ½”ν”„ μ•ˆμ—μ„œ μ‹€ν–‰λ˜μ–΄ μ „μ—­ μŠ€μ½”ν”„ μ˜€μ—Όμ„ λ°©μ§€ν•œλ‹€.


κΈ°μ‘΄μ—λŠ” CommonJS와 ESModule의 차이점을 잘 λͺ¨λ₯΄κ³  CommonJSμ—μ„œλŠ” require, module.exports 문법을 μ‚¬μš©ν•˜κ³  ESModule은 import, exportλ₯Ό μ‚¬μš©ν•œλ‹€λŠ” μ •λ„λ§Œ μ•Œκ³  μžˆμ—ˆλŠ”λ° 이번 κ³„κΈ°λ‘œ 각 λͺ¨λ“ˆ μ‹œμŠ€ν…œμ΄ νƒ„μƒν•˜κ²Œ 된 배경을 μ•Œκ²Œ λ˜μ–΄μ„œ μœ μ΅ν•œ 지식을 μ•Œκ²Œ 된 것 κ°™λ‹€!


πŸ™ƒ 도움이 λ˜μ—ˆλ˜ μžλ£Œλ“€

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive 48μž₯ λͺ¨λ“ˆ
Understanding CommonJS vs. ES Modules in JavaScript
CommonJS와 ES Modules은 μ™œ ν•¨κ»˜ ν•  수 μ—†λŠ”κ°€?
CommonJS와 ESM에 λͺ¨λ‘ λŒ€μ‘ν•˜λŠ” 라이브러리 κ°œλ°œν•˜κΈ°: exports field

profile
🏁

0개의 λŒ“κΈ€