NodeJS 모듈

jangdu·2023년 5월 22일
0

node.js

목록 보기
10/11

브라우저의 js와는 달리 node는 코드로 모듈을 만들 수 있다.
어떤 기능을 하는 함수나 변수의 집합을 모듈이라고하는데,
모듈은 그 자체가 하나의 프로그램이면서 다른 프로그램의 재료다.

Program -> 	js	->	프로그램 A
			js	-> 	프로그램 A
            js	-> 	프로그램 B

위에서 저 js가 모듈임 ㅇㅇ

재사용성이 강하다. 보통은 파일 하나를 모듈 하나로 만들고,
( 그래야 코드를 파일별로 나눠 관리하기 편함 )

node에서는 크게 두가지 형식으로 이 모듈을 사용한다.

CommonJS

CommonJS는 표준 js모듈은 아닌데, 가장 많이 쓰인다.

모듈을 만들 때는 모듈이 될 파일이랑 모듈을 불러와 사용 할 파일이 필요함

// var.js
const odd = '홀수';
const even = '짝수';

module.exports = {
  odd,
  even,
};

위 코드처럼 module.exports안에 넣으면,
이제 저거 모듈되는거임 ㅇㅇ

이걸 또 다른 모듈로 쓸 수 있다.

// func.js
const { odd, even } = require('./var');

function check(num){
  if (num % 2) {
    return odd;
  else {
    return even;
  }
}
  
module.exports = check;

require(파일경로): 불러올 모듈
이렇게 다른 모듈을 불러와서 사용하고,
또 다시 다른 모듈로 사용하고
이런식으로 사용하면 된다.

불러올때 변수명은 마음대로 할 수 있다.

// index.js
const {odd, even} = require('./var');
const checkNumber = require('./func');

function checkString (str) {
  if (str.length % 2) {
    return odd;
  }
  return even;
}

console.log(checkNumber(10));
console.log(checkString('hi'));

위 코드에서 index는 var.js랑 func.js 전부 참조한다.

exports객체 만으로도 모듈이 가능하다.
var.js를 아래 코드처럼 수정해도 똑같이 사용 가능

// var.js
exports.odd = '홀수';
exports.even = '짝수';

console.log(moule.exports === exports)하면 True나옴

exports객체는 module.exports랑 참조 관계인데
exports에는 반드시 속성명, 속성값을 대입해야한다.
다른 값을 넣을 경우 module.exports와의 관계가 끊어져서 모듈로 기능하지 않는다.
exports에는 반드시 객체에만 사용하자.

  • 여러파일에서 재사용할 함수나 변수는 모듈로 관리하자.
  • 모듈이 너무 많고 관계가 어지러우면 어려워짐

require

require는 함수다. require 함수는 객체로서 속성 몇가지를 지녔는데, 그중 cache랑 main을 알아보자

require.cache

한번 require한 파일은 require.cache안에 저장되고,
속성 값으로 각 파일 모듈 객체들이 들어있다.
한번 더 require을 하면, 이 cache안에 있는 친구들이 재사용됨

새로 하길 원할 때는 require.cache 속성을 제거해야한다.
프로그램 동작이 이상해질 수도 있어서 권장은 안함

require.main

노드 실행 시 첫 모듈을 가리키며, node require로 abc.js를 실행하면,
require.main은 abc.js가 된다.

현재 파일이 첫 모듈인지 알아볼 때 자주 사용하고, ( require.main === module )
첫 모듈 이름을 알아볼 때도 사용한다. (require.main.filename )

모듈1과 모듈2가 서로를 참조한다면, warning이 발생하는데,
이경우를 순환 참조(circular dependency)라고 함
순환참조는 순환 참조 당하는 대상의 객체를 비운다.
에러없이 warning으로만 객체를 비워버려서 나중에 큰일날지도?
이거 조심해서 모듈 구조 잡아야함

ECMAScript 모듈

ES모듈이라고도 하는데 이게 공식적인 js 모듈임,
node에서 아직은 Common많이 쓰는데, 조금 씩 표준ES로 늘어남

위 CommonJS에서 한 파일 ES모듈로 바꿔보면

// var.mjs
export odd = '홀수';
export even = '짝수';
// func.mjs
import { odd, even } from './var.mjs';

function check(num){
  if (num % 2) {
    return odd;
  else {
    return even;
  }
}
  
export default check;  
// index.mjs
import {odd, even} = from './var.mjs';
import checkNumber from './func.mjs';

function checkString (str) {
  if (str.length % 2) {
    return odd;
  }
  return even;
}

console.log(checkNumber(10));
console.log(checkString('hi'));

위 코드와 Common의 차이점은
require => import
exports => export
module.exports => export default
ES에서의 위 키워드들은 require같은 함수나 객체가 아닌 문법이다.

파일의 확장자는 mjs이고, import할 때 파일 경로에서 확장자도 기입해야함
mjs말고 js로 사용하려면 package.json에 type: 'module'속성 넣으면 됨

profile
대충적음 전부 나만 볼래

0개의 댓글