1. Analisis pembukaan
Halo semuanya, artikel hari ini terutama berfokus pada seri analisis kode sumber untuk middleware "connect" dan middleware tambahan terkait. Saya pikir semua orang telah membaca artikel sebelumnya.
Artikel ini memperkenalkan metode dan tujuan penggunaan, dan artikel ini juga karena minat saya sendiri, sehingga pembaca dapat memiliki pemahaman yang lebih dalam tentang hal itu. Jika ada keraguan dalam tahap analisis, tolong beri saya beberapa saran.
Baiklah! Mari kita sampai pada titik aturan lama. Mari kita lihat contoh terlebih dahulu, dan gunakan analisis pengantar dalam kombinasi, sebagai berikut:
Salinan kode adalah sebagai berikut:
var connect = membutuhkan ("./ lib/connect");
var app = connect.createServer ();
app.use (connect.static (__ dirname + "/public", {
Maxage: 0
}));
app.use (function (req, res, next) {
res.end ("Halo dunia!");
})
.listen (8888);
2. Analisis baris demi baris:
(1), baris pertama, memperkenalkan modul "Connect", buat server HTTP | HTTPS melalui Connect, dan berikan semua fungsi server HTTP.
Middleware "Connect" memungkinkan Anda untuk membuat "server" dalam berbagai cara.
Salinan kode adalah sebagai berikut:
var server = connect.createServer (
connect.logger ()
, connect.static (__ dirname + '/public')
); // 1
var app = connect ();
app.use (function (req, res) {
res.end ("Halo, Nobita!/N");
}). Dengarkan (8888); // 2
Jadi bagaimana melakukannya, lihat kode sumbernya:
Salinan kode adalah sebagai berikut:
Ekspor = Module.Exports = CreateServer;
Exports.createServer = createServer;
Gunung "CreateServer" pada "Ekspor" global, lalu perluas atribut "createserver" dan pasang lagi, tujuannya adalah untuk kompatibel dengan bentuk penulisan asli.
Tujuan menciptakan berbagai cara telah tercapai. Ini juga merupakan ide yang dapat dipelajari setiap orang dalam pengembangan harian mereka.
(2), mari kita lihat baris kedua "connect.createServer". Apa yang dilakukannya, lihat kode sumber di bawah ini:
Salinan kode adalah sebagai berikut:
var httpserver = membutuhkan ('./ http'). Server,
Httpsserver = membutuhkan ('./ https'). Server;
fungsi createServer () {
if ('object' == typeof argumen [0]) {
kembalikan httpsserver baru (argumen [0], array.prototype.slice.call (argumen, 1));
} kalau tidak {
kembalikan httpserver baru (array.prototype.slice.call (argumen));
}
};
"Httpsserver" dan "httpserver" pada dasarnya sama, mereka hanya metode https yang dienkapsulasi oleh "httpsserver". Ketika "CreateServer", serangkaian middleware juga dapat diteruskan, yang sama dengan pengantar berikutnya, tetapi hanya dapat terikat pada direktori root.
(3), terus lihat baris ketiga "app.use ()", apa yang dilakukannya, lihat kode sumber sebagai berikut:
Salinan kode adalah sebagai berikut:
var server = exports.server = fungsi httpserver (middleware) {
this.stack = [];
middleware.foreach (function (fn) {
this.use (fn);
}, ini);
http.server.call (this, this.handle);
};
/**
* Mewarisi dari `http.server.prototype`.
*/
Server.prototype .__ proto__ = http.server.prototype;
"Connect" adalah prototipe yang diwarisi dari "server http", yang akan menggantikan permintaan server dengan middleware yang Anda gunakan.
Gunakan "Connect.Use (Route, Handle)" untuk menambahkan middleware ke setiap rute. "Pegangan" middleware ini akan terikat pada "rute" dan disimpan dalam "tumpukan". Setiap kali ada permintaan "permintaan",
Melintasi tumpukan ini, menemukan "pegangan" yang sesuai dengan "rute", dan mengeksekusi "pegangan". Jika "menangani" akhirnya memanggil "next ()", itu akan terus mencari dan menjalankan "pegangan" yang cocok berikutnya.
Dengan merangkum "pegangan", mudah untuk menambahkan lebih banyak "middleware" ke "Connect".
(4), akhirnya, lihat "Dengar (8888)", pekerjaan seperti apa yang dilakukannya?
Itu sangat sederhana. Dengan mewarisi objek server yang mendasarinya, itu memberikan fungsi "mendengarkan" untuk mendengarkan port tertentu.
Server.prototype .__ proto__ = http.server.prototype
Berikut ini adalah seluruh kode sumber "Connect.js". Untuk menghemat ruang, semua komentar telah dihapus, seperti yang ditunjukkan pada gambar di bawah ini:
Untuk menambahkan:
Salinan kode adalah sebagai berikut:
fs.readdirsync (__ dirname + '/middleware'). foreach (fungsi (nama file) {
if (//.js$/.test(filename)) {
var name = filename.substr (0, filename.LastIndexOf ('.'));
exports.middleware .__ definegetter __ (name, function () {
return membutuhkan ('./ middleware/' + name);
});
}
});
Objek "Middleware" Ekspor "dan kemudian loop ke objek" Middleware "adalah metode yang secara langsung memuat modul file .js di folder" Middleware ".
Gunakan: "Exports.utils.merge (Ekspor, Exports.middleware)" untuk secara langsung mengekspor metode di middleware.
Tiga, mari kita ringkas:
(1) Memahami niat desain kode sumber akan membantu memaksimalkan keuntungan dalam aplikasi.
(2) Saat melihat kode sumber, pahami prosesnya dan kemudian mengurangi detail tata bahasa.
(3) Belajar dari ide -ide implementasi yang cerdas dalam kode sumber, tetapi jangan desain transisi, desain demi desain.
(4) Terus menganalisis middleware yang relevan besok dan terus diperbarui. . . . . .