보통 우리가 사용하는 import와 export는 모두 정적인 방식이며, 문법이 단순하고 제약사항이 있다.
모듈 경로에는 원시 문자열만 들어갈 수 있기 때문에 함수 호출 결과값을 경로로 쓰는 것이 불가능하다.
import ... from getModuleName(); // 에러 발생 / 문자열만 허용
if(...) {
import ...; // 모듈을 조건부로 불러올 수 없으므로 에러 발생
}
{
import ...; // import문은 블록 안에 올 수 없으므로 에러 발생
}
Import / export는 코드 구조의 중심을 잡아주는 역할이기 때문이다.
코드 구조를 분석해 모듈을 한데 모아 번들링하고, 사용하지 않는 모듈은 제거해야 하는데,
코드 구조가 간단하고 고정되어 있을 때에만 위와 같은 역할을 할 수 있다.
import(module) 표현식은 모듈을 읽고, 이 모듈이 내보내는 것들을 모두 포함하는 객체를 담은 이행된 Promise를 반환한다.
(호출은 어디서나 가능하다.)
import(modulePath)
.then(obj => <모듈객체> )
.catch(err => <로딩 에러, e.g. 해당하는 모듈이 없는 경우>)
let module = await import(modulePath)
// say.js 파일에 export default 모듈 추가
export default function () {
alert(...)
}
const obj = await import('./say.js');
const say = obj.default;
say();
출처
JSINFO