λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[11μ£Όμ°¨ μŠ€ν„°λ””]48μž₯-λͺ¨λ“ˆ

by HomieKim 2022. 4. 8.

λͺ¨λ“ˆ

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

  • λͺ¨λ“ˆ(module)μ΄λž€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ  μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 λ§ν•œλ‹€.
  • 일반적으둜 λͺ¨λ“ˆμ€ κΈ°λŠ₯을 κΈ°μ€€μœΌλ‘œ 파일 λ‹¨μœ„λ‘œ 뢄리
  • μ΄λ•Œ λͺ¨λ“ˆμ΄ μ„±λŸ½ν•˜λ €λ©΄ λͺ¨λ“ˆ μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„(λͺ¨λ“ˆ μŠ€μ½”ν”„)λ₯Ό κ°€μ§ˆ 수 μžˆμ–΄μ•Ό 함
  • μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ€ 기본적으둜 λΉ„κ³΅κ°œ μƒνƒœ
  • 즉, λͺ¨λ“ˆλ‚΄λΆ€μ˜ λ³€μˆ˜, ν•¨μˆ˜ 객체 λ“± λͺ¨λ‘ μΊ‘μŠν™” λ˜μ–΄ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€.
  • κ·ΈλŸ¬λ‚˜ λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ λ‹€λ₯Έ λͺ¨λ“ˆμ— μ˜ν•΄ μž¬μ‚¬μš© λ˜μ–΄μ•Ό μ˜λ―Έκ°€ 있음, λ”°λΌμ„œ κ³΅κ°œκ°€ ν•„μš”ν•œ μžμ‚°μ— ν•œμ •ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 선택적 κ³΅κ°œκ°€ κ°€λŠ₯ ν•˜λ‹€. 이λ₯Ό export라고 ν•œλ‹€.
  • export된 λͺ¨λ“ˆμ€ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ³ , μ΄λ•Œ 곡개된 λͺ¨λ“ˆμ€ μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆμ„ λͺ¨λ“ˆ μ‚¬μš©μž(module consumer)라고 ν•œλ‹€.
  • λͺ¨λ“ˆ μ‚¬μš©μžλŠ” exportν•œ λͺ¨λ“ˆμ˜ 일뢀 λ˜λŠ” 전체λ₯Ό μžμ‹ μ˜ μŠ€μ½”ν”„ λ‚΄λ‘œ λΆˆλŸ¬λ“€μ—¬ μž¬μ‚¬μš© ν•  수 μžˆλŠ”λ° 이λ₯Ό import 라고 ν•œλ‹€.

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

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ 탄생
  • 즉, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 파일 μŠ€μ½”ν”„μ™€ import, exportλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•˜λ‹€.Cμ–Έμ–΄λŠ” #include, μžλ°”λŠ” import λ“± λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” λͺ¨λ“ˆκΈ°λŠ₯을 지원
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ—¬λŸ¬κ°œμ˜ 파일둜 λΆ„λ¦¬ν•˜μ—¬ λΈŒλΌμš°μ €μ—μ„œ λ‘œλ“œν•΄λ„ 독립적인 파일 μŠ€μ½”ν”„ 가지지 μ•Šγ…Žκ³  ν•˜λ‚˜μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 내에 μžˆλŠ” 것 처럼 λ™μž‘μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” λ“±μ˜ λ¬Έμžκ°€ λ°œμƒν•  수 μžˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ κ΅­ν•œλ˜μ§€ μ•Šκ³  λ²”μš©μ μœΌλ‘œ μ‚¬μš©λ˜λ©΄μ„œ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ΄ μ œμ•ˆ 됨
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ€ 크게 CommonJS λ˜λŠ” AMD μ§„μ˜μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.NodeJSλŠ” CommonJSλ₯Ό μ±„νƒν–ˆκ³  ECMAScript ν‘œμ€€ 사양은 μ•„λ‹ˆμ§€λ§Œ CommonJS 사양을 λ”°λ₯Έ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ§€μ›ν•©λ‹ˆλ‹€.
    즉, NodeJS ν™˜κ²½μ—μ„œλŠ” νŒŒμΌλ³„λ‘œ 독립적인 파일 μŠ€μ½”ν”„(λͺ¨λ“ˆ μŠ€μ½”ν”„)λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

