❓ 모듈
- 자바스크립트 초창기에는 스크립트의 크기가 작고 단순하여 모듈 관련 표준 문법이 없었다. 하지만 개발 규모가 커짐에 따라 파일을 여러 개로 분리하게 되었고, 그 시도가 모듈 시스템으로 이어졌다.
- '모듈(module)' 은 특정한 기능을 가진 클래스나 함수로 구성된 라이브러리로 분리된 각각의 파일을 일컫는다.
- '모듈 시스템' 은 모듈을 생성하고, 불러오고, 사용하는 드으이 모듈을 다루는 다양한 기능을 제공하는 시스템이다.
💻 모듈의 종류
★ CommonJS
- Node.js 서버를 위해 만들어진 모듈 시스템
- require()와 module.exports를 사용
- 동기적으로 동작한다.
module.exports
- 여러 프로퍼티, 단일 프로퍼티 가능
- 사용 권장
const obj = {
function func1 (param) { ... },
function func2 (param) { ... },
}
module.exports = fun1;
module.exports = { fun1: func1, fun2: fun2 }
module.exports = { fun1, fun2 }
module.exports = obj;
const obj = require('./func');
obj.func1(10);
const {fun1, fun2} = require('./func');
func1(10);
exports
function func1 (param) { ... }
function func2 (param) { ... }
exports.fun1 = fun1;
exports.fun2 = fun2;
const obj = require('./func');
obj.func1(10);
obj.func1(20);
AMD
- Asynchronous Module Definition
- 모듈을 선언하면서 의존하고 있는 모듈을 함께 명시
- 비동기적으로 의존 모듈을 불러온다.
- 브라우저에서 사용 가능하다.
- require.js라는 라이브러리를 통해 처음 개발되었다.
- 최근에는 많이 사용되지 않는다.
define(['module'], function(module){
return function(){ ... }})
UMD
- Universal Module Definition
- AMD와 CommonJS 두 방식을 모두 지원하기 위해 제작
- 클라이언트, 서버 어디에서나 작동 가능
(function (root, factory){
if (typeof exports === 'object' && module.exports){
module.exports = factory(require('module'))
} else if (typeof define === 'function' && define.amd){
define(['module'], function(module){ })
} else {
root.global = factory(root.module)
}(this, function (module){
★ ES6-Module
- ES6 이후로 브라우저에서 지원하는 모듈 시스템
- 인터넷 익스플로어, 모바일 등에서 지원 x
- import, export 사용
- nodeJS 에서 사용할 경우 따로 "type"이 "module"임을 지정해줘야하며, commonJS와 혼용할 수 없다.

export, import
- 내보내고 싶은 함수, 변수 앞에
export를 붙인다.
export function func1 (num) { ... }
const func2 = function (num) { ... }
export { func2 }
import { func1, fun2 } from './func.ㅓ누 '
func1(10)
import * as obj from './func'
obj.func1(10)
obj.func2(20)
export default, import
- 중괄호 삭제
- 내보냈던 쪽에서 사용한 명칭을 그대로 사용할 필요는 없다.
export default obj = {
func1: function (num) { ... },
func2: function (num) { ... }
}
export function func1 (num) { ... }
import testObj, { func1 } from './func'
testObj.func1(10)
testObj.func2(20)
브라우저에서 사용하기
- type를 module로 명시
- import 하는 파일 뒤에 js 확장자 명시
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script type="module" src="func.js"></script>
<script type="module">
import { func1, fun2 } from './func.js';
func1(10)
</script>
</head>
<body></body>
</html>