JS에서 모듈은 하나의 파일을 의미하며, 대개 클래스 하나 혹은 복수의 함수로 구성된 라이브러리 하나로 구성된다.
CommonJS와 ES Modules은 JS에서 가장 자주 마주치게 될 키워드일텐데, 이것이 무엇인지, 어떤 차이점이 있는지에 대해 다시 한 번 짚고 넘어가보자.
과거에는 JS의 크기도 작고 기능도 단순했기에 굳이 모듈 관련 표준 문법을 만들 필요가 없었다.
하지만 스크립트의 크기가 커지고 기능도 복잡해지며 모듈 시스템의 필요성이 생기자 여러 시행착오를 거치며 AMD, CommonJS, UMD라는 모듈 시스템들이 등장하였다.
모듈 시스템은 2015년에 표준으로 등재되었으며, 관련 문법은 진화를 거듭해 이제는 대부분의 주요 브라우저와 Node.js에서 모듈 시스템을 지원하고 있다.
// add.js
module.exports.add = (x, y) => x + y;
// main.js
const { add } = require('./add');
add(1, 2);
Node.js에서 JavaScript 모듈화를 지원하기 위해 만들어진 표준이다.
require
와 module.exports
를 사용해 모듈을 가져오고 내보내는 방법으로 사용한다.require
나 module.exports
를 브라우저가 이해하지 못하기 때문. type="module"
등의 처리가 필요.// add.js
export function add(x, y) {
return x + y
}
// main.js
import { add } from './add.js';
add(1, 2);
ES6(ES2015)에서 표준 모듈 시스템을 도입하면서 탄생하였다.
import
와 export
를 사용해 모듈을 가져오고 내보낸다.strict mode
가 기본적으로 지원된다.type: "module"
설정을 통해 동작할 수 있다.ESM에서 CJS를
import
할 수 있지만, CJS에서 ESM을require
할 수는 없다. CJS는 Top-level Await을 지원하지 않기 때문…
특징 | CommonJS | ESM |
---|---|---|
키워드 | require , module.exports | import , export |
로드 방식 | 동기적 로드 | 비동기적 로드 |
환경 | Node.js (기본 지원) | Node.js(type: "module" ) 및 브라우저 |
트리 셰이킹 지원 | 지원하지 않음 | 지원 |
기본 내보내기 방식 | 객체를 내보냄 | 여러 개 또는 기본값 내보냄 |
JavaScript modules - JavaScript | MDN
자바스크립트의 표준 정의 : CommonJS vs ES Modules
CommonJS에서 ESM으로 전환하기 - tech.kakao.com