export : 공개가 필요한 리소스에 한정하여 명시적으로 선택적 공개
import : 모듈이 공개한 리소스중 일부or전체를 자신의 스코프 내로 불러들임
원래는 파일 스코프와 ,export,importf를 지원하지 않았다
웹 페이지의 단순한 처리를 위한 언어였으니
클라이언트 사이드 자바스크립트는 script 태그를 통해 외부 파일을 로드할 수 있지만 파일마다 독립적인 스코프를 갖지 않는다
script 태그로 여러 자바스크립트 파일을 로드해도 하나의 전역을 공유함
현재 Node.js는 모듈 시스템을 지원함 -> 파일별로 파일 스코프 갖음
IE를 제외한 대부분의 브라우저에서 사용 가능
script 태그에 type="module" 어트리뷰트를 추가하면 됨
파일 확장자는 일반 자바스크립트 파일과 구별을 위해 .mjs 추천
strict 모드 적용이 기본
일반 자바스크립트 파일은 script 태그로 분리해 로드해도 하나의 전역
//temp1.js
var name = 'Sam';
console.log(window.name);
//temp2.js
console.log(name);
//temp.html
<script src="./temp1.js"></script>
<script src="./temp2.js"></script>
// teml.html의 콘솔창에는 Sam이 두번 찍힌다
//temp.html
<script src="./temp1.js" type="module"></script>
<script src="./temp2.js" type="module"></script>
// 파일 자체 모듈 스코프 제공, var로 선언해도 전역 객체의 프로퍼티가 아님
export const name = 'Sam';
export function square(x){
return x*x;
}
//lib.mjs
const name = 'Sam';
function square(x){
return x*x;
}
export {name, square};
import {name,square} from './lib.mjs';
import * as lib from './lib.mjs';
lib.name; // 'Sam'
lib.square(2); // 4
import {name as N,square as S} from 'lib.mjs';
// 이름 없이 바로 하거나
export default x=>x*x;
// const,let,var 쓰면 에러
export default const square = x => x*x;
//따로 선언을 하고 export default 이름
const square = x => x*x;
export default square;
//lib.mjs
export default x => x*x;
// app.js
import square from './lib.mjs'; // 맘대로 작명
import 제곱 from './lib.mjs'; // 맘대로 작명