require 함수는 하나의 자바스크립트 확장자 파일 내부에서 동작할 외부 모듈을 불러오기 위해 사용됩니다. 외부로부터 여러개의 임의의 모듈을 불러오는 것은, 편리하지만 그럼에도, 서로 다른 모듈 작성자가 우연히 같은 이름의 변수를 각각 지정함으로써 일어날 수 있는 오류의 가능성을 내포할 수 있습니다.
자바스크립트는 ES5부터 require 함수를 지원하고 있는데요. 외부 모듈을 하나의 파일에 성공적으로 불러오기 위해서 하나의 모듈이 다른 모듈을 침범해선 안된다는 조건은 당시 개발자들에게도 화두였던 것 같습니다. 작은 프로그램을 개별적인 단위로 분리하는 것을 모듈화(Modularization)라 하고, require 함수는 모듈화를 위해 모듈 자신만의 독립적인 변수 처리를 보장하는 스코프 지정을 가능하게 합니다. 이 때 (여러 방법이 있겠지만) 모듈화를 위해 require 함수에서 사용한 방식을 즉시 실행 함수 표현(이하 IIFE, Immediately Invoked Function Expression)이라고 부릅니다. IIFE란, 정의한 즉시 실행되는 함수 표현식을 말합니다. IIFE를 사용함으로써 함수의 단 한번의 반환이 보장받을 수 있고, (함수 표현식으로 사용되는 경우) 호이스팅되지 않기에 인터프리터가 함수를 읽어들이는 단계에서 사용됨으로써 내부 변수가 외부에서 참조될 가능성을 줄일 수 있습니다. 또 일회성 함수이므로 전역 네임스페이스에서의 충돌 가능성을 방지할 수도 있겠습니다. 어떻게 그것이 가능한지, require 함수의 구조와 함께 이야기해보겠습니다.
require 함수의 내부를 간략히 표현하면 다음과 같습니다.
var require = (function(src){
var fileAsStr = readFile(src) //src 파일을 읽어 와 fileAsStr에 저장합니다.
var module.exports = {} //빈 해쉬를 선언합니다.
eval(fileAsStr) //fileAsStr을 실행하고 해쉬를 업데이트 합니다.
return module.exports //해쉬를 반환합니다.
})();
변수 require에 반환할 결과물을 만들어내는 익명함수는 소괄호로 둘러 쌓여있고, ()와 같은 함수의 즉시 실행 옵션이 소괄호 끝에 붙어있다는 점이 특이합니다. 함수 내부에 변수를 정의하면 이 변수는 외부에서 참조할 수 없으므로 독립성을 가지게 되는데, 이것은 require가 함수이기 때문에 가지는 특징입니다. 또 필요한 경우, 함수 선언식(statement)이 아닌 표현식(expression)으로 사용하여, 하나의 값으로서 특정 변수에 저장 및 재사용이 가능합니다. 마지막으로 즉시 실행되고 마침으로써 의도하지 않은 함수 재참조를 방지할 수 있다는 장점이 있습니다.