본문 바로가기
programming language/Node.js

모듈 시스템

by cariño 2022. 9. 20.
728x90
반응형

분리된 하나의 파일을 모듈이라고 한다.

이러한 모듈을 언제든지 불러오는 방법을 모듈 시스템이라고 한다. 

js에서 모듈 시스템이 있기 전에는 브라우저에서 script파일을 선언해서 불러 올 수 있다. 

하지만 이러한 방법은 하나의 파일에 있는 것처럼 전역 스코프를 공유하게 된다.

즉 전역 스코프를 공유한다는 문제점이 생긴다. 

 

//a.js
let number = 10
//b.js
let number = 20
//index.html
<script src="./a.js"></script>
<script src="./b.js"></script>
<script>
    console.log('number: ', number);
</script>
//number: 20

number를 콘솔에 출력했을 때 20이 출력됨을 확인할 수 있다. 

b.js파일을 가장 마지막에 불러왔기때문에 덮어씌여졌다. 

 

이처럼 실제로 파일은 나누어져있지만 브라우저에서 동작할때는 마치 하나의 파일에 있는것처럼 동작하게 된다.

이렇게 이름이 같은 변수명이 있는 경우 의도하지 않은 값이 출력될 수 있다. 

애플리케이션의 규모가 커지면 커질 수록 파일을 각각 호율적으로 분리하는것이 중요하다.

모듈은 독립적으로 자신만의 스코프를 갖기때문에 문제를 해소할 수 있다. 


 

코드의 양이 많아질 수 록 전역스코프에 존재하는 변수명이 겹칠 수 있다.

이때 모듈로 분리하면 모듈만의 네임스페이스를 갖기 때문에 그 문제를 해결할 수 있다. 

재사용성 : 같은 코드를 반복하지 않고 모듈로 분리시켜서 필요할 때마다 재활용할 수 있다. 

 

[모듈 시스템 종류]

제정 시기 ES6에 제정됨 ESM 이전의 대표적인 비표준
문법(Node 기준) import / export require / module.export
Node.js 지원 여부 Yes Yes
Browser 지원 여부 최신 브라우저에서 지원 CommonJs.js 로딩 필요

 

  • AMD: 가장 오래된 모듈 시스템 중 하나로 require.js라는 라이브러리를 통해 처음 개발되었다.
  • CommonJS : NodeJS 환경을 위해 만들어진 모듈 시스템이다.
  • UMD: AMD와 CommonJS와 같은 모듈 시스템을 함께 사용하기 위해 만들어졌다.
  • ES Module: ES6(ES2015)에 도입된 자바스크립트 모듈 시스템이다. 

 

[ES6 모듈 시스템]

 

type="module"

모듈 시스템을 활용해서 해결하기 전에 script파일에 type="module"을 지정한다면 해당파일은 모듈로 간주하게 된다.

이 경우 number의 값은 출력이 되지 않는다. 이유는 각각의 모듈별로 스코프를 갖게 된다. 

해당 파일안에서 선언한 것은 파일 안에서만 사용할 수 있다.

 

//index.html
<script type="module" src="./a.js"></script>
<script type="module" src="./b.js"></script>
<script type="module">
    console.log('number: ', number);
</script>

//Uncaught ReferenceError: number is not defined

 


 

ES6 모듈 시스템 불러오기

각각 모듈의 자원을 가져올 수 있다. 

//index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="module" src="./index.js"></script>
</head>

<body>
</body>

</html>

 

//index.js

// import * as math from './math.js'

// console.log('perfectScore: ', math.perfectScore);
// console.log('sum: ', math.sum(80, 10));
// console.log('avg: ', math.avg(40, 40));

import { perfectScore, sum, avg } from './math.js'

console.log('perfectScore: ', perfectScore);
console.log('sum: ', sum(80, 10));
console.log('avg: ', avg(40, 40));

 

ES6 모듈 시스템 내보내기

모듈에서는 변수나 함수 또는 클래스 자원을 내보낼 수 있다.

