require이란 뭘까? (node.js)

const path = require('path');

Node.js를 사용하는 프로젝트를 개발하다가 매번 사용하는 require 함수가 무엇인지 궁금해졌다.

require란?

Node.js는 CommonJS 기반의 모듈 시스템이며, 다른 자바스크립트의 모듈을 로딩하기 위해 require라는 내장함수가 존재한다. 이 함수는 해당 파일을 읽고, 실행하고, 해당 파일의 exports객체를 반환한다. 따라서 다른 함수에 내보내려면 exports객체에 넣어주면 된다.

예-1

exports.animals = ['cat', 'dog'];
exports.sayHello = () => { console.log('Hello'); };

출력물

{ animals: [ 'cat', 'dog' ], sayHello: [Function (anonymous)] }

exports 그 자체에 함수나 객체를 내보기 위해서는 module.exports를 사용해야 한다.

예-2

module.exports = {
	animals: ['cat', 'dog'],
    sayHello: () => { console.log('Hello'); }
};

출력물

{ animals: [ 'cat', 'dog' ], sayHello: [Function: sayHello] }

exports는 재사용을 위해 캐시가 된다. require로 불려진 파일은 처음 호출된 시점에서만 읽고, 실행하고, 판단하기 때문에, 이후의 호출 시에는 캐시exports를 주게 된다.

let person = require('./person');
console.log(person.name); // 철수
person.name = '영미';
console.log(person.name); // 영미
person = require('./person');
console.log(person.name); // 뭐가 출력될까?

답은 철수가 아닌 영미다. (예..?)

import와 require는 비슷한 것 같은데?

필자는 기억은 안나지만 어디선가 import부터 접했었기 때문에, 파일을 불러와 변수에 넣는 require가 너무 어색했다.

Node.js의 13버전부터는 ES6의 import문이 지원된다고 한다. 때문에 필자처럼 import문을 먼저 접해, 익숙한 개발자에게는 좋은 소식이지만 생각했던 것이랑 약간 사용방법이 다르다.
import할 파일의 확장자를 js가 아닌 mjs로 바꾸어야 하고, 확장자도 끝까지 적어주어야 한다.

person.mjs

export default { name: '철수', };

callPerson.mjs

import person from './person';
// Error [ERR_MODULE_NOT_FOUND], Did you mean to import ../person.js? 아니...

import person from './person.mjs';
console.log(person.name); // 철수

이렇다 보니 필자는 그냥 require가 더 편한 것 같아, import는 자주 사용하지 않을 것 같다.

require 안의 경로를 지정해 줄 때, .//로 시작하지 않으면, 내부 모듈 또는 node_modules 폴더에서 해당 패키지를 찾으니 꼭 경로를 적어주자.

참고

https://nodejs.org/ko/knowledge/getting-started/what-is-require/
https://www.daleseo.com/js-node-es-modules/

좋은 웹페이지 즐겨찾기