ESM
ESM#
export import#
- 최상위 모듈스코프에서만 동작- { } 안에서는 동작하지 않는다.
 
- 코드가 최상위 모듈스코프의 어떤 위치에 있어도 상관 없다.
- 정적인 방식- import 문에 동적 매개변수를 사용할 수 없다. 
- 모듈 경로엔 원시 문자열만 들어갈 수 있다. 
- 함수 호출 결과값을 경로로 쓸 수 없다. 
- 런타임이나 조건부로 모듈을 불러올 수 없다. 
- 정적인 방식은 번들링 작업을 가능하게 한다. 
 
export#
변수/함수/클래스 의 선언부 앞에 export 를 붙인다.
클래스나 함수선언을 export 할 땐 세미콜론을 붙이지 않는다.
- 세미콜론은 표현식에서 붙인다.
선언부와 떨어진 곳에 export 붙이기
import#
import *#
- 코드가 짧아진다.
가져올 땐 대상을 명시하는 것이 좋은이유
- 웹팩과 같은 모던 빌드 툴 - 로딩 속도를 높이기 위해 모듈들을 모으는 번들링 최적화 수행
- 빌드툴은 실제 사용되는 함수만 번들링 결과물에 포함한다.
 
- 이름을 간결하게 써 준다. - say.sayHi()보다- sayHi()
- 코드 구조를 파악하기 쉬워 리팩토링, 유지보수에 도움 
as#
import 'as' 
- 모듈의 이름을 바꿔서 가져옴
export 'as'
named export 와 export default#
모듈의 종류
- 복수의 함수가 있는 라이브러리 형태 - 예제 say.js
- named export한 모듈
 
- 예제 
- 개체 하나만 선언 되어있는 모듈  - export default
 
| named export | export default | |
|---|---|---|
| import | {} 필요 | {} 불필요 | 
| export | 개체의 이름 필요 | 개체의 이름 없어도됨 | 
| 개수 | N 개 | 1개 | 
| export, import Name | 동일해야함 | 임의로 정할 수 있음 | 
export default#
export 옆에 'default' 추가
`옆javascript
// 📁 user.js
export default class {
constructor(name) {
this.name = name;
}
}
export, import 이름을 임의로 정할 수 있음.
하지만 코드의 일관성을 위해 파일이름과 동일한 것이 좋음.
- 강제 일관성을 위해서는 default 가 아닌 named export 를 사용할 수 있음.
default 키워드#
기본 내보내기를 참조하는 용도
export default / named export 혼용 가능#
- 으로 가져오기
모듈 다시 내보내기#
export User from './user.js' 는 에러
export * from './user.js' 
- default export 가 무시된다.
- named export 만 다시 보내진다.
named 와 default 를 동시에 내보내기
예시) npm 을 통해 외부에 공개할 패키지를 만드는 상황
폴더구조
auto/index.js 
- 진입점 역할을 하는 주요 파일
- 주요 파일을 통해 외부에 패키지를 노출시킨다.
import {login, logout} from 'auth/index.js'
- 개발자가 패키지를 사용하는 방법
동적으로 모듈 가져오기 import(module) 표현식#
import(module) 의 반환값#
- 이행된 프로미스 객체
- 프로미스의 값: 해당 모듈의 import, export 를 모두 포함하는 객체
특징#
코드 어디에서나 동적으로 사용 가능
named export
default export
동적 import 는 일반 스크립트에서도 동작한다.
- <script type="module"/>가 없어도 된다.
import() 는 함수 호출문법이 아니다.
- 변수에 복사할 수 없다.
- call, apply 를 쓸 수 없다.