모듈
- 애플리케이션을 구상하는 개별적 요소로서 재사용 가능한 코드 조각
- 세부사항을 캡슐화 및 공개가 필요한 API만을 외부에 노출

- 모듈은 파일 단위로 분리
- 명시적으로 모듈을 로드하여 재사용
- 즉, 분리되다가도 로드에 의해 애플리케이션의 일원이 됨
- 개발 효율성과 유지보수성을 높인다.
전역 객체(Global Object)
- 자바스크립트 파일을 여러 개의 파일로 분리하여 script 태그로 로드하여도
- 분리된 자바스크립트 파일들이 결국 하나의 자바스크립트 파일 내에 있는 것처럼 하나의 전역 객체를 공유한다.
- 따라서 분리된 자바스크립트 파일들이 하나의 전역을 갖게 되어 전역 변수가 중복되는 등의 문제가 발생할 수 있다. 이것으로는 모듈화를 구현할 수 없다.
type="module"
어트리뷰트
모듈 스코프
- ES6 모듈은 파일 자체의 스코프를 제공
- 즉, 독자적인 모듈 스코프를 갖는다.
- 따라서, 모듈 내에서 var 키워드로 선언한 변수는 더 이상 전역 변수가 아니며
- window 객체의 프로퍼티도 아니다.
ES5 모듈
var x = 'foo';
console.log(window.x);
var x = 'bar';
console.log(window.x);
//ES5
<html>
<body>
<script src="foo.js"></script>
<script src="bar.js"></script>
</body>
</html>
ES6 모듈
var x = 'foo';
console.log(x);
console.log(window.x);
var x = 'bar';
console.log(x);
console.log(window.x);
//ES6
<!DOCTYPE html>
<html>
<body>
<script type="module" src="foo.mjs"></script>
<script type="module" src="bar.mjs"></script>
</body>
</html>
export 키워드
- 모듈은 독자적인 스코프를 갖기 때문에
- 선언한 모든 식별자는 기본적으로 해당 모듈 내부에서만 참조 가능
- 만약 모듈 안에서 선언한 식별자를 외부에 공개하여 참조가능하게 하고 싶다면
export
키워드 사용하여
- 선언된 변수, 함수, 클래스 모두 export (내보내기) 할 수 있다.
선언문 앞에 export 키워드
export const pi = Math.PI;
export function square(x) {
return x * x;
}
export class Person {
constructor(name) {
this.name = name;
}
}
한번에 export
const pi = Math.PI;
function square(x) {
return x * x;
}
class Person {
constructor(name) {
this.name = name;
}
}
export { pi, square, Person };
import 키워드
- 모듈에서 내보낸(export) 대상을 로드하려면
import
키워드 사용
식별자로 import 하기
import { pi, square, Person } from './lib.mjs';
console.log(pi);
console.log(square(10));
console.log(new Person('Lee'));
한꺼번에 import 하기
import * as lib from './lib.mjs';
console.log(lib.pi);
console.log(lib.square(10));
console.log(new lib.Person('Lee'));
이름 변경하여 import 하기
import { pi as PI, square as sq, Person as P } from './lib.mjs';
console.log(PI);
console.log(sq(2));
console.log(new P('Kim'));
모듈에서 하나만 import 하기
default
키워드 사용
default
사용 시 var,let,const 사용 불가
default
키워드로 내보낸 모듈은 {..}
없이 임의의 이름으로 import 한다.
export default function (x) {
return x * x;
}
export default () => {};
export default const foo = () => {};
import square from './lib.mjs';
console.log(square(3));