거의 모든 Node.js 개발자는`require ()`기능이 무엇을하는지 말할 수 있지만, 우리 중 얼마나 많은 사람들이 어떻게 작동하는지 알고 있습니까? 우리는 매일 라이브러리와 모듈을로드하는 데 사용하지만 그 행동은 우리에게 미스터리입니다.
호기심으로, 나는 엔진 아래에서 일어난 일을 찾기 위해 노드의 핵심 코드를 탐구했습니다. 그러나 이것은 단일 기능이 아닙니다. 노드 모듈 시스템에서 module.js를 찾았습니다. 이 파일에는 각 파일의 로딩, 컴파일 및 캐싱을 제어하는 놀랍도록 강력하고 비교적 낯선 코어 모듈이 포함되어 있습니다. `Quession ()`, 그 출현은 빙산의 일각 일뿐입니다.
module.js
코드 사본은 다음과 같습니다.
함수 모듈 (id, parent) {
this.id = id;
this.exports = {};
this.parent = 부모;
// ...
Module.js에서는 주로 Node.js에서 두 가지 역할을 수행합니다. 첫째, 모든 node.js 모듈의 기초를 제공합니다. 각 파일은 새로운 기본 모듈의 새 인스턴스이며 파일이 실행 된 후에도 여전히 존재합니다. 그렇기 때문에 속성을 Module.Exports에 첨부하여 필요할 때 반환 할 수있는 이유입니다.
이 모듈의 두 번째 주요 작업은 노드의 모듈로드 메커니즘을 처리하는 것입니다. 우리가 사용하는 "요구"기능의 독립적 인 작동은 실제로 추상 개념 모듈입니다. 이로드 방법은 각 파일의 실제로드를 처리하고 여행을 시작합니다.
모듈 ._load
코드 사본은 다음과 같습니다.
module._load = function (요청, 부모, Ismain) {
// 1. 캐시 된 모듈의 모듈 확인 ._Cache.
// 2. 캐시가 비어 있으면 새 모듈 인스턴스를 만듭니다.
// 3. 캐시에 저장하십시오.
// 4. 주어진 파일 이름으로 module.load ()를 호출하십시오.
// 파일 내용을 읽은 후 Module.comPile ()을 호출합니다.
// 5. 파일을로드/파싱하는 오류가 있으면
// 캐시에서 잘못된 모듈을 삭제합니다
// 6. return module.exports
};
Module._Load는 새 모듈을로드하고 모듈 캐시를 관리하는 책임이 있습니다. 캐시로드 각 모듈은 중복 파일의 읽기 수를 줄이고 응용 프로그램 속도를 크게 높일 수 있습니다. 또한 공유 모듈 인스턴스를 사용하면 싱글 톤 특성이있는 모듈이 프로젝트의 상태를 유지할 수 있습니다.
캐시에 모듈이 존재하지 않으면 모듈이 있으면 파일의 새 기본 모듈이 생성됩니다. 그런 다음 모듈에 모듈에 새 파일의 내용을 읽도록 지시합니다. [1]
위의 6 단계를 발견하면 Module.Exports가 사용자에게 반환되었습니다. 그렇기 때문에 공개 인터페이스 사용법을 정의 할 때 Exports 및 Module.exports를 사용합니다. Module._load는 다음으로 요구 사항의 내용을 반환합니다. 여기에는 더 이상 기능이 없다는 사실에 놀랐지 만 거기에 있다면 더 좋을 것입니다.
module._compile
코드 사본은 다음과 같습니다.
module.prototype._compile = function (content, filename) {
// 1. MODULE.REQUIRE를 호출하는 기능이 필요합니다.
// 2. 필요한 다른 도우미 방법을 첨부해야합니다.
// 3. 요구 사항을 제공하는 함수로 JS 코드를 랩핑하고
// 모듈.
// 4. 그 함수를 실행하십시오
};
・ 이곳은 진짜 기적이 일어나는 곳입니다. 첫째, 특수한 독립적 인 운영 요구 기능은 모듈에 대해 작성됩니다. 이것은 우리가 필요한 기능이며 모두 익숙합니다. 함수 자체는 모듈의 캡슐화 일뿐입니다. Quire는 우리가 사용하기 쉬운 덜 알려진 보조 방법을 포함합니다.
・ require () : 외부 모듈을로드하십시오
・ requek.resolve () : 모듈 이름을 절대 경로로 구문 분석합니다
・ uredge.main : 메인 모듈
cache : 모든 캐시 된 모듈
・ ・ requess.extensions : 확장에 따라 각 유효한 파일 유형에 사용할 수있는 컴파일 메소드
요구 사항이 준비되면 전체로드 된 소스 코드가 새 함수로 캡슐화되어 요구, 모듈, 내보내기 및 기타 모든 노출 된 변수를 매개 변수로 받아 들일 수 있습니다. 이것은 node.js 환경과의 충돌을 방지하기 위해 모듈을 캡슐화하기 위해 만들어진 기능입니다.
코드 사본은 다음과 같습니다.
(함수 (내보내기, 요구, 모듈, __filename, __dirname) {
// 여기에 코드가 주입되었습니다!
});
모듈.
결론적으로
따라서 우리는 이미 요구 코드를 이미 이해했으며 그것이 어떻게 작동하는지에 대한 예비 이해를 가지고 있습니다.
당신이 그것을 끝까지했다면, 당신은 마지막 비밀을 준비 할 준비가되었습니다 : 요구 ( 'module'). 모듈 시스템 자체는 모듈 시스템을 통해로드 할 수 있습니다. 처음. 이것은 이상하게 들릴지 모르지만 사용자 공간은 Node.js 코어를 파악하지 않고 모듈로드 시스템과 상호 작용할 수 있습니다. 인기있는 모듈은 모두 이와 같이 제작되었습니다. [2]
더 알고 싶다면 Module.js 소스 코드를 직접 확인하십시오. 당신이 한동안 두통을 겪기에 충분한 많은 것들이 여전히 있습니다. 첫 번째는 node_module_contexts가 무엇인지 말해 줄 수 있고 추가 된 이유는 보너스 포인트를 얻을 수 있습니다 :)
[1] module._compile 메소드는 JavaScript 파일을 실행하는 데만 사용됩니다. JSON 파일을 JSON.PARSE ()를 통해 구문 분석하고 반환해야합니다.
[2] 그러나 두 모듈 모두 모듈과 같은 개인 모듈 메소드를 기반으로합니다. 당신은 이것이 훨씬 낫지 않다고 생각할 수 있습니다 ...