모듈(module): 애플리케이션을 구성하는 개별적 요소로서 재사용 가능한 코드 조각
모듈이 성립하려면 **파일 스코프(모듈 스코프)**를 가질 수 있어야 함
자신만의 파일 스코프를 갖는 모듈의 모든 자산은 캡슐화되어 다른 모듈에서 접근할 수 없음 (비공개 상태)
= 모듈은 개별적인 존재로서 애플리케이션과 분리되어 존재함
⇒ 하지만 모듈은 애플리케이션이나 다른 모듈에 의해 재사용되어야 의미가 있음.
모듈은 애플리케이션과 분리되어 개별적으로 존재하다가 필요에 따라 다른 모듈에 의해 재사용됨
모듈은 기능별로 분리되어 개별적인 파일로 작성되므로 코드의 단위를 명확히 분리하여 애플리케이션을 구성할 수 있고, 재사용성이 좋아서 개발 효율성과 유지 보수성을 높일 수 있음
#include
, 자바는 import
등)script
태그를 사용하여 외부 자바스크립트를 로드할 수는 있지만 파일마다 독립적인 파일 스코프를 갖지 않음자바스크립트를 클라이언트 사이드, 즉 브라우저 환경에 국한하지 않고 범용적으로 사용하려는 움직임이 생기면서 모듈 시스템은 반드시 해결해야 되는 핵심 과제가 됨
⇒ 이런 상황에서 제안된 것이 CommonJS와 AMD
자바스크립트 모듈 시스템은 크게 CommonJS와 AMD로 나뉘게 되었고, 브라우저 환경에서 모듈을 사용하기 위해서는 CommonJS 또는 AMD를 구현한 모듈 로더 라이브러리를 사용해야 하는 상황이 됨
이러한 상황에서 ES6에서는 클라이언트 사이드 자바스크립트에서도 동작하는 모듈 기능을 추가함
script
태그에 type=”module”
어트리뷰트를 추가하면 로드된 자바스크립트 파일은 모듈로서 동작함
<script type="module" src="app.mjs"></script>