2013. 3. 16. 12:34
NodeJS/Modules
Node.js에서 모듈을 사용하는 방법과 브라우져에서 SPA(Singe page application) 기반으로 개발을 진행할 때 Javascript 모듈의 의존성 관계 관리를 위한 모듈 사용방법은 차이가 있다. 각각에 대해 간단히 알아보자
1) Node.js 모듈
- CommonJS 패턴을 사용한다 : Synchronous 로딩이다
- require('dowon') 방식으로 module을 로딩한다
- module.exports 를 통하여 functionality를 노출시킨다. 모듈이라는 컴포넌트를 사용하기 위한 외부 Interface를 지정하는 것이다.
- calc.js 모듈 파일
var Calc = function(start) {
var that = this;
this.add = function(x) {
start = start +x;
return that;
};
this.multiply = function(x) {
start = start * x;
return that;
};
this.equals = function(callback) {
callback(start);
return that;
};
}
// module.exports를 사용한다
module.exports = {
add: function(x, y) {
return new Calc(x).add(y || 0);
},
multiply: function(x, y) {
return new Calc(x).multiply(y || 1);
}
}
- app.js 모듈 파일
// require를 호출하여 모듈 즉, 컴포넌트를 로딩한다
var Calc = require('./calc.js');
// 모듈에서 외부로 노출시킨 API를 호출한다
Calc.add(1, 2)
.multiply(3)
.equals(function (result) {
console.log(result);
});
2) 브라우져 기반 모듈
- Require.js 를 -AMD(Asynchronous Module Definition)- 사용한다 : Asynchronous 로딩이다
- CommonJS와 약간의 차이가 있다
- require 를 통해 dependencies와 callback을 얻는다 : 주로 호출하는 Main 입장의 application에서 사용할 때
- define 을 통해 dependencies를 얻고 API를 노출한다 : 개별 모듈을 정의할 때
- 제품 리스트를 보여주는 메인 소스
//require 사용
require(['jquery', './big-cart'], function($, bigCart) { <=== big-cart.js 의 펑션을 호출한다. 즉, big-car.js에 의존관계
$(document).ready(function() {
bigCart.init();
});
})
- 쇼핑 카트
// define 사용하여 정의
define(['./pubsub', 'jquery'], function(pubsub, $) { <=== pubsub.js 의 펑션을 호출한다. 즉, pubsub.js에 의존관계
var cart, count = 0;
pubsub.sub('add-to-cart', function(itme) {
count++;
cart.find('h1').html(count);
var li = $('< li >')
.html(item.name)
.data('key', item.id);
cart.find('ul').append(li);
});
pubsub.sub('remove-from-cart', function(item) {
count--;
cart.find('h1').html(count);
cart.find('li').filter(function() {
return $(this).data('key') == item.id;
}).remove();
});
return {
init: function() {
cart = $('.big-cart');
}
}
});
- 카트 내역 관리 모델
define(function() { <=== 의존하는 것이 없다
var cache = {};
return {
pub: function(id) {
var args = [].slice.call(arguments, 1);
if(!cache[id]) {
cache[id] = [];
}
for(var i=0, il=cache[i].length; i -1) {
cache[id] = cache[id].slice(0, index).concat(cache[id].slice(index+1));
}
}
}
}
});
3) CommonJS와 Require.js 개념 정리
4) AMD 개념
5) AMD 동영상
- 하나의 자바스크립트 파일의 내역을 재사용할 수 있도록 - DRY (Don't Repeatly Yourself) - 모듈로 분리함
+ 첫째는 단순히 <script> 태그를 사용하여 개발자가 순서대로 넣는 호랑이 담배피던 시절의 방식
+ 둘째는 define을 사용하여 모듈라이제이션하고 사용시에 require 한다
- part01
'NodeJS > Modules' 카테고리의 다른 글
| [NPM] Node.js 모듈을 NPM Registry에 등록하기 (0) | 2013.08.14 |
|---|---|
| [AMD] 클라이언트 사이트 모듈 제어하기 (0) | 2013.03.16 |
| [Socket.io] HTML5의 Websocket.io 아키텍쳐 (0) | 2013.01.13 |
| [Modules] Prototype.js 사용하기 (0) | 2012.11.23 |
| [CoffeeScript] Smooth CoffeeScript 배우기 (0) | 2012.10.30 |
