모듈(Module)
특정한 기능을 하는 함수나 변수들의 집합
재사용 가능한 코드 조각
- 장점
- 코드 추상화
- 코드 캡슐화
- 코드 재사용
- 의존성 관리
모듈은 module.exports 또는 exports 객체를 통해 정의하고 외부로 공개한다.
공개된 모듈은 require 함수를 사용하여 import 한다.
모듈 만들기
하나의 모듈 파일에 하나 만들기
// func.js
function connect() {
return a + b;
}
module.exports = connect;
module.exports에는 하나의 값(원시 타입, 함수, 객체)을 할당할 수 있다.
하나의 모듈 파일에 여러 개 만들기
// var.js
const a = "a 변수";
const b = "b 변수";
module.exports = {
a,
b
};
export와 export default의 차이
export {} (named export) | export default |
반드시 export한 객체/함수 이름으로만 import할 수 있다. | export한 객체/함수 이름과 상관없이 개발자가 원하는 이름으로 import할 수 있다. |
반드시 import할 때 중괄호{}로 가져와야 한다. | import할 때 중괄호{}를 작성할 필요 없다. |
한 모듈 내에 여러 가지를 export시 사용한다. | 한 모듈 내에 export하는 대상이 하나일 때 사용한다. |
모듈은 크게 두 종류로 나뉜다고 한다.
- 복수의 함수가 있는 라이브러리 형태의 모듈
- 개체 하나만 선언되어 있는 모듈
대개는 두 번째 방식으로 모듈을 만드는 것을 선호하기 때문에 함수, 클래스, 변수 등의 개체는 전용 모듈 안에 구현된다.
그런데 이렇게 모듈을 만들다 보면 자연스레 파일 개수가 많아질 수 밖에 없다. 그렇더라도 모듈 이름을 잘 지어주고, 폴더에 파일을 잘 나눠 프로젝트를 구성하면 코드 탐색이 어렵지 않으므로 이는 전혀 문제가 되지 않는다고 한다.
export default를 사용하면 '해당 모듈에는 개체가 하나만 있다'는 사실을 명확히 나타낼 수 있다. 즉, 파일 하나엔 대개 export default가 하나만 있다.
// user.js
export default class User {
constructor(name) {
this.name = name;
}
}
// main.js
import User from './user.js';
new User('John');
export default는 파일당 하나만 있으므로 이 개체를 가져오려는 모듈에서는 중괄호 없이도 어떤 개체를 가지고 올지 정확히 알 수 있으므로 이름이 없어도 괜찮다.
모듈 불러오기
// const{ }로 모듈을 가져올 때는 구조분해하여 가져오기 때문에 이름이 동일해야 한다.
const {a, b} = require("./var.js");
// 하나의 모듈 파일에 하나만 내보낸 모듈은 다름으로 불러올 수 있다.
const returnString = require("./func.js");
만약 pacakge.json에 "type": "module"을 추가하면, require 대신 import를 사용한다.
참고 자료
[포스코X코딩온] KDT-Web-8 4주차 회고 3 - Node.js & 동기, 비동기
[Javascript] export와 export default의 차이점