개발하는 애플리케이션의 규모가 커지면 파일을 여러 개로 분리해야 하는 시점이 옵니다.
이때 분리된 하나의 파일을 모듈 이라고 부르는데, 모듈은 대게 클래스 한 혹은 목적을 가진 여러개의 함수를 포함하는 라이브러리로 구성되어 있습니다.
모듈은 단지 파일 하나에 불과합니다.
스크립트 하나는 모듈 하나입니다.
ES6에 도입된 자바스크립트 모듈 시스템입니다.
모듈을 외부에서 사용할 수 있도록 내보낼 때는 named export
,default export
와 같은 키워드를 사용하며,
외부에서 모듈을 불러올때는 import를 사용하여 모듈을 불러올 수 있습니다.
개발자가 지정한 파일은 entry point로 하여 나머지 파일들은 import문을 따라가며 찾습니다.
import 를 사용하여 모듈을 불러올 수 있습니다.
export 를 import 하는 경우 각각의 변수나 함수를 가져올 수 있습니다.
또한 * as 별칭
을 통하여 가져올 수 있습니다.
모듈을 비동기 환경에서 다운로드하며, import export 구문을 찾아 파싱한다.
EsModules는 실행해보지 않아도 import,export 에러를 감지할 수 있다.
config를 type='module'로 세팅 해주어야 사용할 수 있다.
top-level await가 가능하다.
NodeJs 환경에서 자바스크립트 모듈을 사용하기 위해 만들어진 모듈 시스템 입니다.
모듈을 외부에서 사용할 수 있도록 내보낼 때는 exports
,module.exports
와 같은 키워드를 사용하며, 외부에서 모듈을 불러올 때는 required
를 사용합니다.
// main.js
let count = require('./counter.js').count;
export message = 'hi';
// counter.js
let message = require('./main.js').message; // message 정의되어 있지 않음
setTimeout(() => console.log(message), 0); // CommonJS : undefined, ES Modules : 'hi'
순환 관계가 있을 때 CommonJs는 변수 값을 복사해서 사용하므로 main.js에서의 message가 할당 되어도 counter.js에서의 변수는 변하지 않는다.
하지만 ES Module에서는 같은 변수를 참조하고 있으므로 setTimout에서 제대로 할당된 변수가 출력된다.
ES Module은 위와 같이 순환 의존성을 지원한다.
리엑트에 서는 ESModules를 주로 사용합니다.
하지만 패키지 모듈들은 결국 CommonJs를 기본 모듈 시스템으로 선택하기 때문에, 코드 작성시 CommonJs로 변환해 주어야 하는데 해당 작업은 Babel이 수행합니다.
CommonJS와 비교하여 ESModules는 비동기로 동작하여 속도가 빠르고
실제 사용되는 부분만을 import(tree shaking)하여 메모리를 적게 차지하며, 가독성이 좋고 순환 의존성을 지원한다는 이점이 있습니다.