From 0cbadcb75514b4aaf8ac6255ac82541334ae97ca Mon Sep 17 00:00:00 2001 From: "DESKTOP-PDMTIQO\\hansu" Date: Wed, 24 Jan 2024 19:18:54 +0900 Subject: [PATCH] =?UTF-8?q?:memo:=20docs:=2048=EC=9E=A5=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\225\234\354\210\230\354\247\200.md" | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 "docs/48_\353\252\250\353\223\210/\355\225\234\354\210\230\354\247\200.md" diff --git "a/docs/48_\353\252\250\353\223\210/\355\225\234\354\210\230\354\247\200.md" "b/docs/48_\353\252\250\353\223\210/\355\225\234\354\210\230\354\247\200.md" new file mode 100644 index 00000000..15b28f0a --- /dev/null +++ "b/docs/48_\353\252\250\353\223\210/\355\225\234\354\210\230\354\247\200.md" @@ -0,0 +1,169 @@ +## 48μž₯. ✨ λͺ¨λ“ˆ(Module) + +### πŸ“Œ 48-1. λͺ¨λ“ˆμ˜ 일반적 의미 + +> **λͺ¨λ“ˆ**μ΄λž€ **μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ  μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각**을 λ§ν•©λ‹ˆλ‹€. + +일반적으둜 λͺ¨λ“ˆμ€ `κΈ°λŠ₯을 κΈ°μ€€`으둜 `파일 λ‹¨μœ„λ‘œ 뢄리`ν•©λ‹ˆλ‹€. + +μ΄λ•Œ λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜λ €λ©΄ λͺ¨λ“ˆμ€ `μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„(λͺ¨λ“ˆ μŠ€μ½”ν”„)`λ₯Ό κ°€μ§ˆ 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. + +**μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„**λ₯Ό κ°–λŠ” **λͺ¨λ“ˆμ˜ μžμ‚°**(λ³€μˆ˜, ν•¨μˆ˜, 객체 λ“±)은 기본적으둜 **λΉ„κ³΅κ°œ μƒνƒœ**μž…λ‹ˆλ‹€. + +μžμ‹ λ§Œμ˜ 파일 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” λͺ¨λ“ˆμ˜ λͺ¨λ“  μžμ‚°μ€ `μΊ‘μŠν™”`λ˜μ–΄ **λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.** + +즉, λͺ¨λ“ˆμ€ κ°œλ³„μ  μ‘΄μž¬λ‘œμ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΆ„λ¦¬λ˜μ–΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. + +λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ λ‹€λ₯Έ λͺ¨λ“ˆμ— μ˜ν•΄ `μž¬μ‚¬μš©λ˜μ–΄μ•Ό 의미`κ°€ μžˆμŠ΅λ‹ˆλ‹€. + +> λ”°λΌμ„œ, **λͺ¨λ“ˆμ€ κ³΅κ°œκ°€ ν•„μš”ν•œ μžμ‚°μ— ν•œμ •ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 선택적 κ³΅κ°œκ°€ κ°€λŠ₯**ν•©λ‹ˆλ‹€. (= `export`) + +**export(곡개)된 λͺ¨λ“ˆμ˜ μžμ‚°μ€ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μž¬μ‚¬μš©**ν•  수 있게 되며, μ΄λ•Œ **곡개된 λͺ¨λ“ˆμ˜ μžμ‚°μ„ μ‚¬μš©ν•˜λŠ” λͺ¨λ“ˆμ„ λͺ¨λ“ˆ μ‚¬μš©μž**라고 ν•©λ‹ˆλ‹€. + +> λͺ¨λ“ˆ μ‚¬μš©μžλŠ” **λͺ¨λ“ˆμ΄ κ³΅κ°œν•œ μžμ‚° 쀑 일뢀 λ˜λŠ” 전체λ₯Ό 선택해 μžμ‹ μ˜ μŠ€μ½”ν”„ λ‚΄λ‘œ λΆˆλŸ¬λ“€μ—¬ μž¬μ‚¬μš©**ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (= `import`) + +λͺ¨λ“ˆμ€ μ½”λ“œμ˜ λ‹¨μœ„λ₯Ό λͺ…ν™•νžˆ λΆ„λ¦¬ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ성할 수 있고, μž¬μ‚¬μš©μ„±μ΄ μ’‹μ•„μ„œ 개발 νš¨μœ¨μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μž…λ‹ˆλ‹€. + +--- + +### πŸ“Œ 48-2. μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ λͺ¨λ“ˆ + +μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“ˆμ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 파일 μŠ€μ½”ν”„μ™€ import, exportλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. + +ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” script νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬, `μ™ΈλΆ€μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ‘œλ“œ`ν•  μˆ˜λŠ” μžˆμ§€λ§Œ `νŒŒμΌλ§ˆλ‹€ 독립적인 파일 μŠ€μ½”ν”„λ₯Ό 갖지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.` + +즉, μ—¬λŸ¬ 개의 νŒŒμΌμ„ λΆ„λ¦¬ν•˜μ—¬ script νƒœκ·Έλ‘œ λ‘œλ“œν•΄λ„ λΆ„λ¦¬λœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌλ“€μ€ κ²°κ΅­ **ν•˜λ‚˜μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 내에 μžˆλŠ” κ²ƒμ²˜λŸΌ λ™μž‘**ν–ˆμŠ΅λ‹ˆλ‹€. + +μ΄λŠ”, **λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 ν•˜λ‚˜μ˜ 전역을 κ³΅μœ ν•˜κ²Œ 되며 μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒ**ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. + +μ΄λŸ¬ν•œ μƒν™©μ—μ„œ μ œμ•ˆλœ 것이 CommonJS와 AMDμž…λ‹ˆλ‹€. + +μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ€ 크게 CommonJS와 AMD μ§„μ˜μœΌλ‘œ λ‚˜λ‰˜κ²Œ λ˜μ—ˆκ³ , λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” CommonJS와 AMDλ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ“ˆ λ‘œλ” 라이브러리λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 상황이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + +`μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ ν™˜κ²½μΈ Node.js`λŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œμ˜ 사싀상 ν‘œμ€€μΈ `CommonJS`λ₯Ό μ±„νƒν–ˆκ³ , λ…μžμ μΈ 진화λ₯Ό 거쳐 기본적으둜 CommonJS 사양을 λ”°λ₯΄λŠ” λͺ¨λ“ˆ μ‹œμŠ€ν…œμœΌλ‘œ λ°œμ „ν–ˆμŠ΅λ‹ˆλ‹€. + +> Node.jsλŠ” ECMAScript ν‘œμ€€ 사양은 μ•„λ‹ˆμ§€λ§Œ, λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ§€μ›ν•©λ‹ˆλ‹€. + +λ”°λΌμ„œ **Node.js ν™˜κ²½μ—μ„œλŠ” νŒŒμΌλ³„λ‘œ 독립적인 파일 μŠ€μ½”ν”„**(λͺ¨λ“ˆ μŠ€μ½”ν”„)λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. + +--- + +### πŸ“Œ 48-3. ES6 λͺ¨λ“ˆ(ESM) + +ES6μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ λ™μž‘ν•˜λŠ” λͺ¨λ“ˆ κΈ°λŠ₯을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. + +IEλ₯Ό μ œμ™Έν•œ λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €μ—μ„œ ES6 λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +```html + +``` + +μœ„ μ½”λ“œμ²˜λŸΌ, script νƒœκ·Έμ˜ `type='module'` μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‘œλ“œλœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ λͺ¨λ“ˆλ‘œμ„œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€. + +(일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ•„λ‹Œ, ESMμž„μ„ λͺ…ν™•νžˆ ν•˜κΈ° μœ„ν•΄μ„œ 파일 ν™•μž₯자λͺ…을 mjs둜 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯) + +ESMμ—λŠ” ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 기본적으둜 strict modeκ°€ μ μš©λ©λ‹ˆλ‹€. + +#### πŸ”Ž λͺ¨λ“ˆ μŠ€μ½”ν”„ + +> ESM은 **λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„**λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. + +일반적인 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ script νƒœκ·Έλ‘œ 뢄리해도, ν•˜λ‚˜μ˜ 전역을 κ³΅μœ ν•˜κ²Œ 되며 μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +ν•˜μ§€λ§Œ, ESM νŒŒμΌμ€ 자체의 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μ œκ³΅ν•˜λ―€λ‘œ, κ³΅μœ λ˜λŠ” 전역이 λ‹€λ¦…λ‹ˆλ‹€. + +#### πŸ”Ž export ν‚€μ›Œλ“œ + +μœ„μ—μ„œ μ‚΄νŽ΄λ³΄μ•˜λ“―μ΄, λͺ¨λ“ˆμ€ λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. + +λ”°λΌμ„œ **λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λͺ¨λ“  μ‹λ³„μžλŠ” 기본적으둜 ν•΄λ‹Ή λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°**ν•  수 μžˆκ²Œλ©λ‹ˆλ‹€. + +κ·Έλ ‡κΈ° λ•Œλ¬Έμ—, λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλ₯Ό μ™ΈλΆ€λ‘œ κ³΅κ°œν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ μž¬μ‚¬μš©ν•  수 있게 ν•˜λ €λ©΄ `export` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. + +```js +// export의 μ˜ˆμ‹œ +export const name = 'foo'; + +export function sum { + +} +export class Person { + +} +``` + +μ„ μ–Έλ¬Έ μ•žμ— 맀번 `export`ν‚€μ›Œλ“œλ₯Ό λΆ™μ΄λŠ” 것이 λ²ˆκ±°λ‘­λ‹€λ©΄, exportν•  λŒ€μƒμ„ ν•˜λ‚˜μ˜ 객체둜 κ΅¬μ„±ν•˜μ—¬ ν•œλ²ˆμ— export ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +```js +const name = 'foo'; + +function sum { + +} +class Person { + +} + +// exportν•  λŒ€μƒμ„ ν•˜λ‚˜μ˜ 객체둜 κ΅¬μ„±ν•˜μ—¬ 내보내기 +export {name, sum, Person} +``` + +μΆ”κ°€μ μœΌλ‘œ λͺ¨λ“ˆμ—μ„œ ν•˜λ‚˜μ˜ λŒ€μƒλ§Œμ„ exportν•  경우 `default`ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. + +```js +class Person {} + +export default Person; +``` + +`default`ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  경우, `var, let, const`ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. + +#### πŸ”Ž import ν‚€μ›Œλ“œ + +λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ export(곡개)ν•œ μ‹λ³„μžλ₯Ό λͺ¨λ“ˆ μŠ€μ½”ν”„ λ‚΄λΆ€λ‘œ λ‘œλ“œν•˜λ €λ©΄ import ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€. + +μ΄λ•Œ, λ‹€λ₯Έ λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μž μ΄λ¦„μœΌλ‘œ importν•΄μ•Ό ν•˜λ©° ESM의 경우 파일 ν™•μž₯자λ₯Ό μƒλž΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€. + +```js +// export.js - λͺ¨λ“ˆ 내보내기 파일 +const name = 'foo'; + +function sum { + +} +class Person { + +} + +export {name, sum, Person} + +// import.js - λͺ¨λ“ˆ 뢈러였기 파일 +import {name, sum, Person} from './export.js' +``` + +참고둜, λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μž 이름을 λ³€κ²½ν•˜μ—¬ import ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. + +```js +// export.js - λͺ¨λ“ˆ 내보내기 파일 +const name = 'foo'; + +function sum { + +} +class Person { + +} + +export {name, sum, Person} + +// import.js - λͺ¨λ“ˆ 뢈러였기 파일 +// as둜 뒀에 μ΄λ¦„μœΌλ‘œ 이름 λ³€κ²½ν•˜κΈ° +import {name as NAME, sum, Person} from './export.js' + +// export된 μžμ› ν•œλ²ˆμ— 뢈러였기 +// *λŠ” λͺ¨λ“  μžμ›μ„ μ„ νƒν•©λ‹ˆλ‹€. +// asλ₯Ό 톡해 뒀에 obj객체에 λͺ¨λ“  μžμ›μ„ ν”„λ‘œνΌν‹°λ‘œ ν• λ‹Ήν•΄μ„œ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. +import * as obj from './export.js'; +``` + +import λ˜λŠ” μ‹λ³„μžλŠ” as 뒀에 μ§€μ •ν•œ μ΄λ¦„μ˜ 객체에 ν”„λ‘œνΌν‹°λ‘œ ν• λ‹Ήλ©λ‹ˆλ‹€.