1. 개방 분석
안녕하세요, 오늘의 기사는 주로 "Connect"미들웨어 및 관련 보조 미들웨어의 소스 코드 분석 시리즈에 중점을 둡니다. 나는 모두가 이전 기사를 읽은 것 같아요.
이 기사는 사용법과 목적을 소개하며,이 기사는 저의 관심사에서도 독자가 더 깊이 이해할 수 있도록합니다. 분석 단계에 잘못된 점이 있으면 조언을 해주세요.
괜찮은! 오래된 규칙의 요점에 도달합시다. 먼저 예제를 살펴보고 다음과 같이 소개 분석을 조합하여 사용하겠습니다.
코드 사본은 다음과 같습니다.
var connect = require ( "./ lib/connect");
var app = connect.createserver ();
app.use (connect.static (__ dirname + "/public", {
최대 : 0
});
app.use (function (req, res, next) {
Res.end ( "Hello World!");
})
.Listen (8888);
2 라인 별 분석 :
(1) 첫 번째 줄은 "Connect"모듈을 소개하고 Connect를 통해 HTTP | HTTPS 서버를 작성하고 HTTP 서버의 모든 기능을 제공합니다.
"Connect"미들웨어를 사용하면 다양한 방식으로 "서버"를 만들 수 있습니다.
코드 사본은 다음과 같습니다.
var server = connect.createserver (
connect.logger ()
, connect.static (__ dirname + '/public')
); // 1
var app = connect ();
app.use (function (req, res) {
res.end ( "안녕하세요, nobita!/n");
}). 듣기 (8888); // 2
그래서 그것이 어떻게 그렇게하는지, 소스 코드를보십시오.
코드 사본은 다음과 같습니다.
Exports = module.exports = CreateServer;
Exports.createserver = CreateServer;
글로벌 "내보내기"에서 "CreateServer"를 마운트 한 다음 "CreateServer"속성을 확장하고 다시 마운트하십시오. 목적은 기본 쓰기 양식과 호환되는 것입니다.
다른 방법을 만드는 목적이 달성되었습니다. 이것은 또한 모든 사람이 일상 개발에서 배울 수 있다는 생각입니다.
(2), 두 번째 줄 "connect.createserver"를 살펴 보겠습니다. 무엇을 했습니까? 아래 소스 코드를보십시오.
코드 사본은 다음과 같습니다.
var httpserver = require ( './ http'). 서버,
httpsserver = require ( './ https'). 서버;
함수 createServer () {
if ( 'object'== typeof argument [0]) {
새로운 httpsserver를 반환합니다 (Arguments [0], array.prototype.slice.call (Arguments, 1));
} 또 다른 {
새로운 httpserver를 반환합니다 (array.prototype.slice.call (arguments));
}
};
"httpsserver"와 "httpserver"는 기본적으로 동일하며 "httpsserver"가 캡슐화 한 HTTPS 메소드 일뿐입니다. "CreateServer"인 경우, 일련의 미들웨어를 전달할 수 있는데, 이는 후속 소개와 동일하지만 루트 디렉토리에만 바인딩 될 수 있습니다.
(3), 세 번째 줄 "app.use ()", 무엇을했는지 계속 살펴보고 소스 코드를 다음과 같이보십시오.
코드 사본은 다음과 같습니다.
var server = Exports.server = function httpserver (미들웨어) {
this.stack = [];
middleware.foreach (function (fn) {
this.use (fn);
}, 이것);
http.server.call (this, this.handle);
};
/**
*`http.server.prototype`에서 상속합니다.
*/
Server.prototype .__ proto__ = http.server.prototype;
"Connect"는 "HTTP Server"에서 상속 된 프로토 타입으로 서버의 RequestListener를 사용하는 미들웨어로 대체합니다.
"Connect.use (Route, Handle)"를 사용하여 각 경로에 미들웨어를 추가하십시오. 이 미들웨어의 "핸들"은 "경로"에 묶여 "스택"에 저장됩니다. "요청"요청이있을 때마다
이 힙을 가로 지르고 "route"에 해당하는 "핸들"을 찾아서 "핸들"을 실행하십시오. "핸들"이 마지막으로 "next ()"호출되면 다음 일치하는 "핸들"을 계속 검색하고 실행합니다.
"핸들"을 캡슐화하면 "연결"에 더 많은 "미들웨어"를 추가하기 쉽습니다.
(4) 마지막으로, "듣기 (8888)", 어떤 종류의 일을합니까?
매우 간단합니다. 기본 서버 객체를 상속함으로써 특정 포트를 듣기 위해 "듣기"의 기능을 제공합니다.
Server.prototype .__ proto__ = http.server.prototype
다음은 "Connect.js"의 전체 소스 코드입니다. 공간을 절약하기 위해 아래 그림과 같이 모든 주석이 삭제되었습니다.
추가하려면 :
코드 사본은 다음과 같습니다.
fs.readDirsync (__ dirname + '/middleware'). foreach (function (filename) {
if (//.js$/.test(filename)) {
var name = filename.substr (0, filename.lastindexof ( '.'));
Exports.middleware .__ definegetter __ (이름, function () {
반환 요구 ( './ 미들웨어/' + 이름);
});
}
});
"미들웨어"객체 "내보내기"다음 "Middleware"객체로 루프는 "미들웨어"폴더에 .js 파일 모듈을 직접로드하는 메소드입니다.
사용 : "Exports.utils.merge (Exports, Exports.middleware)" "미들웨어에서 방법을 직접 내보내기 위해 사용하십시오.
셋째, 요약하겠습니다.
(1) 소스 코드의 설계 의도를 이해하면 응용 프로그램의 이익을 극대화하는 데 도움이됩니다.
(2) 소스 코드를 볼 때 프로세스를 이해 한 다음 문법 세부 사항을 공제하십시오.
(3) 소스 코드의 영리한 구현 아이디어를 배우지 만 설계를 전환하지 마십시오. 디자인을 위해 디자인.
(4) 내일 관련 미들웨어를 계속 분석하고 계속 업데이트되고 있습니다. . . . . .