하나의 클래스, 혹은 특정한 목적을 가진 복수의 함수로 구성된 것을 모듈이라고 한다.
이후 설명할 require
와 exports
키워드를 사용하는 CommonJS는 Node.js 서버를 위해 만들어진 모듈 시스템이다. 여기서 모듈 시스템이란, 프로그램 코드를 기능별로 나눠서 독립된 파일에 저장하여 관리하는 방식이라고 할 수 있다.
export
와 import
와 같은 특수한 키워드를 통해 다른 모듈들을 불러와
불러온 모듈에 있는 함수를 호출하는 것과 같은 기능 공유가 가능하다.
🎃 require와 import의 공통점
하나의 파일에서 다른 파일의 코드를 불러온다는 동일한 목적을 가지고 있다.
require
/ exports
(CommonJS)
- NodeJS에서 사용되는 CommonJS 키워드
- 변수를 할당하듯 모듈을 불러온다.
// exports
const name = '고양이';
module.exports = name;
// require
const name = require('./module.js');
import
/ export
(ES6)
- ES6(ES2015)에서 새롭게 도입된 키워드
// export
const name = '고양이';
export default name;
// import
import name from './module.js'
exports
와 export
- exports는 CommonJS와 ES6라는 모듈 시스템에서 존재하는 객체이다.
- 모듈로부터 내보내지는 데이터들을 담고있는 하나의 객체인 것이다.
- ES6의
export default
는 CommonJS의module.exports
구문 동작을 대체하기 위한 문법이다.
// 모듈 전체를 export, 파일내 한번만 사용가능하다.
const obj = {
num: 100,
sum: function (a, b) {
console.log(a + b);
},
extract: function (a, b) {
console.log(a - b);
},
};
module.exports = obj;
// require
const obj = require('./exportFile.js');
obj.num; // 100
obj.sum(10, 20); // 30
obj.extract(10, 20); // -10
// 모듈 전체를 export, 파일내 한번만 사용가능하다.
const obj = {
num: 100,
sum: function (a, b) {
console.log(a + b);
},
extract: function (a, b) {
console.log(a - b);
},
};
export default obj;
// 전체 자체를 export 할 경우 중괄호 없이 그냥 씀
import obj from './exportFile.js';
obj.num; // 100
obj.sum(10, 20); // 30
obj.extract(10, 20); // -10
🎃 이것만 기억하자!
1. 여러개의 객체를 내보낼 때 →exports.변수
2. 딱 하나의 객체를 내보낼 때 →module.exports = 객체
// exports
exports.name = 'Ann'; // 변수
exports.sayHello = function() { // 함수
console.log('Hello World!');
}
exports.Person = class Person { // 클래스
constructor(name){
this.name = name;
}
}
// require
const { name, sayHello, Person } = require('./exportFile.js');
console.log(name); // Ann
sayHello(); // Hello World!
const person = new Person('inpa');
export const name = 'Ann'; // 변수의 export
export function sayHello() { // 함수의 export
console.log('Hello World!');
}
export class Person { // 클래스의 export
constructor(name){
this.name = name;
}
}
const name = 'Ann';
function sayHello() {
console.log('Hello World!');
}
class Person {
constructor(name){
this.name = name;
}
}
export {name, sayHello, Person}; // 변수, 함수, 클래스를 하나의 객체로 구성하여 export
import { name, sayHello, Person } from './exportFile.js';
- 개별로 export 된걸 * 로 한번에 묶고 as 로 별칭을 줘서, 마치 전체 export default 된걸 import 한 것 처럼 사용 가능하다.
import * as obj from './exportFile.js';
console.log(obj.name); // Ann
obj.sayHello(); // Hello World!
const person = new obj.Person('inpa');
- 많은 프로젝트에서 ES6 모듈 시스템을 점점 널리 사용하는 추세이지만,
- 항상
import
만을 사용하여 코딩할 수 있는 것은 아니다.<script>
태그를 사용하는 브라우저 환경, NodeJS에서 CommonJS를 기본 모듈 시스템으로 채택하고 있기 때문에- Babel과 같은 ES6코드를 변환해주는 도구를 사용할 수 없는 상황에선
require
를 사용해야 한다.
- require와 import는 모듈 키워드입니다.
- 외부 파일이나 라이브러리를 불러올 때 사용한다는 같은 목적을 가지고 있지만, 다른 문법구조를 가지고 있습니다.
- require는 exports와 함께 사용되며, NodeJS에서 사용되는 CommonJS의 키워드이고,
- import는 export와 함께 사용되며, ES6에서 새롭게 도입된 키워드입니다.
- Babel과 같은 ES6 변환도구가 없이는 CommonJS의 require, exports를 사용해야 합니다.
이 글은 아래의 글을 바탕으로 공부하며 개인적으로 정리한 글입니다.