export [default] class/function/variable ...
export {x [as y], ...}
.export {x [as y], ...} from "module"
export * from "module"
(default export는 다시 내보내 지지 않음)export {default [as y]} from "module"
(default export를 다시 내보냄)가져오기 타입 역시 정리해 봅시다.
import {x [as y], ...} from "mod"
import x from "mod"
import {default as x} from "mod"
import * as obj from "mod"
import "mod"
import/export
문은 스크립트의 맨 위나 맨 아래에 올 수 있는데 이 둘엔 차이가 없습니다.
따라서 아래 스크립트는 문제없이 잘 동작합니다.
sayHi();
// ...import {sayHi} from './say.js';
// import 문을 파일 맨 아래에 위치시킴
대개는 편의상 스크립트 맨 위에 import 문을 위치시킵니다.
import/export 문은 블록 {...}
안에선 동작하지 않는다는 점에 유의하시길 바랍니다.
조건을 충족하면 모듈을 가져오려는 의도로 작성된 아래 코드는 동작하지 않습니다.
if (something) {import {sayHi} from "./say.js"; // 에러: import 문은 최상위 레벨에 위치해야 합니다.}
그런데 애플리케이션을 작성하다 보면 조건에 따라 모듈을 가져와야 하거나 어떤 특정 시점에 모듈을 불러와야 하는 경우가 생깁니다. 이럴 땐 어떤 방법을 사용해야 할까요? 요청이 있을 때만 모듈을 불러오는 게 가능할까요?
동적으로 모듈을 가져오는 방법(dynamic import)은 다음 챕터에서 알아보자!
⇒ 13-2-0.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Import & Export HTML</title>
</head>
<body>
<script type="module" src="13-2-0-export.js"></script>
<script type="module" src="13-2-0-import.js"></script>
<script type="module" src="13-2-0-user.js"></script>
</body>
</html>
⇒ 13-2-0-export.js
// 13-2-0-export.js >>> 13-2-0-import.js 와 연계 파일
/* 선언부 앞에 export 붙이기
변수나 함수, 클래스를 선언할 때 맨 앞에 export를 붙이면 내보내기가 가능
*/
// 배열 내보내기
export let days = ['sun', 'mon', , 'tue', , 'wed', , 'thr', , 'fri', , 'sat'];
// 상수 내보내기
export const MODULSE_BECAME_STANDARTD_YEAR = 2024;
// 클래스 내보내기
export class Pcy {
constructor(name){
this.name = name;
}
}
// ================================================================
/* 선언부와 떨어진 곳에 export 붙이기
선언부와 export가 떨어져 있어도 내보내기가 가능
*/
function sayHi(user){
alert(`Hi, ${user} ~`);
}
function sayBye(user){
alert(`Good Bye, ${user} ~`);
}
export {sayHi, sayBye}; // 두 함수를 내보냄
⇒ 13-2-0-user.js
/* export default
모듈은 크게 두 종류로 나뉩니다.
1. 복수의 함수가 있는 라이브러리 형태의 모듈(위 예시의 say.js)
2. 개체 하나만 선언되어있는 모듈(아래의 user.js. class User 하나만 내보내기 함)
모듈은 export default라는 특별한 문법을 지원합니다.
export default를 사용하면 '해당 모듈엔 개체가 하나만 있다’는 사실을 명확히 나타낼 수 있습니다.
내보내고자 하는 개체 앞에 export default를 붙여봅시다.
*/
// 📁 user.js
export default class User { // export 옆에 'default'를 추가해보았습니다.
constructor(name) {
this.name = name;
alert(`My Name is ${this.name}`);
}
}
⇒ 13-2-0-import.js
// 13-2-0-import.js >>> 13-2-0-export.js 와 연계 파일
/* import *
무언갈 가져오고 싶다면 아래와 같이 이에 대한 목록을 만들어 import {...}안에 적어주면 됨
*/
// 📁 13-2-0-export.js
import {sayHi, sayBye} from './13-2-0-export.js';
sayHi('John'); // Hello, John!
sayBye('John'); // Bye, John!
// ==========================================================================
// 📁 13-2-0-user.js
import User from './13-2-0-user.js'; // {User}가 아닌 User로 클래스를 가져왔습니다.
new User('PCY');
⇒ 결과
import
/export
는 코드 구조의 중심을 잡아주는 역할을 수행한다.