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/
Author And Source
이 문제에 관하여(require이란 뭘까? (node.js)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gkswjdzz/require이란-뭘까-node.js저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)