require 사용

sungjin6576·2022년 5월 2일
0

require는 nodeJS의 내장 모듈로써 모듈을 불러오는 방법 중 하나이다 (또 다른 방법은 import (나중에 글쓰고 링크추가)

1. require()의 기본 기능

require의 기본기능은 javascript파일을 읽고 실행하고 module.exports 객체를 return 하도록 하는 것이다
간단한 예제를 살펴보자

//example.js

console.log("evaluating example.js");

var invisible = function () {
  console.log("invisible");
}

exports.message = "hi";

exports.say = function () {
  console.log(exports.message);
}

test.js에서 require한다고 하면

// test.js
require('./example.js')

node test.js로 실행시켜보면 evaluating example.js 가 콘솔에 찍힌다
따라서 require 해온 것만으로 해당 파일을 실행한다

require의 결괏값을 변수에 담아서 콘솔에 찍어보면 require함수는 객체를 return한다는 것을 알 수 있다

// test.js
let example = require('./example.js')
console.log(example); // { message: 'hi', say: [Function (anonymous)] }

require의 return 객체는 바로 require해 온 파일의 module.exports 객체이다
exports했던 example.js에서 module.exports 객체를 찍어보면 정확히 같은 것이 찍히는 것을 알 수 있다
이 때 그냥 exports가 있는데 이것의 값도 똑같이 나온다

//example.js
...
console.log(exports); // { message: 'hi', say: [Function (anonymous)] }
console.log(module.exports); // { message: 'hi', say: [Function (anonymous)] }

하지만 둘은 완전히 같은 것은 아니었다?(잘 정리하신분의 링크)

짧게 결론만 말하자면 exports와 module.exports 는 같은 객체를 참조하지만 require 가 return하는 것은 module.exports객체 라는 것이다

exports.message 처럼 객체의 property를 바꾸는 방식도 있고 module.exports 객체 자체를 바꿔 줄 수 도 있는데

이 때 주의할 점은 exports.property = value 와 module.exports.property = value 는 require가 같은 결과가 나오지만 exports = { property : "value" } 는 exports가 새로운 객체를 참조하게 만들기 때문에 module.exports에 추가적인 처리를 하지 않으면 require가 {}빈 객체를 반환한다

또한 module.exports를 다른 것으로 바꾸면(ex) int, string) require는 그것을 반환한다

// example.js
module.exports = { message: "hi" , say: ()=>{console.log("hi")} }; 

// test. js
console.log(require("example.js")) //{ message: 'hi', say: [Function: say] }
// example.js
exports = { message: "hi" , say: ()=>{console.log("hi")} }; 

// test. js
console.log(require("example.js")) // {}
// example.js
module.exports = 1;

// test.js
console.log(require("example.js")) // 1

이번에는 say method를 두가지 방법으로 실행시켜보자

1) exports 객체 전체를 require해서 실행

const example = require("./example.js")
example.say(); // hi

2) say method만 require해서 실행

const {say} = require("./example.js")
say(); // hi

2. require는 오직 한번만

보통 객체는 새로 선언할 때 마다 memory에 적재된다(인스턴스화(이것도 정리해서 링크 달아야함))
따라서 같은 모양으로 선언해도 둘은 같은 값이 아니다(주소를 저장하기 때문에)

const obja = { name : "value" };
const objb = { name : "value" };
console.log(obja === objb); // false

하지만 require로 가져온 객체는 같은 파일내에서 다시 require해도 캐싱되있고 재사용된다

const reqa = require("./example.js")
const reqb = require("./example.js")
console.log(reqa === reqb); //true
reqa.message = "hey"
console.log(require("./example.js")) // { message: 'hey', say: [Function: say] }

참고한글 :
What is require?
require() 간단 동작 원리 및 module.export 와 export의 차이

0개의 댓글