10장 모듈

10.1 클래스, 객체, 클로저를 사용하는 모듈

예제 1 모듈 정의

const BitSet = (function() {
	
	// 비공개 함수 및 상수
	function isValid(set, n) { ... }
	function has(set, byte, bit) { ... }
	const BITS = new Uint8Array([1,2,4,8,16,32,64,128]);
	const MASKS = new Uint8Array([~1,~2,~4,~8,~16,~32,~64,~128]);
	
	// 모듈의 공개 API는 여기서 정의하고 반환하는 BitSet 클래스 뿐임
	// 위에서 정의한 비공개 함수와 상수는 BitSet 클래스만 사용 가능
	// 클래스 사용자에게는 보이지 않음

	return class BitSet extends AbstractWritableSet {
		// 생략
	};

	}());

예제 2 정의한 모듈을 사용하는 법

const stats = (function() {
	// 모듈에서만 사용하는 비공개 유틸리티 함수
	const sum = (x,y) => x+y;
	const square = x => x * x;

	// 내보낼 공개 함수
	function mean(data) {
		return data.reduce(sum)/data.length;
	}

	// 내보낼 공개 함수 2
	function stddev(data) {
		let m = mean(data);
		return Math.sqrt(
			data.map(x => x - m).map(square).reduce(sum)/data.length-1);
		);
	}
	// 공개 함수를 객체 프로퍼티로 내보냄
	return {mean, stddev};
}());

// 모듈은 다음과 같이 사용
stats.mean([1,3,5,7,9]) // 5
stats.stddev([1,3,5,7,9]) // Math.sqrt(10)

10.1.1 클로저를 사용하는 자동 모듈화

const modules = {};
function require(moduleName) {return modules[moduleName];}

modules["sets.js"] = (function() {
	const exports = {};
	
	// set.js 파일 내용이 여기 들어감
	exports.BitSet = class BitSet { ... };

	return exports;
}());

modules["stats.js"] = (function() {
	const exports = {};
	const square = x => x*x;
	exports.mean = function(data) { ... };
	exports.stddev = function(data) { ... };
	
	return exports;
}());

// 필요한 모듈 또는 그 콘텐츠 참조를 가져옴
const stats = require("stats.js");
const BitSet = require("sets.js").BitSet;

// 모듈을 사용하는 코드를 작성
let s = new BitSet(100);
s.insert(10);
s.insert(20);
s.insert(30);
let average = stats.mean([...s]);

10.2 노드 모듈

10.2.1 노드 내보내기

예제 1