CommonJS 모듈 시스템
- 하나의 자바스크립트 파일은 분리된 모듈로서 취급된다.
- 그리고 nodejs는 CommonJS 시스템을 쓴다.
require()
그리고 exports
혹은 module.exports
- 프론트에서 쓰이는
import/export
는 ES Module 시스템
- mjs 를 사용하면 Node 에서도 ES 모듈 시스템을 쓸 수 있다. 하지만 대중적인 pick 은 아닌 것 같음.
모듈을 require 하면 무슨 일이 일어나느냐?
const http = require('http');
const fs = require('fs');
- Resolving & Loading
- 모듈의 주어진 경로를 해석하고 로딩한다.
- 모듈의 종류는 크게 세 가지가 있음.
- http 와 같은 Node 의 core 모듈
- 개발자가 직접 쓴 모듈 파일
- 외부 3rd-part 모듈 (npm에서 받은거)
- 먼저 core 모듈을 찾고, 만약 / 로 시작한다면 해당 폴더를 찾는다.
- 두 경우 모두 없다면 node_modules 경로에서 모듈을 찾으려고 함.
- Wrapping
- 모듈 코드를 특정 함수 스코프로 감싸서, 모듈 코드가 전역 스코프에서 직접 실행되는 것을 방지한다. + 네임스코프 오염 및 충돌 방지 등…
(function(exports, require, module, __filename, __dirname) {
// 모듈의 코드
});
- 이 과정에서 exports 나 require 같은 함수를 사용할 수 있게 되는 것.
- Execution
- 그리고 감싸진 wrapper 함수가 실행된다.
- Returning Exports
- require 함수는 모듈을 exports 한다.
- 모듈이 하나의 값이나 객체를 내보내는 경우 module.exports 를 사용해 단일 클래스, 함수등을 내보낼 수 있음.
- exports 의 경우 여러개의 함수, 객체를 모듈 속성으로 내보낼 때 활용
- Caching
- require 을 처음 실행한 경우 캐싱이 되기 때문에, 여러번 require 을 호출해도 처음 한 번만 실행되는 것과 같다.