μ°λ¦¬κ° ꡬνν μΈλΆμ¬νμ μΊ‘μν λ₯Ό νκ³ νμν APIλΆλΆλ§ 곡κ°νμ¬ μ½κ² λ‘λνμ¬ μ¬μ©ν μ μλλ‘ νλ μ½λ μ‘°κ°
λ€λ₯Έ κ³³μμ κ°μ Έμ¨ κ²μ΄μ§λ§ μ½λ μ‘°κ°μ΄λΌλ ννμ μ€λ«λ§μ λ³Έ λ―νλ€.
κ·Έλ λ€λ©΄ Moduleμ΄ μ νμνκ°? π
μ°λ¦¬λ μλ κΈ°μ μ μΌλ‘ μ°λ¦¬λ λͺ¨λ μμ΄λ μ½λλ₯Ό μμ±ν μ μμλ€. μΆ©λΆν μμ μ΄λ μ§κΈμ΄λ jqueryλ₯Ό μ¬μ©ν΄μ InlineμΌλ‘ μ ꡬννκ³ μμ§μλ?
π Module μ 60, 70λ
λ μ΄ν κ°λ°μλ€μ΄ λ€μν νμκ³Ό νλ‘κ·Έλλ° μΈμ΄λ‘ μ¬μ©ν΄μ¨ ν¨ν΄μ΄λ€. π
π μλ°μ€ν¬λ¦½νΈμμ Module μ μ΄λ‘ μ μΌλ‘ λ€μ μ¬νμ νμ©ν΄μΌ νλ€.
- μΆμν : νΉμν λΌμ΄λΈλ¬λ¦¬μ κΈ°λ₯μ μμνμ¬ μ€μ ꡬνμ 볡μ‘λλ₯Ό μ΄ν΄ν νμκ° μλ€.
- μΊ‘μν : μ½λλ₯Ό λ³κ²½νμ§ μμΌλ €λ©΄ Module λ΄λΆμ μ½λλ₯Ό μ¨κΈ΄λ€.
- μ¬μ¬μ© : κ°μ μ½λλ₯Ό λ°λ³΅ν΄μ μμ±νλ κ²μ νΌνλ€.
- μμ‘΄μ± κ΄λ¦¬ : μ½λλ₯Ό λ€μ μμ±νμ§ μκ³ λ μ½κ² μμ‘΄μ±μ λ³κ²½νλ€.
μ¬λλ€μ΄ μ§κΈλ? λ§μ΄ μ¬μ©νκ³ μλ <script></script>
μ¬μ΄μ μ½λλ₯Ό μμ±νλ λ°©λ²μ΄λ€.
κ·Έλ¬λ μμ λΆν° μ¬μ©νλ λ°©λ²μλ λΉμ°νκ²λ λ¬Έμ μ μ΄ μλ€. π₯
- μ¬μ¬μ©μ± : λ€μ μ¬μ©νλ €λ©΄ μ½λλ₯Ό 볡λΆν΄μΌνλ€.
- μμ‘΄μ± : μμ‘΄μ±μ κ°λ°μκ° μ λ§μΆ°μ£Όμ΄μΌνλ€.
- μ μ λ€μμ€νμ΄μ€μ μ€μΌ : μ μμΌλ‘ μ μΈμ νμ¬ μ μμ΄ λλ¬μμ§λ€. (νν λκΈ°μ μμ νλ‘μ νΈλ‘ jqueryλ₯Ό μ¬μ©ν κ²½μ°)
μΈλΆμ scriptνμΌμ λ§λ€μ΄μ <script src="..."></script>
λ₯Ό μ¬μ©ν΄μ μΈλΆνμΌμ κ°μ Έμ€λλ‘ νλ κ²μ΄λ€.
κΈ°μ‘΄μ μ¬μ©νλ Inline Script
μλ λ€λ₯΄κ² μ¬μ¬μ©μ±μλ μ’μμ‘μΌλ μμ‘΄μ±λ¬Έμ μ μ μμ μ€μΌμ μμ§λ λ¨μμκ²λλ€. π₯
- μμ‘΄μ± : μμ‘΄μ±μ κ°λ°μκ° μ λ§μΆ°μ£Όμ΄μΌνλ€.
- μ μ λ€μμ€νμ΄μ€μ μ€μΌ : μ μμΌλ‘ μ μΈμ νμ¬ μ μμ΄ λλ¬μμ§λ€.
Module Object and IIFE
λ₯Ό μ¬μ©νκ² λ¨μΌλ‘μ¨ μ μμ μ€μΌμ΄ μ€μ΄λ€κ² λμλ€. μ¬λ¬κ°λ₯Ό μ μμ μ μΈμ ν΄μ μ¬μ©νλ κ²μ΄ μλ νλμ Object
λ₯Ό λ§λ€μ΄μ κ·Έ μμ λ§λ€μ΄ μ¬μ©ν¨μ λ°λΌ μ€μΌλκ° μ€μ΄λ€κ² λλ κ²μ΄λ€.
μμ§κΉμ§ μμ‘΄μ±μ λ¬Έμ μ μ μλ€μμ€νμ΄μ€μ μμ ν μ€μΌμ΄ μλ κ²½μ°κ° μλ€. π₯
- μμ‘΄μ± : μμ‘΄μ±μ κ°λ°μκ° μ λ§μΆ°μ£Όμ΄μΌνλ€.
- μ μ λ€μμ€νμ΄μ€μ μ€μΌ : μ μμΌλ‘ μ μΈμ νμ¬ μ μμ΄ λλ¬μμ§λ€.
Module
ν¬λ§·μ Module
μ μ μνκΈ° μν΄ μ¬μ©ν μ μλ λ¬Έλ²μ΄λ€.
EcmaScript6 λλ ES2015 μ΄μ μ μλ°μ€ν¬λ¦½νΈλ Module
μ μ μνκΈ° μν 곡μμ μΈ λ¬Έλ²μ κ°μ§κ³ μμ§ μμλ€.
κ·Έ κ²°κ³Ό μ리ν κ°λ°μλ€μ μλ°μ€ν¬λ¦½νΈμμ Module
μ μ μνκΈ° μν΄ λ€μν ν¬λ§·μ κ³ μν΄ λλ€.
λ€μμ λ§μ΄ μ±νλκ³ μ μλ €μ§ ν¬λ§·λ€μ΄λ€. β
- CommonJS(Nodejsκ° μ±νν ν¨ν΄)
- λΉλκΈ° λͺ¨λ μ μ(AMD, Asynchronous Module Definition)
- λ§λ₯ λͺ¨λ μ μ(UMD, Universal Module Definition)
- System.register
- ES6 λͺ¨λ ν¬λ§·
// add.js
module.exports = function add(a, b){
return a+b;
}
var add = require('./add');
CommonJS ν¬λ§·μ Node.jsμμ μ¬μ©λκ³ require
μ module.exports
λ₯Ό μ¬μ©ν΄μ μμ‘΄μ±κ³Ό λͺ¨λμ μ μνλ€.
//Calling define with a dependency array and a factory function
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});
Commonjs ν¨ν΄μ λ¬Έμ λ λκΈ°μμ΄λΌλ κ², μ΄μ λΉλκΈ°μμΌλ‘ λΆλ¬μ€μλ ν¨ν΄μ΄λ€.
AMD ν¬λ§·μ λΈλΌμ°μ μμ μ¬μ©λκ³ define
ν¨μλ₯Ό μ¬μ©ν΄μ λͺ¨λμ μ μνλ€.
UMD ν¬λ§·μ λΈλΌμ°μ μ Node.jsμμ λ λ€ μ¬μ©λ μ μλ€.
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['b'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require('b'));
} else {
// Browser globals (root is window)
root.returnExports = factory(root.b);
}
}(this, function (b) {
//use b in some fashion.
// Just return a value to define the module export.
// This example returns an object, but the module
// can return a function as the exported value.
return {};
}));
System.register ν¬λ§·μ ES5μμ ES6 λͺ¨λ λ¬Έλ²μ μ§μνκΈ° μν΄ λμμΈλμλ€.
import { p as q } from './dep';
var s = 'local';
export function func() {
return q;
}
export class C {
}
ES6μμ μλ°μ€ν¬λ¦½νΈλ λ΄μ₯λ λͺ¨λ ν¬λ§·λ μ§μνλ€.
λͺ¨λμ κ³΅κ° APIλ‘ λ΄λ³΄λ΄κΈ° μν΄ export
ν ν°μ μ¬μ©νλ€.
// lib.js
// Export default function
export default function sayHello(){
console.log('Hello');
}
// Export non-default function
export function sayGoodbye(){
console.log('Goodbye');
}
κ·Έλ¦¬κ³ import
ν ν°μ λͺ¨λμ΄ λ΄λ³΄λ΄λ λΆλΆμ κ°μ Έμ¨λ€.
import sayHello, { sayGoodbye } from './lib';
sayHello();
// => Hello
sayGoodbye();
// => Goodbye
μ£Όμ λͺ¨λ ν¬λ§·μΌλ‘ μμ±λ λͺ¨λμ λ°νμ λ λ‘λνκ³ ν΄μνλ€.
- λΈλΌμ°μ μμ λͺ¨λ λ‘λλ₯Ό λ‘λνλ€.
- λͺ¨λ λ‘λμκ² μ΄λ€ λ©μΈ μ ν리μΌμ΄μ νμΌμ λ‘λν κ²μΈμ§ λ €μ€λ€.
- λͺ¨λ λ‘λλ λ©μΈ μ ν리μΌμ΄μ νμΌμ λ€μ΄λ‘λνκ³ ν΄μνλ€.
- νμν κ²½μ° λͺ¨λ λ‘λκ° νμΌμ λ€μ΄λ‘λνλ€.
- RequireJS : AMD ν¬λ§· λͺ¨λμ μν λ‘λ
- SystemJS : AMD, CommonJS, UMD λλ System.register ν¬λ§· λͺ¨λμ μν λ‘λ
λͺ¨λ λ²λ€λ¬λ λͺ¨λ λ‘λλ₯Ό λ체νλ€.
λΉλνμμ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬λ‘ λͺ¨λ Module
μ μμ‘΄μ±μ λ§κ² μ μμ€νμ΄μ€μ μ€μΌμ΄ μλλ‘ νλμ νμΌλ‘ λ¬Άμ΄μ£Όλ λΌμ΄λΈλ¬λ¦¬
λͺ¨λ λ‘λλ₯Ό λ체νκ³ λΉλ νμμ λͺ¨λ μ½λμ λ²λ€μ μμ±νλ€.
- λΉλ νμμ λ²λ€ νμΌμ μμ±νκΈ° μν΄ λͺ¨λ λ²λ€λ¬λ₯Ό μ€ννλ€. (μ: bundle.js)
- λΈλΌμ°μ μμ λ²λ€ νμΌμ λ‘λνλ€.
- Browserify : CommonJS λͺ¨λμ μν λ²λ€λ¬
- Webpack : AMD, CommonJS, ES6 λͺ¨λμ μν λ²λ€λ¬
μλ°μ€ν¬λ¦½νΈ μ½λκ° λ§μμ§λ©΄ νλμ νμΌλ‘ κ΄λ¦¬νλλ° νκ³κ° μλ€. μ¬λ¬κ° νμΌμ λΈλΌμ°μ Έμμ λ‘λ©νλ κ²μ κ·Έλ§νΌ λ€νΈμν¬ λΉμ©μ μΉλ€μΌνλ λ¨μ μ΄ μλ€.
λΏλ§ μλλΌ κ° νμΌμ μλ‘μ μ€μ½νλ₯Ό μΉ¨λ²νμ§ μμμΌ νλλ° μλͺ» μμ±ν κ²½μ° λ³μ μΆ©λμ μνμ±λ μλ€.
ν¨μ μ€μ½νλ₯Ό μ¬μ©νλ μλ°μ€ν¬λ¦½νΈλ μ¦μνΈμΆν¨μ(IIFE) λ₯Ό μ¬μ©ν΄ λͺ¨λμ λ§λ€ μ μλ€. CommonJSλ AMD μ€νμΌμ λͺ¨λ μμ€ν μ μ¬μ©νλ©΄ νμΌλ³λ‘ λͺ¨λμ κ΄λ¦¬ν μλ μλ€.
μ¬μ ν λΈλΌμ°μ Έμμλ νμΌ λ¨μ λͺ¨λ μμ€ν μ μ¬μ©νλ κ²μ μ½μ§ μμ μΌμ΄λ€.
π₯ λͺ¨λμ IIFE μ€νμΌλ‘ λ³κ²½ν΄ μ£Όλ κ³Όμ λΏλ§ μλλΌ νλμ νμΌλ‘ λ¬Άμ΄(bundled) λ€νΈμ λΉμ©μ μ΅μν ν μ μλ λ°©λ²μ΄ μΉ νλ‘νΈμλ κ°λ° κ³Όμ μλ νμνλ€. π₯
- μνΈλ¦¬: μμμ
- μμν: λ²λ€λ κ²°κ³Όλ¬Ό μμΉ
- λ‘λ : μΉν©μ κΈ°λ³Έμ μΌλ‘ jsλ₯Ό μν΄μ λμ¨ λ²λ€λ¬μλ€. κ·Έλ¬λ μ¬λ¬κ°μ§ κΈ°λ₯μ λ£μλ €κ³ ν΄μ μκΈ΄κ²μΌλ‘ λΉjsλ₯Ό μ½κ³ ν΄μμ νλλ° νμνκ²λ€μ λ£μ΄μ£Όλ κ³³
- νλ¬κ·ΈμΈ : λ²λ€μ΄ μλ£κ° λκ³ λμ μμ νλ κ²λ€μ λ£μ΄μ£Όλ κ³³(ex λλ ν)