Skip to content

Node.js에서 require 함수의 동작 원리

Sangwoo Park edited this page Jul 12, 2021 · 1 revision

⭐ Contributors : sanoopark, 42KIM, young961027

// server.js

const indexRouter = require('./routes'); // here
const authRouter = require('./routes/auth');
const mypageRouter = require('./routes/mypage');
const createRouter = require('./routes/create');
const groupRouter = require('./routes/group');

프로젝트를 돌아보면서 indexRouterrequire()는 파일명을 지정하지 않아도 index.js를 불러오는 것이 잘 이해가 되지 않았습니다. require('./routes/index')로 바꿨을 때도 잘 작동되는 것으로 봐서 폴더 전체를 불러오거나 파일명 index를 기본값으로 사용할 것이라는 추측을 했습니다.


require()에 대해 좀 더 알아봤고, 공식 문서에서 다음과 같이 기본적인 내용을 찾을 수 있었습니다.

Node.js는 CommonJs 모듈 시스템을 따르는데, 그 중에 내장함수 require()는 모듈이나 로컬 파일을 불러오는 방법이다.

require()는 파일을 읽은 후에 실행하고 exports객체를 반환한다.

require()를 통해 어떤 모듈을 한 번 불러왔다면 그 다음부터는 파일을 다시 읽지 않고 모듈 캐시를 활용한다.


또한 여기에서 의문을 해소할 결정적인 내용도 찾게 되었습니다.

Here is the high-level algorithm in pseudocode of what require() does:

LOAD_AS_FILE(X)
1. If X is a file, load X as its file extension format. STOP
2. If X.js is a file, load X.js as JavaScript text. STOP
3. If X.json is a file, parse X.json to a JavaScript Object. STOP
4. If X.node is a file, load X.node as binary addon. STOP

LOAD_INDEX(X)
1. If X/index.js is a file, load X/index.js as JavaScript text. STOP
2. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
3. If X/index.node is a file, load X/index.node as binary addon. STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. If "main" is a falsy value, GOTO 2.
   c. let M = X + (json main field)
   d. LOAD_AS_FILE(M)
   e. LOAD_INDEX(M)
   f. LOAD_INDEX(X) DEPRECATED
   g. THROW "not found"
2. LOAD_INDEX(X)

이에 따르면 require('./routes')./routes/index.js가 존재하기 때문에 두 번째 항목 LOAD_INDEX(X)에 의해 동작한 것임을 알 수 있습니다.

Clone this wiki locally