1. exports 전역변수 사용

exports는 어디에서나 접근할수있고 속성도 추가 가능
  • exports.속성에 함수 추가
    user.js
    --------
    exports.test1 = function(){
    return {id : 'hello', name : 'kimchanhee'};
    } 
    
  • exports.속성에 객체 추가
    user.js
    --------
    exports.test2 = {id : 'hello2', name : 'kimchanhee2'};
    
  • 다른 js에서 사용 , require() 메서드사용
    var user = require('./user'); // require() 메서드는 exports가 속성으로 할당
    

    ※ exports에 객체를 할당하면 exports는 새로운 변수로 인식

    user.js
    --------
    exports = {
    test : {id : 'hello', name : 'kimchanhee'};
    }
    ----------------------------------------------------
    var user = require('./user'); = X 오류발생
    

2. module.exports 사용

  • module.exports에 객체 할당
user1.js
--------
var user = {
  test1 : function() {
    return {id : 'hello', name : 'kimchanhee'};
  },
  test2 : {id : 'hello2', name : 'kimchanhee2'}
}

module.exports = user;
-----------------------------------------------------
var user = require('./user1'); //module.exports에 할당한 객체가 반환
console.log(user.test2.id); // "hello2"
  • module.exports에 함수 할당
user1.js
--------
module.exports = function() {
  return {id : 'hello', name : 'kimchanhee'};
}
-----------------------------------------------------
var user = require('./user1'); // module.exports에 할당한 익명함수가 반환
console.log( user().name ); // "kimchanhee"

module.exports에 익명함수가 반환된다. ()소괄호를 붙여 함수 실행


3. exports VS module.exports

exports 전역변수와 module.exports 를 함께 사용하면 module.exports가 우선 적용
※ module.exports 사용 권장


4. 모듈 분리할때 전형적인 코드 방법

  1. 함수를 할당하는 경우
  2. 인스턴스 객체를 할당하는 경우
  3. 프로토타입 객체를 할당하는 경우

1) 함수를 할당 하는 경우

 user2.js
 --------
 module.exports = function() {
   return {id : 'hello', name : 'kimchanhee'};
 }
 -----------------------------------------------------
 var user = require('./user2'); //
 console.log( user().name ); // "kimchanhee"

2번과 동일

2) 인스턴스 객체를 할당하는 경우

user2.js
--------
// 생성자 함수
function User(id, name) {
	this.id = id;
	this.name = name;
}
//프토토타입 속성추가
User.prototype.print = function() {
	console.log('id : %s, name : %s', this.id, this.name);
}

module.exports = new User('test', '김찬희');
---------------------------------------------
var user = require('./user2'); // new User('test', '김찬희');

user.print(); // "id: test, name : 김찬희"
console.log(user.id); // "test"

var user에는 new User()로 만든 인스턴스 객체가 반환된다.

3) 프로토타입 객체를 할당하는 경우

user2.js
--------
// 생성자 함수
function User(id, name) {
	this.id = id;
	this.name = name;
}
//프토토타입 속성추가
User.prototype.print = function() {
	console.log('id : %s, name : %s', this.id, this.name);
}

exports.User = User;
--------------------
var Test = require('./user2').User; // exports.User 참조, 즉 User 객체 참조
var user = new Test('test', '김찬희'); // new 연산자로 인스턴스객체 생성

user.print(); // "id: test, name : 김찬희"

exports 객체에 속성을 추가 한 후 프로토타입 객체를 정의 하고, require() 메서드로 반환되는 객체는 exports 이므로 그 안에 추가한 User객체를 참조 한 후 new 연산자로 인스턴스 객체를 만들 수 있다.

chanhee.kim's profile image

chanhee.kim

2017-11-16 18:38

Read more posts by this author