모듈은 간단히 말해 파일 하나를 뜻한다. 즉, 스크립트 하나를 모듈 하나로 볼 수 있다.
과거에는 스크립트 크기도 작았고, 기능도 단순했기에 특별히 새로운 문법을 만들 필요가 없었다고 한다.
하지만! 요즘은 스크립트의 크기가 커져버리고, 기능도 많아져 특별한 라이브러리를 만들어야 하고, 작업을 수행하다가 내가 필요한 모듈을 아무때나 불러서 쓰게 해주는 등.. 다양한 시도를 하게 됐고 이로인해, 여러가지 모듈시스템이 만들어지게 되었다.
그 중 내가 배운것은 CommonJS !
CommonJS는 Node.js서버를 위해 만들어지 모듈시스템이라고 한다.
이제는 그 사용법을 알아보자.
npm을 사용하면 모듈을 쉽게 가져올수 있다.
$ npm install
작업하고자 하는 공간에서 이 코드를 실행하면 node_modules가 생기고 이제부터 이 안에 들어있는 모듈을 사용하면 된다!
그런데 가끔 모듈을 못가져올때가 있는데 이때는 따로 그 모듈을 설치해주면 된다.
$ npm install (사용하고자하는 모듈명)
준비가 되었다면 모듈을 그저 가져다 쓰면 된다.
const 모듈이담긴변수 = require(모듈명)
여기서사용한 require는 메소드이며 외부모듈을 가져오는 역할을 한다.
또한 require를 사용해서 다른 스크립트를 불러올 수 있다.
마치 뭔가를 요구? 요청? 하는 느낌으로 쓰면 되는것같다.
// 현재파일을 mod1.js라 하자
const module = require('./mod2.js')
//mod2.js
console.log('hello module')
직관적으로 봤을때 mod2.js파일의 내용이 실행되는것을 알 수 있다.
다른 스크립트 파일에서 내가 만든 모듈을 사용해야할때는 module.exports를 이용하면 된다.
// script1.js
const module2 = require('./script2.js')
console.log(module2) // '이게 module2다!!'
// script2.js
module.exports = '이게 module2다!!'
module.exports 대신에 exports를 사용해도 된다.(축약형이라고 생각해도 된다.)
exports는 module.exports를 참조한다.
단, 직접적으로 exports에 값을 할당하면 안된다!
// practice1.js
module.exports = {a: 1}
// practice2.js
const practice2 = require('./practice1')
console.log(practice2) // {a: 1}
위 코드와 같이 module.exports에 직접 객체를 할당해주면 잘 작동이 된다.
// practice1.js
exports = {a: 1}
// practice2.js
const practice2 = require('./pratice1')
console.log(practice2) // {} 내용이 비어진다.?
왜 값이 안나올까?? 이유는 module.exports를 가져와서 내보내야 하는데
위에서 작성한 코드는 exports라는 변수에 값을 넣어 준 것이므로, module.exports에는 전형 영향을 주지 않게되기 때문이다.