//math.js

export const perfectScore = 100

export const sum = (num1, num2) => {
    return num1 + num2
}

export const avg = (num1, num2) => {
    return (num1 + num2) / 2
}

 


 

내보내기 1

하나의 기본 함수 내보내기. 단, 모듈 당 하나만 가능

export default 함수명

 

//index.js

const subtract = (num1, num2) => {
    return num1 - num2
}

export default subtract;

 

default를 함수로 선언한 경우에는 default 함수를 import받을 수 있다.

default함수는 이름을 마음대로 지정할 수 있다. 

//math.js

//import subtract from './math.js'
import subtract2 from './math.js' //함수 명 무관
console.log('subtract: ', subtract(100, 20));

 

내보내기 2

ES모듈로 내보낼 때 각각의 함수나 변수를 따로 내보낼 수 도 있지만 하나의 기본값으로도 전달 할 수 있다. 

 

//index.js

import math from './math.js'

console.log('perfectScore: ', math.perfectScore);
console.log('sum: ', math.sum(80, 10));
console.log('avg: ', math.avg(40, 40));
console.log('subtract: ', math.subtract(100, 20));

//perfectScore:  100
//sum:  90
//avg:  40
//subtract:  80

 

//math.js

const perfectScore = 100

const sum = (num1, num2) => {
    return num1 + num2
}

const avg = (num1, num2) => {
    return (num1 + num2) / 2
}

const subtract = (num1, num2) => {
    return num1 - num2
}

export default {
    perfectScore,
    sum,
    avg,
    subtract,
};

 


 

[CommonJS 방식]

NodeJS 환경에서 자바스크립트 모듈을 사용하기 위해 만들어진 모듈 시스템이다.

모듈을 외부에서 사용할 수 있도록 내보낼 때: exports, module.exports 

외부에서 모듈을 불러올 때: require

 

내보내기1

//math.js

exports.perfectScore = 100

exports.sum = (num1, num2) => {
    return num1 + num2
}

exports.avg = (num1, num2) => {
    return (num1 + num2) / 2
}

exports.subtract = (num1, num2) => {
    return num1 - num2
}

 

내보내기2

하나의 객체처럼 내보내기

//math.js

const perfectScore = 100

const sum = (num1, num2) => {
    return num1 + num2
}

const avg = (num1, num2) => {
    return (num1 + num2) / 2
}

const subtract = (num1, num2) => {
    return num1 - num2
}

module.exports = {
    perfectScore,
    sum,
    avg,
    subtract,
};

 


 

불러오기1

전개구문으로 받아올 때는 객체명 제거 후 사용

//index.js

const { perfectScore, sum, avg, subtract } = require('./math')

console.log('perfectScore: ', perfectScore);
console.log('sum: ', sum(80, 10));
console.log('avg: ', avg(40, 40));
console.log('subtract: ', subtract(100, 20));

 

불러오기2

하나의 객체로도 받아올 수 있다.

//index.js
const math = require('./math')

console.log('perfectScore: ', math.perfectScore);
console.log('sum: ', math.sum(80, 10));
console.log('avg: ', math.avg(40, 40));
console.log('subtract: ', math.subtract(100, 20));

실행결과
node index.js
perfectScore:  100
sum:  90
avg:  40
subtract:  80

 

 


 

[ES Module for Node JS]

Node JS환경에서 ES모듈 시스템을 활용해보기

ES모듈을 사용하려면 트렌스컴파일러를 사용했었어야 했는데, 버전이 올라가면서 정식 지원이 시작됐다.

 

사용법1.

package.json -> type="module"선언

//package.json
{
    "type": "module"
}

 

 

728x90

'programming language > Node.js' 카테고리의 다른 글

AWS_S3 client 배포하기  (1) 2022.12.01
React 로그인 API _ 2 (서버만)  (0) 2022.11.06
express 사용해 보자!  (0) 2022.10.24
Webpack  (0) 2022.09.20
Node.js  (0) 2022.09.20

댓글