[Javascript] require() 간단 동작 원리 및 module.export 와 export의 차이

Song-YunMin·2021년 2월 8일
16

JavaScript

목록 보기
10/22
post-thumbnail

require() 함수는 어떻게 쓰는 것일까요?

Node.JS 에서는 require 메서드를 통해 외부 모듈을 가져올 수 있습니다. require 메서드는 node가 local object에 추가한 메서드로서 다음과 같이 파라미터로 추가할 모듈의 파일 경로값을 받습니다.

const foo = require('파일 경로');

require 메서드의 소스코드는 매우 복잡합니다. 하지만 요약하자면 아래와 같은 모양새로 구성되어 있습니다.

var require = function(src){
var fileAsStr = readFile(src)                //line 2
    var module.exports = {}                  //line 3
    eval(fileAsStr)                          //line 4
    return module.exports                    //line 5
}

먼저 line 1에서는 src의 인자를 받아옵니다 즉,

const foo = require('foo')

와 같은 경우 'foo'를 인자로 받아오는 식입니다.

line 2에서는 소스 파일을 읽어서 fileAsStr에 저장합니다.

line 3에서는 module.exports 라는 빈 해시를 만들어 둡니다.

line 4에서는 fileAsStr을 eval 합니다. 이 과정은 사실상 src를 복붙하는것과 같습니다.

line 4에 대해 조금 더 설명하면

const foo = require('./foo.js')

를 한다는 것은, 곧 require()의 인자로 "./foo.js"를 넣는 식이고 위 require()의 line 4는

eval(fileAsStr)

다음과 같이 변경되는 것과 마찬가지 입니다.

var require = function(src){
	var fileAsStr = readFild(src)
	var module.exports = {}
	**const a = 10
	exports.a = a;**
	return module.exports
}

결국 exports 해시의 a라는 key에 10이 들어가는 모습입니다.

따라서, 아래 코드는

// bar.js

const foo = require('./foo.js')
console.log(foo.a);

Runtime에는 아래와 같은 모습입니다.

const foo = { a:10 }
console.log(foo.a)

foo 에서 exports에 들어간 <key, value> 들이 require() 함수의 아웃풋으로 나오는 것입니다.

exports? module.exports?

exports 는 단순히 module.exports 를 참조할 뿐입니다.

공식문서에서 그게 다라고 합니다...!

module.exportsexports 는 같은 객체를 바라보고 있으며, exportsmodule.exports 의 shortcut입니다.


npm은 무엇인가요?

  • npm 패키지를 -g 옵션을 통해 Global로 저장하는 것과 그렇지 않은 것은 어떻게 다른가요?

NPM은 Node Package Manager의 약자입니다. 자바스크립트 패키지 매니저이고, NodeJS에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할을 하며 설치/관리를 수행할 수 있는 CLI를 제공합니다.

npm install Option

npm install 명령어에는 지역(Local) 설치와 전역(Global) 설치 옵션이 있습니다. 옵션을 별도로 지정하지 않으면 지역으로 설치되며 프로젝트 루트 디렉터리에 node_module 디렉터리가 자동 생성되고 그 안에 패키지가 설치됩니다. 지역으로 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있습니다.

npm -g (Global)

전역에 패키지를 설치하려면 npm install 명령어에 -g 옵션을 지정합니다. 전역으로 설치된 패키지는 전역에서 참조할 수 있습니다. 모든 프로젝트가 공통 사용하는 패키지는 지역으로 설치하지 않고 전역에 설치합니다.

Reference

require(), exports, module.exports 공식문서로 이해하기

profile
고독한 서버 개발 3년차

0개의 댓글