ES6 λͺ¨λ“ˆ(ESM)

  • ES6μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ™μž‘ν•˜λŠ” λͺ¨λ“ˆ κΈ°λŠ₯을 좔가함.
  • script νƒœκ·Έμ— type="module" μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λͺ¨λ“ˆλ‘œ λ™μž‘
<script type="module" src="app.js" ></script>

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

  • ESM이 μ•„λ‹Œ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ script νƒœκ·Έλ‘œ 뢄리해도 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό 갖지 μ•ŠλŠ”λ‹€.
  • ESM λ‚΄μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€.
  • λͺ¨λ“ˆ λ‚΄μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλŠ” μ™ΈλΆ€μ—μ„œ μ°Έμ‘° λΆˆκ°€λŠ₯ (λͺ¨λ“ˆ μŠ€μ½”ν”„κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έ)

export ν‚€μ›Œλ“œ

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

export function square(x) {
  return x * x;
}

export class Person {
  constructor(name) {
    this.name = name;
  }
}
  • μœ„ λ³€μˆ˜, ν•¨μˆ˜, 클래슀λ₯Ό 객체둜 λ§Œλ“€μ–΄ ν•œλ²ˆμ— export ν•  μˆ˜λ„ μžˆλ‹€.
export {pi, square, Person};

import ν‚€μ›Œλ“œ

  • λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ export ν•œ μ‹λ³„μžλ₯Ό μžμ‹ μ˜ λͺ¨λ“ˆ μŠ€μ½”ν”„λ‘œ λ‘œλ“œ ν•˜λ €λ©΄ import ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©
import { pi, square, Person} from './lib.mjs';
console.log(pi); // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person("Lee")); // Person { name: 'Lee' }
  • import μ‹œ export 된 μ‹λ³„μž 이름과 κ°™κ²Œ import 해야함
  • μ‹λ³„μž 이름을 ν•œλ²ˆμ— import ν•  μˆ˜λ„ μžˆλ‹€.
    • as μ‚¬μš©ν•˜μ—¬ 이름을 지정 ν•˜λŠ” 방법
    • // lib μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ λͺ¨λ“  μ‹λ³„μžλ₯Ό 뢈러옴 import * as lib from "./lib.mjs"; console.log(lib.pi); // 3.141592653589793 console.log(lib.square(10)); // 100 console.log(new lib.Person("Lee")); // Person { name: 'Lee' }
    • μ‹λ³„μž 이름을 직접 지정
    • import { pi as PI, square as sq, Person as P } from "./lib.mjs"; console.log(PI); // 3.141592653589793 console.log(sq(2)); // 4 console.log(new P("Kim")); // Person { name: 'Kim' }
    • λͺ¨λ“ˆμ—μ„œ ν•˜λ‚˜μ˜ κ°’λ§Œ export ν•œλ‹€λ©΄ default ν‚€μ›Œλ“œ μ‚¬μš©κ°€λŠ₯
    • default ν‚€μ›Œλ“œλ‘œ exportν•œ λͺ¨λ“€λ¦‰ {} 없이 μž„μ˜μ˜ μ΄λ¦„μœΌλ‘œ import
    • const pi = Math.PI; function square(x) { return x * x; } class Person { constructor(name) { this.name = name; } } // default ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 var, let, const ν‚€μ›Œλ“œ μ‚¬μš© λΆˆκ°€. export default {pi. square, Person}; /*----------------------------------*/ import defaultModule from 'lib.mjs'; console.log(defaultModule.pi); // 3.141592653589793

λŒ“κΈ€