ES6는 import/export 문법으로 모듈을 가져와 다른 파일에서 사용할 수 있다. 파일에서 모듈을 내보내는 두 가지 방법이 있는데, 이름이 지정된 내보내기(Named Export)와 기본 내보내기(Default Export)이다.
이 두가지 방법의 차이점은 무엇인지 명확히 하는 것을 넘어 JS의 모듈 개념에 대해 간단히 알아보았다.
Named Export 특징
- 한 파일 내에서 여러개의 변수/클래스/함수를 Export 할 수 있다.
- Import할 때 as
키워드를 사용해서 다른 이름을 지정할 수 있다.
Default Export 특징
- 한 파일 내에서 단 한개의 변수/클래스/함수만을 Export 할 수 있다.
- from 뒤에 명시한 파일에서 단 한개의 모듈만 가져오기 때문에 as
키워드 없이 원하는대로 이름을 바꿀 수 있다.
모듈이란 여러 기능들에 관한 코드가 모여있는 하나의 파일을 말한다. 모듈 개념을 활용은 아래의 장점이 있다.
네임스페이스란?
이름들을 한곳에 모아 충돌을 미리 방지하고, 해당 이름으로 선언된 변수와 함수를 쉽게 가져다 쓸 수 있는 인위적인 공간을 말한다.
자바스크립트는 네임스페이스 기능이 따로 없는 대신 객체 리터럴과 즉시 실행 함수(IIFE)를 통해 그 기능을 구현할 수 있다.
네임스페이스의 분류
빌트인(Built-in) 네임스페이스 > 전역(Global) 네임스페이스 > 지역(Local) 네임스페이스
명명된 내보내기를 사용하면 파일당 여러개의 명명된 내보내기를 가질 수 있다.
그런 다음 중괄호로 묶인 특정 내보내기를 가져온다. 가져온 모듈의 이름은 내보낸 모듈의 이름과 같아야 한다.
// import
// e.g. Importing a Single Named Export
import { MyComponent } from './MyComponent'
// e.g. Importing Multiple Named Exports
import { MyComponent, MyComponent2 } from './MyComponent'
// e.g. Giving a Named Import a Different Name by Using 'as'
import { MyComponent2 as MyNewComponent } from './MyComponent'
// Exports from ./MyComponent.js file
export const MyComponent = () => { ... }
export const MyComponent = () => { ... }
Export된 파일 내 모든 요소를 하나의 객체로 가져오는 방법
import * as MainComponents from './MyComponent'
모든 것을 하나의 객체에 담아 가져오면, 별도로 설정한 이름에 Dot 또는 Bracket Notation으로 객체 접근해서 프로퍼티와 메소드를 사용한다.
import * as testComponent from './test.js'
console.log(testComponent.getNumber())
console.log(testComponent.getString())
console.log(testComponent.getBoolean())
console.log(testComponent["getNumber"]())
console.log(testComponent["getString"]())
console.log(testComponent["getBoolean"]())
하나의 파일당 하나의 변수 또는 클래스만 Export할 수 있다.
// import
import MyDefaultComponent from './MyDefaultExport'
// export
const MyComponent = () => { ... }
export default MyComponent
한 파일당 하나의 모듈만 Export되기 때문에, Import 할 때 이름은 Export하는 이름과 상관 없이 원하는 이름을 사용할 수 있다.
main
Exported Value로 간주된다.
Cannot use import statement outside a module
오류가 발생하면 해당 JS파일이 모듈임을 명시해주어야 한다. 해결 방법은 아래와 같다.
<script type=‘module’ src=‘directory’>
명시하기”type”: “module”
추가하기글과 그림 ⓒ Wonkook Lee
References
🙏🏻 잘못된 정보가 있다면 지적해주세요