1。オープニング分析
みなさん、こんにちは。今日の記事は、主に「接続」ミドルウェアと関連する補助ミドルウェアのソースコード分析シリーズに焦点を当てています。誰もが前の記事を読んだと思います。
この記事では、使用方法と目的を紹介します。この記事は、読者がそれをより深く理解できるように、私自身の興味からもありません。分析段階に不正確さがある場合は、アドバイスをください。
大丈夫!古いルールのポイントに到達しましょう。最初に例を見て、次のように紹介分析を組み合わせて使用しましょう。
コードコピーは次のとおりです。
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サーバーのすべての機能を提供します。
「接続」ミドルウェアを使用すると、さまざまな方法で「サーバー」を作成できます。
コードコピーは次のとおりです。
var server = connect.createServer(
connect.logger()
、connect.static(__ dirname + '/public')
); // 1
var app = connect();
app.use(function(req、res){
Res.End( "Hello、nobita!/n");
})。聞きます(8888); // 2
それで、それがどのようにそれを行うか、ソースコードを見てください:
コードコピーは次のとおりです。
exports = module.exports = createServer;
exports.createServer = createServer;
グローバル「エクスポート」に「createServer」をマウントし、「createServer」属性を展開して再度マウントします。目的は、ネイティブライティングフォームと互換性があることです。
さまざまな方法を作成する目的が達成されました。これは、誰もが日々の発展から学ぶことができるという考えでもあります。
(2)、2行目「Connect.Createserver」を見てみましょう。それは何をしましたか、以下のソースコードを見てください:
コードコピーは次のとおりです。
var httpserver = require( './ http')。サーバー、
httpsServer = require( './ https')。server;
function createserver(){
if( 'object' == typeof引数[0]){
new httpsServer(arguments [0]、array.prototype.slice.call(arguments、1))を返します。
} それ以外 {
new httpserver(array.prototype.slice.call(arguments))を返します。
}
};
「httpsServer」と「httpserver」は基本的に同じであり、「httpsserver」によってカプセル化されたHTTPSメソッドだけです。 「createServer」の場合、一連のミドルウェアも渡すことができます。これは、後続の導入と同じですが、ルートディレクトリにのみバインドできます。
(3)、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サーバー」から継承されたプロトタイプであり、サーバーのRequestListenerを使用するミドルウェアに置き換えます。
「connect.use(ルート、ハンドル)」を使用して、各ルートにミドルウェアを追加します。これらのミドルウェアの「ハンドル」は「ルート」にバインドされ、「スタック」に保存されます。 「リクエスト」リクエストがあるたびに、
このヒープを横断し、「ルート」に対応する「ハンドル」を見つけ、「ハンドル」を実行します。 「ハンドル」が最終的に「次の()」を呼び出すと、次のマッチング「ハンドル」を検索して実行し続けます。
「ハンドル」をカプセル化することにより、「ミドルウェア」を「接続」に簡単に追加できます。
(4)、最後に、「聞く(8888)」を見てください、それはどんな仕事をしていますか?
とても簡単です。基礎となるサーバーオブジェクトを継承することにより、特定のポートを聞くために「聞く」機能を与えます。
server.prototype .__ proto__ = http.server.prototype
以下は、「connect.js」のソースコード全体です。スペースを保存するために、下の図に示すように、すべてのコメントが削除されています。
追加する:
コードコピーは次のとおりです。
fs.readdirsync(__ dirname + '/middleware')。
if(//.js$/.test(filename)){
var name = filename.substr(0、filename.lastindexof( '。'));
exports.middleware .__定義__(name、function(){{
RECURES REQUES( './ Middleware/' + name);
});
}
});
「ミドルウェア」オブジェクト「エクスポート」、次に「ミドルウェア」オブジェクトにループすることは、「ミドルウェア」フォルダーに.JSファイルモジュールを直接ロードするメソッドです。
使用:「Exports.utils.merge(Exports、Exports.middleware)」でミドルウェアでメソッドを直接エクスポートします。
3つ、要約しましょう:
(1)ソースコードの設計意図を理解することは、アプリケーションの利益を最大化するのに役立ちます。
(2)ソースコードを見るとき、プロセスを理解し、文法の詳細を控除します。
(3)ソースコードの巧妙な実装のアイデアから学びますが、設計のために設計を遷移させないでください。
(4)明日も関連するミドルウェアを分析し続け、更新され続けます。 。 。 。 。 。