JS DEEPDIVE 공부정리용 글입니다.
독자적 파일 스코프를 가진 모듈의 모든 자산(모듈에 포함된 변수, 함수, 객체)은 기본적으로 비공개 상태
즉 모듈의 모든 자산은 캡슐화되어 다른 모듈에서 접근이 불가능하여 개별적 존재로 애플리케이션과 분리되어 존재함.
JS를 브라우저 환경에 국한하지 않고 범용적 사용을 위해 모듈 시스템이 필수가 되었고 그 결과 CommonJS와 AMD(Asynchronous Module Definition)이 제안됨.
ES6 모듈 사용법
- script 태그에 type="module" 어트리뷰트 추가
- 확장자 mjs
<script type="module" src="app.mjs"></script>
ESM이 아닌 일반적 JS는 독자적 X
예) 모듈 두개 만들고~ 스크립트 태그에 달아보자.
다른 모듈에서 각자 선언한 변수는 window(전역)변수로 선언되어 값이 덮어 씌워진다.
모듈은 독자적 모듈 스코프를 가지기에 모듈 내부에서 선언한 식별자를 해당 모듈 내부에서만 참조 가능하다.
그러므로 모듈 내부의 식별자를 외부에서 사용하기 위해선 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 };
// app.mjs
// 같은 폴더 내의 lib.mjs 모듈이 export한 식별자 이름으로 import한다.
// ESM의 경우 파일 확장자를 생략할 수 없다.
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' }
//
<!DOCTYPE html>
<html>
<body>
<script type="module" src="app.mjs"></script>
</body>
</html>
모든 export 식별자를 한 번에 import하기
// app.mjs // lib.mjs 모듈이 export한 모든 식별자를 lib 객체의 프로퍼티로 모아 import한다. 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' }
각 식별자 이름을 변경도 가능.
// app.mjs // lib.mjs 모듈이 export한 식별자 이름을 변경하여 import한다. 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' }
export default 키워드
- 이 경우는 var, let, const 키워드 사용불가
// lib.mjs export default x => x * x; // lib.mjs export default const foo = () => {}; // => SyntaxError: Unexpected token 'const' // export default () => {}; // app.mjs import square from './lib.mjs'; console.log(square(3)); // 9