js는 파일을 나누어 작성하고 분리하여도 js들은 똑같이 하나의 전역스코프를 가진다. 그렇기에 전역변수를 공용하여 전역 변수가 중복되는 등의 문제가 발생할 수 있다

script 태그에 type="module"  어트리뷰트를 추가하면 로드된 자바스크립트 파일은 모듈로서 동작한다. ES6 모듈의 파일 확장자는 모듈임을 명확히 하기 위해 mjs를 사용하도록 권장한다.

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

export 키워드

모듈들은 각자의 스코프를 가지기 때문에 외부의 파일에서 모든 식별자들을 사용할 수 없다 이때 export키워드를 사용해서 참조할 수 있도록 한다. 선언된 변수, 함수, 클래스 모두 export할 수 있다.

// lib.mjs
// 변수의 공개
export const pi = Math.PI;

// 함수의 공개
export function square(x) {
  return x * x;
}

// 클래스의 공개
export class Person {
  constructor(name) {
    this.name = name;
  }
}

// 하나하나 export를 붙이기 귀찮다면
// 변수, 함수 클래스를 하나의 객체로 구성하여 공개
export { pi, square, Person };

import 키워드

export한 식별자들을 사용할 때 import 키워드 쓴다

// app.mjs
// 같은 폴더 내의 lib.mjs 모듈을 로드.
// lib.mjs 모듈이 export한 식별자로 import한다.
// ES6 모듈의 파일 확장자를 생략할 수 없다.
import { pi, square, Person } from './lib.mjs';

console.log(pi);         // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }

// 식별자를 지정하지 않고 한번에 가져올 수 있음
// 지정이름의 프로퍼티로 사용함
import * as lib from './lib.mjs';

console.log(lib.pi);         // 3.141592653589793
console.log(lib.square(10)); // 100
console.log(new lib.Person('Lee')); // Person { name: 'Lee' }

이름을 변경하여 import할 수도 있다.

// app.mjs
import { pi as PI, square as sq, Person as P } from './lib.mjs';

console.log(PI);    // 3.141592653589793
console.log(sq(2)); // 4
console.log(new P('Kim')); // Person { name: 'Kim' }
import {pi, square, Person} from './lib.mjs';
import * as dmd from './lib.mjs';
import {pi as pi, }

모듈에서 하나만을 export할 때는 default 키워드를 사용할 수 있다.

다만, default를 사용하는 경우, var, let, const는 사용할 수 없다.