ex) 현재 열려있는 main.js파일은 모듈이라고 부를 수 없다
왜? -> main.js 파일은 js의 가져오기, 내보내기 문법이 아직 작성이 되어있지 않다.
export const hello = 'Hello world!'
import {hello} from './module.js'
--> 만들어진 각각의 모듈은 하나의 .js파일이다
<script type="module" src="./main.js"></script>
앞으로 만드는 다양한 프로젝트들은 어떠한 기능, 데이터들을 파일로 구분하고, 파일로 구분하는 개념 자체가 "모듈화"이다. 최대한 모듈화된 상태에서 프로젝트를 진행한다!
export default 123
export const str = 'ABC'
export const arr = []
export const hello = () => {}
export function hello() {}
import number, {str, arr, hello} from './module.js'
console.log(number) //123
console.log(str) // ABC
console.log(arr) // []
console.log(hello) // f hello () {}
정리
하나의 js파일을 통해서 export 키워드로 어떠한 데이터를 내보낼 수 있는데 내보내는 패턴은 크게 두가지
1. 기본내보내기(데이터 이름이 없고 단지 default로 가져와진다)
2. 이름내보내기(데이터이름 명확하게 있는)
위에 내보내진 데이터를 가져오기 위해서는 import라는 키워드를 사용하고 기본내보내기는 내가 데이터를 가지고 올 때 이름을 지정할 수있고 이름 내보내기는 가지고 올 때 그 이름 그대로 중괄호 부분에 쉼표로 구분을 해서 가지고 올 수 있다.
필요가 없는 데이터는 안가지고 오면된다.
가져오지 않는 데이터를 출력하려고 하면 undefined라고 나온다.
다른 변수명으로 가져오기 . str은 undefined가 된다.
import {str as xyz, arr, hello} from './module.js'
모든 데이터를 하나의 변수에 할당하기
import * as abc from './module.js'
console.log(abc) // 하나의 객체 데이터가 출력
Js 작성할 때 주의할 점 : import라는 키워드는 항상 js의 최상단에 작성.
코드 중간에 모듈이 필요할 때는 import로 가져올 수 없다.
js 코드 중간에서 모듈을 가져와야 하는 상황이 있다면 import라는 함수를 통해서 해당하는 모듈을 가지고 올 수 있으며, 가지고 오는데 시간이 얼마나 걸리는지 알 수 없기 때문에 모듈을 다 가지고 오면 then()이라는 메소드가 실행될 수 있는 구조이고, then()이라는 메소드가 실행이 되면 메소드 콜백에 매개변수로 가지고 온 정보를 (import키워드를 사용할 때 와일드카드로 abc변수에 넣는 것처럼, )abc라는 이름의 매개변수로 넣어서 내부에서 사용할 수 있다.
비동기 패턴
setTimeout(async () => {
const abc = await import('./module.js')
console.log(abc)
}, 1000)
setTimeout(() => {
import('./module.js').then(abc => {})
console.log(abc)
}, 1000)
--> import라는 함수는, 비동기라는 개념으로 동작을 하고 then이라는 메소드를 뒤쪽에 붙여서 사용하거나, async, await 패턴으로 코드를 작성할 수 있다.
--> import 함수를 통해서 코드의 중간에서 모듈을 동적으로 가져와서 사용할 수 있다!
import {a , b} from './utils.js'
console.log(a()) //123
console.log(b()) //456
export { a } from './a.js'
export { b } from './b.js'
export const a = () => 123
export const b = () => 456