Javascript 에 Module 알아요?
# Do you know module in javascript?
Javascript 와 Typescript 에서 사용할 수 있는
module은 파일 안의 코드를 모듈화 하는 것이다.
Module 을 알면 React, Typescript 코드를 볼 때 어색하지 않다.
한 모듈은 한 파일 안에 작성된 코드를 말한다.
따로 모듈화하지 않으면 작성된 코드는 모두 global scope에 들어간다.
만약 2 ~ 3개의 파일에서 같은 이름의 함수를 구현한다면
test_script_01.js
getName() { ... }
test_script_02.js
getName() { ... }
test_script_03.js
getName() { ... }
getName 은 이름 충돌이 일어날 확률이 높고
앞으로 가져올 라이브러리에도 같은 이름의 함수가 포함될 확률이 있다.
모듈은 해당 자바스크립트 파일을
import 한 곳에서만 사용할 수 있도록 제한 한다.
코드로 보면...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>Document</title>
<script type="module" src="module_test1.js"></script>
<script type="module" src="module_test2.js"></script>
</head>
<body>
<h1>What is module?-_-</h1>
</body>
</html>
<script type="module" src="module_test1.js"></script>
위처럼 스크립트 태그에 type="module" 을 넣으면
모듈을 넣은 스크립트 즉,
module_test1.js
module_test2.js
파일들은 서로 바로 접근해서 서로의 함수 등을 사용할 수 없는 상태가 된다.
만약 서로 접근해서 사용하고 싶다면 아래와 같이 만들어 준다.
//module_test1.js
export default function plus(a, b) {
return a + b;
}
//한 파일에서 export default는 한 번만 사용할 수 있다
export function minus() {
return a - b;
}
export 는 다른 파일에서 사용할 수 있도록 만드는 것
//module_test2.js
import plus_func, {minus as minus_two} from './module_test1';
console.log(plus_func(2, 3));
import 는 다른 파일을 가져와서 사용하는 것
이 때 import하는 함수 이름은 위와 같이 원하는 대로 변경할 수 있다.
default 가 아닌 함수는 { ... } 안에 넣어서 import 하여 사용한다.
마찬가지로 import하는 함수 이름은 as 뒤에 원하는 대로 변경할 수 있다.
//module_test1.js
export const counter = 1;
export function plus(a, b) {
return a + b;
}
export function minus(a, b) {
return a - b;
}
default 없이 export 하고
//module_test2.js
import * as calc_module from './module_test1';
console.log(calc_module.counter);
console.log(calc_module.plus(2, 3));
console.log(calc_module.minus(2, 3));
모두 import 해서 변수, 함수 등을 사용할 수도 있다.
이처럼 모듈화를 이용하면
파일들 간에 중복되는 이름 충돌을 방지할 수 있고
모듈간 재사용성을 높여준다.