1. การวิเคราะห์เปิด
สวัสดีทุกคนบทความของวันนี้ส่วนใหญ่มุ่งเน้นไปที่ชุดการวิเคราะห์ซอร์สโค้ดสำหรับมิดเดิลแวร์ "เชื่อมต่อ" และมิดเดิลแวร์เสริมที่เกี่ยวข้อง ฉันคิดว่าทุกคนได้อ่านบทความก่อนหน้า
บทความนี้แนะนำวิธีการใช้งานและวัตถุประสงค์และบทความนี้ยังไม่สนใจความสนใจของฉันเพื่อให้ผู้อ่านสามารถเข้าใจได้อย่างลึกซึ้งยิ่งขึ้น หากมีความไม่ถูกต้องในขั้นตอนการวิเคราะห์โปรดให้คำแนะนำกับฉัน
ใช้ได้! มาถึงจุดของกฎเดิมกันเถอะ ลองมาดูตัวอย่างก่อนและใช้การวิเคราะห์บทนำร่วมกันดังนี้:
การคัดลอกรหัสมีดังนี้:
var connect = ต้องการ ("./ lib/connect");
var app = connect.createServer ();
app.use (connect.static (__ dirname + "/public", {
สูงสุด: 0
-
app.use (function (req, res, ถัดไป) {
Res.end ("Hello World!");
-
.Listen (8888);
2. การวิเคราะห์บรรทัดโดยสาย:
(1) บรรทัดแรกแนะนำโมดูล "เชื่อมต่อ" สร้างเซิร์ฟเวอร์ HTTP | HTTPS ผ่านการเชื่อมต่อและให้ฟังก์ชั่นทั้งหมดของเซิร์ฟเวอร์ HTTP
มิดเดิลแวร์ "เชื่อมต่อ" ช่วยให้คุณสร้าง "เซิร์ฟเวอร์" ได้หลายวิธี
การคัดลอกรหัสมีดังนี้:
var server = connect.createServer (
Connect.logger ()
, Connect.static (__ dirname + '/public')
- // 1
var app = connect ();
app.use (function (req, res) {
res.end ("สวัสดีโนบิตา!/n");
}). ฟัง (8888); // 2
แล้วมันเป็นอย่างไรดูที่ซอร์สโค้ด:
การคัดลอกรหัสมีดังนี้:
exports = module.exports = createserver;
exports.createServer = createserver;
Mount "CreateServer" บน "การส่งออก" ทั่วโลกจากนั้นขยายแอตทริบิวต์ "ผู้สร้าง" และติดตั้งอีกครั้งวัตถุประสงค์คือเพื่อให้เข้ากันได้กับแบบฟอร์มการเขียนดั้งเดิม
จุดประสงค์ในการสร้างวิธีการต่าง ๆ ได้รับการบรรลุ นี่เป็นความคิดที่ว่าทุกคนสามารถเรียนรู้จากการพัฒนาประจำวันของพวกเขา
(2) ลองดูที่บรรทัดที่สอง "connect.createserver" มันทำอะไรดูที่ซอร์สโค้ดด้านล่าง:
การคัดลอกรหัสมีดังนี้:
var httpserver = reghed ('./ http') เซิร์ฟเวอร์
httpsServer = require ('./ https') เซิร์ฟเวอร์;
ฟังก์ชั่น createServer () {
if ('object' == typeof อาร์กิวเมนต์ [0]) {
ส่งคืน httpsserver ใหม่ (อาร์กิวเมนต์ [0], array.prototype.slice.call (อาร์กิวเมนต์, 1));
} อื่น {
ส่งคืน httpserver ใหม่ (array.prototype.slice.call (อาร์กิวเมนต์));
-
-
"httpsserver" และ "httpserver" นั้นเหมือนกันพวกเขาเป็นเพียงวิธี HTTPS ที่ห่อหุ้มด้วย "httpsserver" เมื่อ "CreateServer" ชุดมิดเดิลแวร์สามารถส่งผ่านซึ่งเหมือนกับการแนะนำที่ตามมา แต่สามารถผูกพันกับไดเรกทอรีรูทเท่านั้น
(3) ดำเนินการต่อเพื่อดูบรรทัดที่สาม "app.use ()" มันทำอะไรดูที่ซอร์สโค้ดดังนี้:
การคัดลอกรหัสมีดังนี้:
var server = exports.server = ฟังก์ชั่น httpserver (มิดเดิลแวร์) {
this.stack = [];
middleware.foreach (ฟังก์ชั่น (fn) {
สิ่งนี้ใช้ (fn);
}, นี้);
http.server.call (this, this.handle);
-
-
* สืบทอดมาจาก `http.server.prototype`
-
server.prototype .__ proto__ = http.server.prototype;
"Connect" เป็นต้นแบบที่สืบทอดมาจาก "HTTP Server" ซึ่งจะแทนที่ requestListener ของเซิร์ฟเวอร์ด้วยมิดเดิลแวร์ที่คุณใช้
ใช้ "Connect.use (Route, Handle)" เพื่อเพิ่มมิดเดิลแวร์ในแต่ละเส้นทาง "ด้ามจับ" ของมิดเดิลแวร์เหล่านี้จะถูกผูกไว้กับ "เส้นทาง" และบันทึกไว้ใน "สแต็ค" ทุกครั้งที่มีคำขอ "คำขอ"
ข้ามกองนี้ค้นหา "มือจับ" ที่สอดคล้องกับ "เส้นทาง" และดำเนินการ "จับ" หาก "จัดการ" ในที่สุดเรียก "next ()" มันจะดำเนินการค้นหาและดำเนินการต่อไปการจับคู่ถัดไป "จับ"
ด้วยการห่อหุ้ม "ด้ามจับ" มันเป็นเรื่องง่ายที่จะเพิ่ม "มิดเดิลแวร์" มากขึ้นใน "เชื่อมต่อ"
(4) ในที่สุดดูที่ "ฟัง (8888)" มันทำงานแบบไหน?
มันง่ายมาก โดยการสืบทอดวัตถุเซิร์ฟเวอร์พื้นฐานจะให้ฟังก์ชั่นของ "ฟัง" เพื่อฟังพอร์ตเฉพาะ
server.prototype .__ proto__ = http.server.prototype
ต่อไปนี้เป็นซอร์สโค้ดทั้งหมดของ "Connect.js" เพื่อประหยัดพื้นที่ความคิดเห็นทั้งหมดถูกลบตามที่แสดงในรูปด้านล่าง:
เพื่อเพิ่ม:
การคัดลอกรหัสมีดังนี้:
fs.readdirsync (__ dirname + '/middleware'). foreach (ฟังก์ชั่น (filename) {
if (//.js$/.test(filename)) {
var name = filename.substr (0, filename.AlastIndexof ('.'));
exports.middleware .__ definegetter __ (ชื่อ, function () {
return ต้องการ ('./ มิดเดิลแวร์/' + ชื่อ);
-
-
-
วัตถุ "มิดเดิลแวร์" "ส่งออก" จากนั้นวนไปที่วัตถุ "มิดเดิลแวร์" เป็นวิธีที่โหลดโมดูลไฟล์. js โดยตรงในโฟลเดอร์ "มิดเดิลแวร์"
ใช้: "exports.utils.merge (ส่งออก, exports.middleware)" เพื่อส่งออกวิธีการโดยตรงในมิดเดิลแวร์
สามมาสรุปกันเถอะ:
(1) การทำความเข้าใจกับความตั้งใจในการออกแบบของซอร์สโค้ดจะช่วยเพิ่มผลกำไรให้มากที่สุดในแอปพลิเคชัน
(2) เมื่อดูที่ซอร์สโค้ดให้เข้าใจกระบวนการแล้วหักรายละเอียดไวยากรณ์
(3) เรียนรู้จากแนวคิดการใช้งานที่ชาญฉลาดในซอร์สโค้ด แต่ไม่ได้ออกแบบการออกแบบการออกแบบเพื่อประโยชน์ในการออกแบบ
(4) ทำการวิเคราะห์มิดเดิลแวร์ที่เกี่ยวข้องในวันพรุ่งนี้และยังคงได้รับการปรับปรุงต่อไป - - - - -