μ ν리μΌμ΄μ μ ꡬμ±νλ κ°λ³μ μμλ‘μ μ¬μ¬μ© κ°λ₯ν μ½λ μ‘°κ°μ λ§νλ€.
μΌλ°μ μΌλ‘ λͺ¨λμ κΈ°λ₯μ κΈ°μ€μΌλ‘ νμΌ λ¨μλ‘ λΆλ¦¬νλ€. μ΄ λ λͺ¨λμ΄ μ±λ¦½νλ €λ©΄ λͺ¨λμ μμ λ§μ νμΌ μ€μ½ν(λͺ¨λ μ€μ½ν)λ₯Ό κ°μ§ μ μμ΄μΌ νλ€.
μμ λ§μ νμΌ μ€μ½νλ₯Ό κ°λ λͺ¨λμ μμ°(λ³μ, ν¨μ, κ°μ²΄ λ±)μ κΈ°λ³Έμ μΌλ‘ λΉκ³΅κ° μνμ΄λ€. μΊ‘μνλμ΄ λ€λ₯Έ λͺ¨λμμ μ κ·Όν μ μμ΄ μ ν리μΌμ΄μ κ³Ό λΆλ¦¬λμ΄ μ‘΄μ¬νλ€.
λͺ¨λμ 곡κ°κ° νμν μμ°μ νμ νμ¬ λͺ
μμ μΌλ‘ export
ν€μλλ₯Ό ν΅ν΄ μ νμ 곡κ°κ° κ°λ₯νλ€.
μ¬μ©μλ import
ν€μλλ₯Ό ν΅ν΄ λͺ¨λμ΄ κ³΅κ°ν μμ°(export
) μ€ μΌλΆ λλ μ 체λ₯Ό μ νν΄ μμ μ μ€μ½ν λ΄λ‘ λΆλ¬λ€μ¬ μ¬μ¬μ©ν μ μλ€.
π‘ λͺ¨λμ ν΅ν΄ μ½λμ λ¨μλ₯Ό λͺ νν λΆλ¦¬νμ¬ μ ν리μΌμ΄μ μ ꡬμ±ν μ μκ³ , μ¬μ¬μ©μ±μ΄ μ’μμ κ°λ° ν¨μ¨μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μλ€.
μ£Όλ‘ μλ² μ¬μ΄λ μλ°μ€ν¬λ¦½νΈ νκ²½, νΉν 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κ° νμνμλ€!
λͺ¨λ μ μ λ° λ΄λ³΄λ΄κΈ°
module.exports
κ°μ²΄λ₯Ό μ¬μ©νμ¬ λ΄λ³΄λΌ μ μλ€.λͺ¨λ κ°μ Έμ€κΈ°
require
ν¨μλ₯Ό μ¬μ©νμ¬ λ€λ₯Έ λͺ¨λμ λΆλ¬μ¬ μ μλ€.λκΈ°μ λ‘λ©
μΊμ±
require
νλ©΄ μΊμλ λ²μ μ λ°ννλ€.μ΅μ μλ°μ€ν¬λ¦½νΈ νμ€(ES6/ES2015)μμ λμ λ λͺ¨λ μμ€ν μ΄λ€.
λΈλΌμ°μ μ μλ² μ¬μ΄λ μλ°μ€ν¬λ¦½νΈ(Node.js λ±) νκ²½ λͺ¨λμμ μ¬μ©ν μ μλ€λ νΉμ§μ΄ μλ€.
ESModuleμ΄ νμνκΈ° μ κΉμ§ ν΄λΌμ΄μΈνΈ μ¬μ΄λ μλ°μ€ν¬λ¦½νΈμμ λͺ¨λμ μ¬μ©νλ €λ©΄ μ¦μ μ€ν ν¨μ(IIFE), AMD λ±μ λ°©μμΌλ‘ νμ€νλ λ°©μμ΄ μλ λ°©λ²λ€μ μ¬μ©ν΄μ λͺ¨λ μμ€ν μ μ¬μ©νμλ€.
μ¬μ© λ°©λ²μscript
νκ·Έμ type="module"
μ΄νΈλ¦¬λ·°νΈλ₯Ό μΆκ°νμ¬ λ‘λλ μλ°μ€ν¬λ¦½νΈ νμΌμ λͺ¨λλ‘μ λμνλ€!
<script type="module" src="app.mjs"></script>
λͺ¨λ νμΌμ νμ₯μλ μΌλ°μ μΈ μλ°μ€ν¬λ¦½νΈ νμΌμ΄ μλ ESModuleμμ λͺ
νν νκΈ° μν΄ mjs
λ₯Ό μ¬μ©ν κ²μ κΆμ₯νλ€.
ESModuleμλ ν΄λμ€μ λ§μ°¬κ°μ§λ‘ κΈ°λ³Έμ μΌλ‘ strict modeκ° μ μ©λλ€.
λͺ¨λ μ μ λ° λ΄λ³΄λ΄κΈ°
export
ν€μλλ₯Ό μ¬μ©νμ¬ λͺ¨λμ λ΄λ³΄λΌ μ μλ€.default export
μ named export
λ μ§μνλ€.λͺ¨λ κ°μ Έμ€κΈ°
import
ν€μλλ₯Ό μ¬μ©νμ¬ λ€λ₯Έ λͺ¨λμ λΆλ¬μ¬ μ μλ€.λΉλκΈ°μ λ‘λ©
μ격 λͺ¨λ(strict mode)
νΈλ¦¬ μμ΄νΉ(Tree Shaking)
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