πŸ“‹ λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive | 48μž₯ λͺ¨λ“ˆ

waterglassesΒ·2022λ…„ 9μ›” 17일
1
post-thumbnail

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive λ„μ„œμ˜ 48μž₯ λͺ¨λ“ˆλ₯Ό μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

48.1 λͺ¨λ“ˆμ˜ 일반적 의미

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

파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ˜ λͺ¨λ“  μžμ‚°μ€ μΊ‘μŠν™” λ˜μ–΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€. λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ λ‹€λ₯Έ λͺ¨λ“ˆμ— μ˜ν•΄ μž¬μ‚¬μš© λ˜μ–΄μ•Ό μ˜λ―Έκ°€ μžˆλ‹€. λͺ¨λ“ˆμ€ κ³΅κ°œκ°€ ν•„μš”ν•œ μžμ‚°μ— ν•œμ •ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 선택적 κ³΅κ°œκ°€ κ°€λŠ₯ν•˜λ‹€. 이λ₯Ό export라 ν•œλ‹€.

λͺ¨λ“ˆ μ‚¬μš©μžλŠ” λͺ¨λ“ˆμ΄ 곡개(export)ν•œ μžμ‚° 쀑 일뢀 λ˜λŠ” 전체λ₯Ό μ„œλ‚΅ν•΄ μžμ‹ μ˜ μŠ€μ½”ν”„ λ‚΄λ‘œ λΆˆλŸ¬λ“€μ—¬ μž¬μ‚¬μš©ν•  수 μžˆλ‹€. 이λ₯Ό import라 ν•œλ‹€.

λͺ¨λ“ˆμ€ κΈ°λŠ₯λ³„λ‘œ λΆ„λ¦¬λ˜μ–΄ κ°œλ³„μ μΈ 파일둜 μž‘μ„±λœλ‹€. λ”°λΌμ„œ μž¬μ‚¬μš©μ„±μ΄ μ’‹μ•„μ„œ 개발 νš¨μœ¨μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.

48.2 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λͺ¨λ“ˆ

처음 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œ(export, import)λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•˜λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ—¬λŸ¬ 개의 파일둜 λΆ„λ¦¬ν•˜μ•Ό script νƒœκ·Έλ‘œ λ‘œλ“œν•΄λ„ λΆ„λ¦¬λœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌλ“€μ€ κ²°κ΅­ ν•˜λ‚˜μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 내에 μžˆλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

이런 상황에 μ œμ•ˆλœ 것이 CommonJS와 AMDλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ ν™˜κ²½μΈ Node.jsλŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œμ˜ 사싀상 ν‘œμ€€μΈ CommonJSλ₯Ό μ„ νƒν–ˆλ‹€. 즉, Node.jsλŠ” ECMAScript ν‘œμ€€ 사양은 μ•„λ‹ˆμ§€λ§Œ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ§€μ›ν•œλ‹€.

48.3 ES6 λͺ¨λ“ˆ(ESM)

IEλ₯Ό μ œμ™Έν•œ λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €μ—μ„œ ES6 λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆλ‹€.

ESM의 μ‚¬μš©λ²•

script νƒœκ·Έμ— type="module" μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ λͺ¨λ“ˆλ‘œμ„œ μ’…μž‘ν•œλ‹€.

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

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

ESM은 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€. mjs 파일 λ‚΄μ—μ„œ varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ”λŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€.

// foo.mjs
const x = 'foo'
console.log(x) // foo

// bar.mjs
console.log(x) // ReferenceError: x is not defined

48.3.2 export ν‚€μ›Œλ“œ

  • λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλ₯Ό 외뢀에 κ³΅κ°œν•˜λ©° λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ μž¬μ‚¬μš©ν•  수 있게 ν•˜λ €λ©΄ export ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“± λͺ¨λ“  μ‹λ³„μžλ₯Ό export ν•  수 μžˆλ‹€.

48.3.3 import ν‚€μ›Œλ“œ

  • λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ exportν•œ μ‹λ³„μžλ₯Ό μžμ‹ μ˜ λͺ¨λ“ˆ μŠ€μ½”ν”„ λ‚΄λΆ€λ‘œ λ‘œλ“œν•˜κΈ° μœ„ν•΄ import ν‚€μ›Œλ“œ μ‚¬μš©
  • ESM의 κ²½μš°λŠ” 파일 ν™•μž₯자 μƒλž΅ν•  수 μ—†λ‹€.
  • λͺ¨λ“ˆμ—μ„œ ν•˜λ‚˜μ˜ κ°’λ§Œ export ν•˜λ©΄ default ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. default ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 기본적으둜 이름 없이 ν•˜λ‚˜μ˜ 값을 export ν•œλ‹€.
    • default ν‚€μ›Œλ“œ μ‚¬μš© μ‹œ var, let, const ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.
    • default ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ export ν•œ λͺ¨λ“ˆμ€ { } 없이 μž„μ˜μ˜ μ΄λ¦„μœΌλ‘œ importν•œλ‹€.
// app.mjs
// lib.mjs λͺ¨λ“ˆμ΄ exportν•œ λͺ¨λ“  μ‹λ³„μžλ₯Ό lib 객체의 ν”„λ‘œνΌν‹°λ‘œ λͺ¨μ•„ importν•œλ‹€.
import * as lib from './lib.mjs'

console.log(lib.pi) // 3.141592...

Ref

  • 이웅λͺ¨ μ €, ⌜λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive⌟, μœ„ν‚€λΆμŠ€
profile
맀 μˆœκ°„ μ„±μž₯ν•˜λŠ” κ°œλ°œμžκ°€ 되렀고 λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€