λ€μν λͺ¨λ μμ€ν , λͺ¨λ² μ¬λ‘, μ μΈκ³ κ°λ°μλ₯Ό μν λ¬Έμ ν΄κ²° νμ λ€λ£¨λ μλ°μ€ν¬λ¦½νΈ λͺ¨λ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ λν μ¬μΈ΅ κ°μ΄λμ λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ μλΉμ€ μμΉ: μμ‘΄μ± ν΄κ²° μ¬μΈ΅ λΆμ
μλ°μ€ν¬λ¦½νΈμ λ°μ μ μ½λλ₯Ό λͺ¨λμ΄λΌλ μ¬μ¬μ© κ°λ₯ν λ¨μλ‘ κ΅¬μ±νλ μ¬λ¬ λ°©λ²μ κ°μ Έμμ΅λλ€. μ΄λ¬ν λͺ¨λμ΄ μ΄λ»κ² μμΉλ₯Ό μ°Ύκ³ μμ‘΄μ±μ΄ ν΄κ²°λλμ§ μ΄ν΄νλ κ²μ νμ₯ κ°λ₯νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ κ°μ΄λλ λ€μν νκ²½μ κ±ΈμΉ μλ°μ€ν¬λ¦½νΈ λͺ¨λ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ λν ν¬κ΄μ μΈ μ€λͺ μ μ 곡ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ΄λ 무μμΈκ°?
λͺ¨λ μλΉμ€ μμΉ(Module Service Location)λ λͺ¨λ μλ³μ(μ: λͺ¨λ μ΄λ¦ λλ νμΌ κ²½λ‘)μ κ΄λ ¨λ μ¬λ°λ₯Έ 물리μ νμΌμ΄λ 리μμ€λ₯Ό μ°Ύλ κ³Όμ μ μλ―Έν©λλ€. μ΄κ²μ "λ΄κ° νμν λͺ¨λμ μ΄λμ μλκ°?"λΌλ μ§λ¬Έμ λ΅ν©λλ€.
μμ‘΄μ± ν΄κ²°(Dependency Resolution)μ λͺ¨λμ νμν λͺ¨λ μμ‘΄μ±μ μλ³νκ³ λ‘λνλ κ³Όμ μ λλ€. μ΄λ μμ‘΄μ± κ·Έλνλ₯Ό μννμ¬ μ€ν μ μ νμν λͺ¨λ λͺ¨λμ μ¬μ©ν μ μλλ‘ λ³΄μ₯ν©λλ€. μ΄κ²μ "μ΄ λͺ¨λμ΄ νμλ‘ νλ λ€λ₯Έ λͺ¨λμ 무μμ΄λ©°, μ΄λμ μλκ°?"λΌλ μ§λ¬Έμ λ΅ν©λλ€.
μ΄ λ κ³Όμ μ μλ‘ μ½ν μμ΅λλ€. ν λͺ¨λμ΄ λ€λ₯Έ λͺ¨λμ μμ‘΄μ±μΌλ‘ μμ²νλ©΄, λͺ¨λ λ‘λλ λ¨Όμ ν΄λΉ μλΉμ€(λͺ¨λ)μ μμΉλ₯Ό μ°Ύμ λ€μ, κ·Έ λͺ¨λμ΄ λμ νλ μΆκ°μ μΈ μμ‘΄μ±μ ν΄κ²°ν΄μΌ ν©λλ€.
λͺ¨λ μλΉμ€ μμΉλ₯Ό μ΄ν΄νλ κ²μ΄ μ μ€μνκ°?
- μ½λ ꡬμ±: λͺ¨λμ λ λμ μ½λ ꡬμ±κ³Ό κ΄μ¬μ¬ λΆλ¦¬λ₯Ό μ΄μ§ν©λλ€. λͺ¨λμ μμΉλ₯Ό νμ νλ λ°©λ²μ μ΄ν΄νλ©΄ νλ‘μ νΈλ₯Ό λ ν¨κ³Όμ μΌλ‘ ꡬμ±ν μ μμ΅λλ€.
- μ¬μ¬μ©μ±: λͺ¨λμ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ΄λ μ¬μ§μ΄ λ€λ₯Έ νλ‘μ νΈμμλ μ¬μ¬μ©λ μ μμ΅λλ€. μ μ ν μλΉμ€ μμΉλ λͺ¨λμ μ¬λ°λ₯΄κ² μ°Ύκ³ λ‘λν μ μλλ‘ λ³΄μ₯ν©λλ€.
- μ μ§λ³΄μμ±: μ ꡬμ±λ μ½λλ μ μ§λ³΄μ λ° λλ²κΉ μ΄ λ μ½μ΅λλ€. λͺ νν λͺ¨λ κ²½κ³μ μμΈ‘ κ°λ₯ν μμ‘΄μ± ν΄κ²°μ μ€λ₯μ μνμ μ€μ΄κ³ μ½λλ² μ΄μ€λ₯Ό μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- μ±λ₯: ν¨μ¨μ μΈ λͺ¨λ λ‘λ©μ μ ν리μΌμ΄μ μ±λ₯μ ν° μν₯μ λ―ΈμΉ μ μμ΅λλ€. λͺ¨λμ΄ μ΄λ»κ² ν΄κ²°λλμ§ μ΄ν΄νλ©΄ λ‘λ© μ λ΅μ μ΅μ ννκ³ λΆνμν μμ²μ μ€μΌ μ μμ΅λλ€.
- νμ : νμΌλ‘ μμ ν λ μΌκ΄λ λͺ¨λ ν¨ν΄κ³Ό ν΄κ²° μ λ΅μ νμ μ ν¨μ¬ κ°λ¨νκ² λ§λλλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ μμ€ν μ μ§ν
μλ°μ€ν¬λ¦½νΈλ μ¬λ¬ λͺ¨λ μμ€ν μ κ±°μ³ λ°μ νμΌλ©°, κ° μμ€ν μ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ λν κ³ μ ν μ κ·Ό λ°©μμ κ°μ§κ³ μμ΅λλ€.
1. μ μ μ€ν¬λ¦½νΈ νκ·Έ ν¬ν¨ (ꡬμ λ°©λ²)
곡μμ μΈ λͺ¨λ μμ€ν
μ΄ λ±μ₯νκΈ° μ μλ, μλ°μ€ν¬λ¦½νΈ μ½λλ μΌλ°μ μΌλ‘ HTMLμ <script>
νκ·Έλ₯Ό μ¬μ©νμ¬ ν¬ν¨λμμ΅λλ€. μμ‘΄μ±μ μ묡μ μΌλ‘ κ΄λ¦¬λμμΌλ©°, νμν μ½λλ₯Ό μ¬μ©ν μ μλλ‘ μ€ν¬λ¦½νΈ ν¬ν¨ μμμ μμ‘΄νμ΅λλ€. μ΄ μ κ·Ό λ°©μμλ μ¬λ¬ λ¨μ μ΄ μμμ΅λλ€:
- μ μ λ€μμ€νμ΄μ€ μ€μΌ: λͺ¨λ λ³μμ ν¨μκ° μ μ μ€μ½νμ μ μΈλμ΄ μ μ¬μ μΈ μ΄λ¦ μΆ©λμ μΌμΌμΌ°μ΅λλ€.
- μμ‘΄μ± κ΄λ¦¬: μμ‘΄μ±μ μΆμ νκ³ μ¬λ°λ₯Έ μμλ‘ λ‘λλμλμ§ νμΈνκΈ° μ΄λ €μ μ΅λλ€.
- μ¬μ¬μ©μ±: μ½λκ° μ’ μ’ κΈ΄λ°νκ² κ²°ν©λμ΄ λ€λ₯Έ 컨ν μ€νΈμμ μ¬μ¬μ©νκΈ° μ΄λ €μ μ΅λλ€.
μμ :
<script src="lib.js"></script>
<script src="app.js"></script>
μ΄ κ°λ¨ν μμ μμ `app.js`λ `lib.js`μ μμ‘΄ν©λλ€. ν¬ν¨ μμκ° λ§€μ° μ€μν©λλ€. λ§μ½ `app.js`κ° `lib.js`λ³΄λ€ λ¨Όμ ν¬ν¨λλ©΄ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ λμ΅λλ€.
2. CommonJS (Node.js)
CommonJSλ μ£Όλ‘ Node.jsμμ μ¬μ©λλ μλ°μ€ν¬λ¦½νΈλ₯Ό μν μ΅μ΄μ λ리 μ±νλ λͺ¨λ μμ€ν
μ
λλ€. λͺ¨λμ κ°μ Έμ€κΈ° μν΄ require()
ν¨μλ₯Ό μ¬μ©νκ³ , λ΄λ³΄λ΄κΈ° μν΄ module.exports
κ°μ²΄λ₯Ό μ¬μ©ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ:
CommonJSλ νΉμ λͺ¨λ ν΄κ²° μκ³ λ¦¬μ¦μ λ°λ¦
λλ€. require('module-name')
μ΄ νΈμΆλλ©΄ Node.jsλ λ€μ μμλ‘ λͺ¨λμ κ²μν©λλ€:
- μ½μ΄ λͺ¨λ: 'module-name'μ΄ λ΄μ₯ Node.js λͺ¨λ(μ: 'fs', 'http')κ³Ό μΌμΉνλ©΄ μ§μ λ‘λλ©λλ€.
- νμΌ κ²½λ‘: 'module-name'μ΄ './' λλ '/'λ‘ μμνλ©΄ μλ λλ μ λ νμΌ κ²½λ‘λ‘ μ²λ¦¬λ©λλ€.
- Node λͺ¨λ: Node.jsλ λ€μ μμλ‘ 'node_modules'λΌλ λλ ν 리λ₯Ό κ²μν©λλ€:
- νμ¬ λλ ν 리.
- λΆλͺ¨ λλ ν 리.
- λΆλͺ¨μ λΆλͺ¨ λλ ν 리, μ΄λ° μμΌλ‘ λ£¨νΈ λλ ν 리μ λλ¬ν λκΉμ§ κ³μλ©λλ€.
κ° 'node_modules' λλ ν 리 λ΄μμ Node.jsλ 'module-name'μ΄λΌλ λλ ν 리λ 'module-name.js'λΌλ νμΌμ μ°Ύμ΅λλ€. λλ ν λ¦¬κ° λ°κ²¬λλ©΄ Node.jsλ ν΄λΉ λλ ν 리 λ΄μμ 'index.js' νμΌμ κ²μν©λλ€. 'package.json' νμΌμ΄ μ‘΄μ¬νλ©΄ Node.jsλ 'main' μμ±μ μ°Ύμ μ§μ μ μ κ²°μ ν©λλ€.
μμ‘΄μ± ν΄κ²°:
CommonJSλ λκΈ°μ μμ‘΄μ± ν΄κ²°μ μνν©λλ€. require()
κ° νΈμΆλλ©΄ λͺ¨λμ μ¦μ λ‘λλκ³ μ€νλ©λλ€. μ΄λ¬ν λκΈ°μ νΉμ±μ νμΌ μμ€ν
μ κ·Όμ΄ λΉκ΅μ λΉ λ₯Έ Node.jsμ κ°μ μλ²μ¬μ΄λ νκ²½μ μ ν©ν©λλ€.
μμ :
`my_module.js`
// my_module.js
const helper = require('./helper');
function myFunc() {
return helper.doSomething();
}
module.exports = { myFunc };
`helper.js`
// helper.js
function doSomething() {
return "Hello from helper!";
}
module.exports = { doSomething };
`app.js`
// app.js
const myModule = require('./my_module');
console.log(myModule.myFunc()); // μΆλ ₯: Hello from helper!
μ΄ μμ μμ `app.js`λ `my_module.js`λ₯Ό νμλ‘ νκ³ , `my_module.js`λ λ€μ `helper.js`λ₯Ό νμλ‘ ν©λλ€. Node.jsλ μ 곡λ νμΌ κ²½λ‘λ₯Ό κΈ°λ°μΌλ‘ μ΄λ¬ν μμ‘΄μ±μ λκΈ°μ μΌλ‘ ν΄κ²°ν©λλ€.
3. λΉλκΈ° λͺ¨λ μ μ (AMD)
AMDλ λκΈ°μ λͺ¨λ λ‘λ©μ΄ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νκ³ μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μλ λΈλΌμ°μ νκ²½μ μν΄ μ€κ³λμμ΅λλ€. AMDλ λͺ¨λμ λ‘λνλ λ° λΉλκΈ°μ μ κ·Ό λ°©μμ μ¬μ©νλ©°, μΌλ°μ μΌλ‘ λͺ¨λμ μ μνκΈ° μν΄ define()
ν¨μλ₯Ό, λ‘λνκΈ° μν΄ require()
ν¨μλ₯Ό μ¬μ©ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ:
AMDλ λͺ¨λ μλΉμ€ μμΉλ₯Ό μ²λ¦¬νκΈ° μν΄ λͺ¨λ λ‘λ λΌμ΄λΈλ¬λ¦¬(μ: RequireJS)μ μμ‘΄ν©λλ€. λ‘λλ μΌλ°μ μΌλ‘ λͺ¨λ μλ³μλ₯Ό νμΌ κ²½λ‘μ λ§€ννκΈ° μν΄ κ΅¬μ± κ°μ²΄λ₯Ό μ¬μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ λͺ¨λ μμΉλ₯Ό μ¬μ©μ μ μνκ³ λ€λ₯Έ μμ€μμ λͺ¨λμ λ‘λν μ μμ΅λλ€.
μμ‘΄μ± ν΄κ²°:
AMDλ λΉλκΈ°μ μμ‘΄μ± ν΄κ²°μ μνν©λλ€. require()
κ° νΈμΆλλ©΄ λͺ¨λ λ‘λλ λͺ¨λκ³Ό κ·Έ μμ‘΄μ±μ λ³λ ¬λ‘ κ°μ Έμ΅λλ€. λͺ¨λ μμ‘΄μ±μ΄ λ‘λλλ©΄ λͺ¨λμ ν©ν 리 ν¨μκ° μ€νλ©λλ€. μ΄ λΉλκΈ°μ μ κ·Ό λ°©μμ λ©μΈ μ€λ λ μ°¨λ¨μ λ°©μ§νκ³ μ ν리μΌμ΄μ
μλ΅μ±μ ν₯μμν΅λλ€.
μμ (RequireJS μ¬μ©):
`my_module.js`
// my_module.js
define(['./helper'], function(helper) {
function myFunc() {
return helper.doSomething();
}
return { myFunc };
});
`helper.js`
// helper.js
define(function() {
function doSomething() {
return "Hello from helper (AMD)!";
}
return { doSomething };
});
`main.js`
// main.js
require(['./my_module'], function(myModule) {
console.log(myModule.myFunc()); // μΆλ ₯: Hello from helper (AMD)!
});
HTML:
<script data-main="main.js" src="require.js"></script>
μ΄ μμ μμ RequireJSλ `my_module.js`μ `helper.js`λ₯Ό λΉλκΈ°μ μΌλ‘ λ‘λν©λλ€. define()
ν¨μλ λͺ¨λμ μ μνκ³ , require()
ν¨μλ λͺ¨λμ λ‘λν©λλ€.
4. λ²μ© λͺ¨λ μ μ (UMD)
UMDλ λͺ¨λμ΄ CommonJSμ AMD νκ²½ λͺ¨λμμ (κ·Έλ¦¬κ³ μ¬μ§μ΄ μ μ μ€ν¬λ¦½νΈλ‘λ) μ¬μ©λ μ μλλ‘ νλ ν¨ν΄μ
λλ€. λͺ¨λ λ‘λ(μ: require()
λλ define()
)μ μ‘΄μ¬λ₯Ό κ°μ§νκ³ λͺ¨λμ μ μνκ³ λ‘λνκΈ° μν΄ μ μ ν λ©μ»€λμ¦μ μ¬μ©ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ:
UMDλ λͺ¨λ μλΉμ€ μμΉλ₯Ό μ²λ¦¬νκΈ° μν΄ κΈ°λ³Έ λͺ¨λ μμ€ν (CommonJS λλ AMD)μ μμ‘΄ν©λλ€. λͺ¨λ λ‘λλ₯Ό μ¬μ©ν μ μλ κ²½μ° UMDλ μ΄λ₯Ό μ¬μ©νμ¬ λͺ¨λμ λ‘λν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ μ λ³μλ₯Ό μμ±νλ λ°©μμΌλ‘ λ체λ©λλ€.
μμ‘΄μ± ν΄κ²°:
UMDλ κΈ°λ³Έ λͺ¨λ μμ€ν μ μμ‘΄μ± ν΄κ²° λ©μ»€λμ¦μ μ¬μ©ν©λλ€. CommonJSκ° μ¬μ©λλ©΄ μμ‘΄μ± ν΄κ²°μ λκΈ°μ μ λλ€. AMDκ° μ¬μ©λλ©΄ μμ‘΄μ± ν΄κ²°μ λΉλκΈ°μ μ λλ€.
μμ :
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['exports'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS
factory(module.exports);
} else {
// Browser globals (root is window)
factory(root.myModule = {});
}
}(typeof self !== 'undefined' ? self : this, function (exports) {
exports.hello = function() { return "Hello from UMD!";};
}));
μ΄ UMD λͺ¨λμ CommonJS, AMD λλ μ μ μ€ν¬λ¦½νΈλ‘ μ¬μ©ν μ μμ΅λλ€.
5. ECMAScript λͺ¨λ (ES λͺ¨λ)
ES λͺ¨λ(ESM)μ ECMAScript 2015(ES6)μμ νμ€νλ 곡μ μλ°μ€ν¬λ¦½νΈ λͺ¨λ μμ€ν
μ
λλ€. ESMμ import
μ export
ν€μλλ₯Ό μ¬μ©νμ¬ λͺ¨λμ μ μνκ³ λ‘λν©λλ€. μ΄λ€μ μ μ μΌλ‘ λΆμ κ°λ₯νλλ‘ μ€κ³λμ΄ νΈλ¦¬ μμ΄νΉ(tree shaking) λ° λ°λ μ½λ μ κ±°(dead code elimination)μ κ°μ μ΅μ νλ₯Ό κ°λ₯νκ² ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ:
ESMμ λͺ¨λ μλΉμ€ μμΉλ μλ°μ€ν¬λ¦½νΈ νκ²½(λΈλΌμ°μ λλ Node.js)μ μν΄ μ²λ¦¬λ©λλ€. λΈλΌμ°μ λ μΌλ°μ μΌλ‘ URLμ μ¬μ©νμ¬ λͺ¨λμ μμΉλ₯Ό μ°Ύκ³ , Node.jsλ νμΌ κ²½λ‘μ ν¨ν€μ§ κ΄λ¦¬λ₯Ό κ²°ν©ν λ 볡μ‘ν μκ³ λ¦¬μ¦μ μ¬μ©ν©λλ€.
μμ‘΄μ± ν΄κ²°:
ESMμ μ μ λ° λμ μν¬νΈλ₯Ό λͺ¨λ μ§μν©λλ€. μ μ μν¬νΈ(import ... from ...
)λ μ»΄νμΌ νμμ ν΄κ²°λμ΄ μ‘°κΈ° μ€λ₯ κ°μ§ λ° μ΅μ νλ₯Ό κ°λ₯νκ² ν©λλ€. λμ μν¬νΈ(import('module-name')
)λ λ°νμμ ν΄κ²°λμ΄ λ λ§μ μ μ°μ±μ μ 곡ν©λλ€.
μμ :
`my_module.js`
// my_module.js
import { doSomething } from './helper.js';
export function myFunc() {
return doSomething();
}
`helper.js`
// helper.js
export function doSomething() {
return "Hello from helper (ESM)!";
}
`app.js`
// app.js
import { myFunc } from './my_module.js';
console.log(myFunc()); // μΆλ ₯: Hello from helper (ESM)!
μ΄ μμ μμ `app.js`λ `my_module.js`μμ `myFunc`λ₯Ό μν¬νΈνκ³ , `my_module.js`λ `helper.js`μμ `doSomething`μ μν¬νΈν©λλ€. λΈλΌμ°μ λ Node.jsλ μ 곡λ νμΌ κ²½λ‘λ₯Ό κΈ°λ°μΌλ‘ μ΄λ¬ν μμ‘΄μ±μ ν΄κ²°ν©λλ€.
Node.js ESM μ§μ:
Node.jsλ μ μ λ ESM μ§μμ μ±ννκ³ μμΌλ©°, λͺ¨λμ΄ ES λͺ¨λλ‘ μ²λ¦¬λμ΄μΌ ν¨μ λνλ΄κΈ° μν΄ `.mjs` νμ₯μλ₯Ό μ¬μ©νκ±°λ `package.json` νμΌμ `"type": "module"`μ μ€μ ν΄μΌ ν©λλ€. Node.jsλ λν λͺ¨λ μ§μ μλ₯Ό μ€μ νμΌμ λ§€ννκΈ° μν΄ package.jsonμ "imports" λ° "exports" νλλ₯Ό κ³ λ €νλ ν΄κ²° μκ³ λ¦¬μ¦μ μ¬μ©ν©λλ€.
λͺ¨λ λ²λ€λ¬ (Webpack, Browserify, Parcel)
Webpack, Browserify, Parcelκ³Ό κ°μ λͺ¨λ λ²λ€λ¬λ νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ μ€μν μν μ ν©λλ€. μ΄λ€μ μ¬λ¬ λͺ¨λ νμΌκ³Ό κ·Έ μμ‘΄μ±μ κ°μ Έμ λΈλΌμ°μ μμ λ‘λν μ μλ νλ μ΄μμ μ΅μ νλ νμΌλ‘ λ¬Άμ΅λλ€.
λͺ¨λ μλΉμ€ μμΉ (λ²λ€λ¬μ λ§₯λ½μμ):
λͺ¨λ λ²λ€λ¬λ λͺ¨λμ μμΉλ₯Ό μ°ΎκΈ° μν΄ κ΅¬μ± κ°λ₯ν λͺ¨λ ν΄κ²° μκ³ λ¦¬μ¦μ μ¬μ©ν©λλ€. μΌλ°μ μΌλ‘ λ€μν λͺ¨λ μμ€ν (CommonJS, AMD, ES λͺ¨λ)μ μ§μνλ©° κ°λ°μκ° λͺ¨λ κ²½λ‘μ λ³μΉμ μ¬μ©μ μ μν μ μλλ‘ ν©λλ€.
μμ‘΄μ± ν΄κ²° (λ²λ€λ¬μ λ§₯λ½μμ):
λͺ¨λ λ²λ€λ¬λ κ° λͺ¨λμ μμ‘΄μ± κ·Έλνλ₯Ό μννλ©° νμν λͺ¨λ μμ‘΄μ±μ μλ³ν©λλ€. κ·Έλ° λ€μ μ΄λ¬ν μμ‘΄μ±μ μΆλ ₯ νμΌμ λ²λ€λ‘ λ¬Άμ΄ λ°νμμ νμν λͺ¨λ μ½λλ₯Ό μ¬μ©ν μ μλλ‘ λ³΄μ₯ν©λλ€. λ²λ€λ¬λ μ’ μ’ νΈλ¦¬ μμ΄νΉ(μ¬μ©νμ§ μλ μ½λ μ κ±°) λ° μ½λ λΆν (λ λμ μ±λ₯μ μν΄ μ½λλ₯Ό μμ μ²ν¬λ‘ λλλ κ²)κ³Ό κ°μ μ΅μ νλ₯Ό μνν©λλ€.
μμ (Webpack μ¬μ©):
`webpack.config.js`
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules'], // src λλ ν 리μμ μ§μ κ°μ Έμ¬ μ μλλ‘ νμ©
},
};
μ΄ Webpack ꡬμ±μ μ§μ μ (`./src/index.js`), μΆλ ₯ νμΌ (`bundle.js`) λ° λͺ¨λ ν΄κ²° κ·μΉμ μ§μ ν©λλ€. `resolve.modules` μ΅μ μ μλ κ²½λ‘λ₯Ό μ§μ νμ§ μκ³ `src` λλ ν 리μμ μ§μ λͺ¨λμ κ°μ Έμ¬ μ μλλ‘ ν©λλ€.
λͺ¨λ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ μν λͺ¨λ² μ¬λ‘
- μΌκ΄λ λͺ¨λ μμ€ν μ¬μ©: λͺ¨λ μμ€ν (CommonJS, AMD, ES λͺ¨λ)μ μ ννκ³ νλ‘μ νΈ μ 체μμ μΌκ΄λκ² μ¬μ©νμμμ€. μ΄λ μΌκ΄μ±μ 보μ₯νκ³ νΈνμ± λ¬Έμ μ μνμ μ€μ λλ€.
- μ μ λ³μ νΌνκΈ°: λͺ¨λμ μ¬μ©νμ¬ μ½λλ₯Ό μΊ‘μννκ³ μ μ λ€μμ€νμ΄μ€λ₯Ό μ€μΌμν€μ§ λ§μμμ€. μ΄λ μ΄λ¦ μΆ©λμ μνμ μ€μ΄κ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν΅λλ€.
- μμ‘΄μ±μ λͺ μμ μΌλ‘ μ μΈνκΈ°: κ° λͺ¨λμ λͺ¨λ μμ‘΄μ±μ λͺ ννκ² μ μνμμμ€. μ΄λ λͺ¨λμ μꡬ μ¬νμ μ΄ν΄νκΈ° μ½κ² λ§λ€κ³ νμν λͺ¨λ μ½λκ° μ¬λ°λ₯΄κ² λ‘λλλλ‘ λ³΄μ₯ν©λλ€.
- λͺ¨λ λ²λ€λ¬ μ¬μ©: νλ‘λμ μ μν΄ μ½λλ₯Ό μ΅μ ννκΈ° μν΄ Webpackμ΄λ Parcelκ³Ό κ°μ λͺ¨λ λ²λ€λ¬ μ¬μ©μ κ³ λ €νμμμ€. λ²λ€λ¬λ νΈλ¦¬ μμ΄νΉ, μ½λ λΆν λ° κΈ°ν μ΅μ νλ₯Ό μννμ¬ μ ν리μΌμ΄μ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
- μ½λ ꡬμ±: νλ‘μ νΈλ₯Ό λ Όλ¦¬μ μΈ λͺ¨λκ³Ό λλ ν λ¦¬λ‘ κ΅¬μ±νμμμ€. μ΄λ μ½λλ₯Ό μ°Ύκ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λλλ€.
- μ΄λ¦ μ§μ κ·μΉ λ°λ₯΄κΈ°: λͺ¨λκ³Ό νμΌμ λν΄ λͺ ννκ³ μΌκ΄λ μ΄λ¦ μ§μ κ·μΉμ μ±ννμμμ€. μ΄λ μ½λ κ°λ μ±μ ν₯μμν€κ³ μ€λ₯μ μνμ μ€μ λλ€.
- λ²μ κ΄λ¦¬ μ¬μ©: Gitκ³Ό κ°μ λ²μ κ΄λ¦¬ μμ€ν μ μ¬μ©νμ¬ μ½λ λ³κ²½ μ¬νμ μΆμ νκ³ λ€λ₯Έ κ°λ°μμ νμ νμμμ€.
- μμ‘΄μ±μ μ΅μ μνλ‘ μ μ§: λ²κ·Έ μμ , μ±λ₯ ν₯μ λ° λ³΄μ ν¨μΉμ μ΄μ μ μ»κΈ° μν΄ μ κΈ°μ μΌλ‘ μμ‘΄μ±μ μ λ°μ΄νΈνμμμ€. npmμ΄λ yarnκ³Ό κ°μ ν¨ν€μ§ κ΄λ¦¬μλ₯Ό μ¬μ©νμ¬ μμ‘΄μ±μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νμμμ€.
- μ§μ° λ‘λ©(Lazy Loading) ꡬν: λκ·λͺ¨ μ ν리μΌμ΄μ μ κ²½μ°, νμν λ λͺ¨λμ λ‘λνκΈ° μν΄ μ§μ° λ‘λ©μ ꡬννμμμ€. μ΄λ μ΄κΈ° λ‘λ μκ°μ κ°μ νκ³ μ 체 λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μΌ μ μμ΅λλ€. ESM λͺ¨λμ μ§μ° λ‘λ©μ μν΄ λμ μν¬νΈ μ¬μ©μ κ³ λ €νμμμ€.
- κ°λ₯ν κ²½μ° μ λ κ²½λ‘ μν¬νΈ μ¬μ©: ꡬμ±λ λ²λ€λ¬λ μ λ κ²½λ‘ μν¬νΈλ₯Ό νμ©ν©λλ€. κ°λ₯ν κ²½μ° μ λ κ²½λ‘ μν¬νΈλ₯Ό μ¬μ©νλ©΄ 리ν©ν λ§μ΄ λ μ½κ³ μ€λ₯ λ°μ κ°λ₯μ±μ΄ μ€μ΄λλλ€. μλ₯Ό λ€μ΄, `../../../components/Button.js` λμ `components/Button.js`λ₯Ό μ¬μ©νμμμ€.
μΌλ°μ μΈ λ¬Έμ ν΄κ²°
- "Module not found" μ€λ₯: μ΄ μ€λ₯λ μΌλ°μ μΌλ‘ λͺ¨λ λ‘λκ° μ§μ λ λͺ¨λμ μ°Ύμ μ μμ λ λ°μν©λλ€. λͺ¨λ κ²½λ‘λ₯Ό νμΈνκ³ λͺ¨λμ΄ μ¬λ°λ₯΄κ² μ€μΉλμλμ§ νμΈνμμμ€.
- "Cannot read property of undefined" μ€λ₯: μ΄ μ€λ₯λ μ’ μ’ λͺ¨λμ΄ μ¬μ©λκΈ° μ μ λ‘λλμ§ μμμ λ λ°μν©λλ€. μμ‘΄μ± μμλ₯Ό νμΈνκ³ λͺ¨λμ΄ μ€νλκΈ° μ μ λͺ¨λ μμ‘΄μ±μ΄ λ‘λλμλμ§ νμΈνμμμ€.
- μ΄λ¦ μΆ©λ: μ΄λ¦ μΆ©λμ΄ λ°μνλ κ²½μ° λͺ¨λμ μ¬μ©νμ¬ μ½λλ₯Ό μΊ‘μννκ³ μ μ λ€μμ€νμ΄μ€λ₯Ό μ€μΌμν€μ§ λ§μμμ€.
- μν μμ‘΄μ±: μν μμ‘΄μ±μ μκΈ°μΉ μμ λμκ³Ό μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. μ½λλ₯Ό μ¬κ΅¬μ±νκ±°λ μμ‘΄μ± μ£Όμ ν¨ν΄μ μ¬μ©νμ¬ μν μμ‘΄μ±μ νΌνλλ‘ λ Έλ ₯νμμμ€. λꡬλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν μνμ κ°μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μλͺ»λ λͺ¨λ ꡬμ±: λ²λ€λ¬λ λ‘λκ° μ μ ν μμΉμμ λͺ¨λμ ν΄κ²°νλλ‘ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈνμμμ€. `webpack.config.js`, `tsconfig.json` λλ κΈ°ν κ΄λ ¨ κ΅¬μ± νμΌμ λ€μ νμΈνμμμ€.
κΈλ‘λ² κ³ λ € μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό λμμΌλ‘ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ κ°λ°ν λ λ€μ μ¬νμ κ³ λ €νμμμ€:
- κ΅μ ν(i18n) λ° νμ§ν(l10n): λ€λ₯Έ μΈμ΄μ λ¬Ένμ νμμ μ½κ² μ§μν μ μλλ‘ λͺ¨λμ ꡬμ±νμμμ€. λ²μ κ°λ₯ν ν μ€νΈμ νμ§ν κ°λ₯ν 리μμ€λ₯Ό μ μ© λͺ¨λμ΄λ νμΌλ‘ λΆλ¦¬νμμμ€.
- μκ°λ: λ μ§μ μκ°μ λ€λ£° λ μκ°λλ₯Ό μ λ νμμμ€. μκ°λ λ³νμ μ¬λ°λ₯΄κ² μ²λ¦¬νκΈ° μν΄ μ μ ν λΌμ΄λΈλ¬λ¦¬μ κΈ°μ μ μ¬μ©νμμμ€. μλ₯Ό λ€μ΄, λ μ§λ₯Ό UTC νμμΌλ‘ μ μ₯νμμμ€.
- ν΅ν: μ ν리μΌμ΄μ μμ μ¬λ¬ ν΅νλ₯Ό μ§μνμμμ€. ν΅ν λ³ν λ° μμ μ§μ μ μ²λ¦¬νκΈ° μν΄ μ μ ν λΌμ΄λΈλ¬λ¦¬μ APIλ₯Ό μ¬μ©νμμμ€.
- μ«μ λ° λ μ§ νμ: λ€λ₯Έ λ‘μΌμΌμ λ§κ² μ«μ λ° λ μ§ νμμ μ‘°μ νμμμ€. μλ₯Ό λ€μ΄, μ² λ¨μ λ° μμμ κ΅¬λΆ κΈ°νΈλ₯Ό λ€λ₯΄κ² μ¬μ©νκ³ , λ μ§λ₯Ό μ μ ν μμ(μ: MM/DD/YYYY λλ DD/MM/YYYY)λ‘ νμνμμμ€.
- λ¬Έμ μΈμ½λ©: κ΄λ²μν λ¬Έμλ₯Ό μ§μνκΈ° μν΄ λͺ¨λ νμΌμ UTF-8 μΈμ½λ©μ μ¬μ©νμμμ€.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ λͺ¨λ μλΉμ€ μμΉ λ° μμ‘΄μ± ν΄κ²°μ μ΄ν΄νλ κ²μ νμ₯ κ°λ₯νκ³ μ μ§λ³΄μ κ°λ₯νλ©° μ±λ₯μ΄ μ’μ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μ λλ€. μΌκ΄λ λͺ¨λ μμ€ν μ μ ννκ³ μ½λλ₯Ό ν¨κ³Όμ μΌλ‘ ꡬμ±νλ©° μ μ ν λꡬλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λͺ¨λμ΄ μ¬λ°λ₯΄κ² λ‘λλκ³ μ ν리μΌμ΄μ μ΄ λ€μν νκ²½κ³Ό λ€μν μ μΈκ³ μ¬μ©μμκ² μννκ² μ€νλλλ‘ λ³΄μ₯ν μ μμ΅λλ€.