node.js의 require ()는 어떻게 작동합니까?
나는 이것을 시도했다 :
// mod.js
var a = 1;
this.b = 2;
exports.c = 3;
// test.js
var mod = require('./mod.js');
console.log(mod.a); // undefined
console.log(mod.b); // 2
console.log(mod.c); // 3, so this === exports?
따라서 require () 이미지는 다음과 같이 구현 될 수 있습니다.
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
맞습니까? require () 또는 소스 코드를 어디서 찾을 수 있는지 이해하도록 도와주세요. 감사!
소스 코드는 여기에 있습니다 . exports
/ require
는 키워드가 아니라 전역 변수입니다. 메인 스크립트가됩니다 포장 하기 전에 시작 같은 모든 전역이 함수에서 require
, process
그 맥락에서 등.
module.js 자체가를 사용하는 동안 이는 require()
다른 require 함수이며 "node.js"라는 파일에 정의 되어 있습니다.
위의 부작용 : 모듈 중간에 "return"문을 두어 (어떤 함수에도 속하지 않음) 코드의 나머지 부분을 효과적으로 "주석 처리"하는 것이 좋습니다.
Andrey 가 소스 코드를 보여 주었지만 사용법이 궁금하다면 쉽고 간단한 설명이 여기에 있습니다 ( http://nodejs.org/api/modules.html ).
이것들은 저에게 두 가지 좋은 예였습니다.
//foo.js, multiple methods
var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is ' + circle.area(4));
//circle.js
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
//bar.js
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
//square.js, single method
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
내가 가장 좋아하는 패턴은
(function (controller) {
controller.init = function (app) {
app.get("/", function (req, res) {
res.render("index", {});
});
};
})(module.exports);
var mod = require('./mod.js');
require는 경로라는 하나의 인수를 사용하는 함수입니다.이 경우 경로는 ./mod.js
require가 호출되면 일련의 작업이 발생합니다.
경로가 존재하고 문자열이라고 주장하는 lib / module.js에
Module.prototype.require
선언 된 함수 호출을 통해 파일을 해결하는 lib / module.js
Module._load
의 함수 인 호출 ,Module._resolveFilename(request, parent, isMain)
Module._resolveFilename
모듈 (네이티브 모듈에 의해 반환되는 네이티브의 경우 기능 검사라고하고NativeModule
정의 기능 lib 디렉토리 / 내부 / bootstrap_node.js 이는 parh의 문자 수 (에서 꼭 2를 확인 다른 모듈 돌아갑니다 예 경우) 문자 이상) 및 lib / internal / bootstrap_node.js 에 정의 된에 정의 된 함수./
를 통해 일부 문자 (경로가로 시작되어야 함 )Module._resolveLookupPaths
- 파일이 포함 된 디렉토리를 확인하십시오.
- 경로에 확장자가 포함 된 경우 (예 : 예 : mod.js) lib / path.js에 정의 된 basename 함수 는 확장자가 " js " 인지 확인합니다.
- 그런 다음 인수에 지정된 파일에 대한 새 모듈을 생성합니다.
var module = new Module(filename, parent);
- 내용은 lib / internal / bootstrap_node.js에
NativeModule.prototype.compile
정의 된 함수를 통해 v8을 통해 컴파일됩니다. NativeModule.wrap
에 정의 된 lib 디렉토리 / 내부 / bootstrap_node.js은 의 컴파일 된 자바 스크립트의 내용을 소요mod.js
하고 랩 : 그것은이 모든 일을 만드는 다른 코드에 랩합니다. 따라서 작성한 코드mod.js
는 함수 표현식으로 래핑됩니다. 즉, node에 작성한 모든 것이 V8에서 실행됩니다.- module.exports가 반환됩니다.
나는 nodejs 소스 코드 / 2 /를 조금 더 파고 시퀀스 다이어그램 / 1 /을 만듭니다. 이것이 직관적 인 개요를 제공 할 수 있기를 바랍니다. require () 메커니즘을 쉽게 설명하는 또 다른 기사 http://fredkschott.com/post/2014/06/require-and-the-module-system/ 이 있습니다.이 기사를 먼저 살펴보면 도움이 될 수 있습니다. 다이어그램을 빨리 이해하십시오.
참고 :
/ 1 / 다이어그램 소스 저장소 : https://github.com/z1yuan/nodejs.git
/ 2 / https://github.com/nodejs/node-v0.x-archive.git
소스는 여기에서 다운로드 할 수 있습니다. http://nodejs.org/ exports / require는 키워드이며, 자바 스크립트로 직접 코딩 된 것 같지는 않습니다. Node는 C ++로 코딩되고 javascript는 C ++ 코어를 둘러싼 스크립팅 쉘일뿐입니다.
참고 URL : https://stackoverflow.com/questions/9475792/how-does-require-in-node-js-work
'Nice programing' 카테고리의 다른 글
transclude 함수와 복제 연결 함수로 정확히 무엇을합니까? (0) | 2020.11.02 |
---|---|
Visual Studio-참조에 소스 코드 첨부 (0) | 2020.11.02 |
HTTP 캐시 제어 최대 사용 기간, 반드시 재확인 (0) | 2020.11.02 |
QPushButton에 이미지를 설정하는 방법은 무엇입니까? (0) | 2020.11.01 |
크롬에서 이미지의 대체 텍스트를 표시하는 방법 (0) | 2020.11.01 |