require()은 Node.js 안에 module.js 파일 안에 정의된 메서드이다. 외부 모듈을 가져오게 하는 기능을 가지고 있다!
매개변수로 외부모듈의 파일경로를 넣는다.
require("./aa/asdf");
// 현재경로에서 aa파일안에 있는 asdf모듈을 불러오겠다.
모듈이라 하면 외부에 영향을 받지 않는 재사용 가능한 코드들의 묶음이다.
라이브러리를 부를 때도 쓰지만, 우리가 만들었던 파일들을 불러올 때도 쓰인다.
이는 객체지향프로그래밍에선 클래스가 이런 모듈을 담당했고 javascript처럼 함수지향 프로그래밍에선 함수 객체가 이를 담당하고 있다.
require()은 동작 원리
var require = function(src){
var fileAsStr = readFile(src) //line 2
var module.exports = {} //line 3
eval(fileAsStr) //line 4
// exports.fileAsStr = fileAsStr; 라인4 설명
return module.exports //line 5
}
line2 : readFile() 메서드로 파일경로 있는 파일을 fileAsStr에 넣는다.
line3 : module.exports에 빈객체로 새로운 인스턴스를 만든다.
line4 : 사실상 module.exports에 fileAsStr을 붙인다. === module.exports.fileAsStr 이 exports에 넣지 않으면 외부에서 이 파일의 함수들을 쓸 수가 없다.
line5 : module.exports 값을 return한다.
먼저 require로 모듈을 불러오면 그 즉시 실행된다는 특징을 가지고 있다.
이 동작은 IIFE와 유사하다.
- IIFE는 즉시 호출 함수 표현식으로
(function()){
console.log("Hello World!")
}()//Hello World!
함수를 정의와 함께 뒤에 ()를 붙여줌으로써 호출까지 함께 해주는 방법이다.
(function()){}() 여기서 (function()){}=함수이름이라 생각하면 편하다.
함수를 불러올 때, aaa()이런 식으로 불러오므로 aaa가 함수이름이다.
이렇게 즉시 실행 함수를 사용하면 함수를 정의하자마자 실행된다. 기존 함수는 선언과 호출을 따로 해야한다는 점에서 다르다. 기존 함수와 같이 retrun값도 가능하다.
이 IIFE함수는 기존 함수와 마찬가지로 함수 내부에 선언된 변수의 스코프는 함수 내부로 극한되어 있어 전역스코프를 오염시키지 않고 지역 스코프 덕분에 IIFE 내부에 선언된 변수에 접근하지 못하도록 할 수 있다. 그렇기 때문에 현재 파일에 있는 변수나 전역함수와의 충돌을 방지해주고 방어해준다.
이런 특성 때문에 require()메서드도 IIFE방식으로 진행했다.
모듈에 있는 변수가 전역범위로부터 보호해주고 현재 페이지에 있는 전역변수나 함수와의 충돌을 방지해준다.
'back-front end' 카테고리의 다른 글
Nginx를 이용한 https구현하기(aws ec2 - linux ubuntu-20.04 LTS) -1 (0) | 2022.09.16 |
---|---|
[항해99] Node.js 심화 주차 키워드 (0) | 2022.08.11 |
[항해99] Express.js의 미들웨어 (0) | 2022.07.30 |
[항해99] ORM (0) | 2022.07.30 |
[항해 99] Javascript의 특성 (0) | 2022.07.18 |
댓글