NodeJS - Patterns

원문 https://darrenderidder.github.io/talks/ModulePatterns/ 요약

Node.js Module Patterns

이것은 같단한 모듈을 hello-module.js 소스에 선언한 것이다.

1
2
// hello-module.js
console.log("Hello World");

선언된 소스는 require() 로 들여올 수 있다:

1
require("hello-module.js");

Define a global

모듈 foo.js 를 글로벌

1
2
3
4
// foo.js
foo = function () {
console.log("Im foo");
};

모듈 foo.js를 들여와 전역에 선언된 함수 foo()를 사용한다.

1
2
require("foo.js");
foo();

그러나 글로벌 영역을 오염 시키지 않는다.

export an anonymous function

module 객체에 export 한다.

1
2
3
4
// bar.js
module.exports = function () {
console.log("Im bar");
};

모듈 bar.js를 들여와 전역에 선언된 함수 foo()를 사용한다.

1
2
var bar = require("./bar.js");
bar();

export a named function

module 객체의 이름 속성으로 export 한다.

1
2
3
4
// bar.js
module.fiz = function () {
console.log("fiz");
};

모듈 bar.js를 들여와 전역에 선언된 함수 foo()를 사용한다.

1
2
var fiz = require("./fiz.js").fiz;
fiz();

export an anonymous object

1
2
3
4
5
6
7
// buz.js
var Buz = function() {};

Buz.prototype.log = function() {
console.log('buz');
}
export.modules = new Buz();

모듈 buz.js를 들여와 객체의 메서드를 호출한다.

1
2
var buz = require("./buz");
buz.log();

export a named object

1
2
3
4
5
6
7
// buz.js
var Baz = function() {};

Baz.prototype.log = function() {
console.log('baz');
}
export.Baz = new Baz();

모듈 baz.js를 들여와 속성 메서드를 호출한다.

1
2
var baz = require("./baz.js").Baz;
baz.log();

export an anonymous prototype

module.exports 에 객체를 노출한다.

1
2
3
4
5
6
7
// doo.js
var Doo = function() {};

Doo.prototype.log = function() {
console.log('doo!');
}
export.exports = new Doo();

모듈 doo.js를 들여와 객체의 메서드를 호출한다.

1
2
3
var Doo = require("./doo.js");
var doo = new Doo();
doo.log();

export a named prototype

module 에 이름 속성을 노출한다.

1
2
3
4
5
6
7
// qux.js
var Qux = function() {};

Qux.prototype.log = function() {
console.log('qux!');
}
export.Qux = Qux;

모듈 qux.js를 들여와 객체의 메서드를 호출한다.

1
2
3
var Qux = require("./qux.js").Qux;
var qux = new Qux();
qux.log();

module.exports

modules.exports는 exports로 가명을 가지고 있다. 이름 있는 속성을 사용할 때 아래 같이 선언한다.

1
2
3
4
> module.exports.fiz = 'Fiz';
> exports.buz = 'buz';
> module.exports === exports;
true

exports 에 직접 대입하면 exports alias를 덮어 쓰게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> module.exports.qux = "qux";
> exports
{ qux: "qux" }
> exports === module.exports
true
> exports = "wobble wibble wubble!";
> exports === module.exports
false
> exports
"wobble wibble wubble!"
> module.exports
{ qux: "qux" }
// module.exports is canonical

pros, cons

  • Named exports: 한 모듈에 여러 개체 및 속성을 노출할 수 있다.
  • Anonymouse exports: 간단한 클라이언트 인터페이스로 적합