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 |