Stacks

[Node.js] Node의 require module 은 어떻게 동작하는가?

프라이D 2024. 2. 4. 23:26

CommonJS 모듈 시스템

  1. 하나의 자바스크립트 파일은 분리된 모듈로서 취급된다.
  2. 그리고 nodejs는 CommonJS 시스템을 쓴다.
    • require() 그리고 exports 혹은 module.exports
  3. 프론트에서 쓰이는 import/export 는 ES Module 시스템
  4. mjs 를 사용하면 Node 에서도 ES 모듈 시스템을 쓸 수 있다. 하지만 대중적인 pick 은 아닌 것 같음.

모듈을 require 하면 무슨 일이 일어나느냐?

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