1. التحليل الافتتاحي
مرحبًا بالجميع ، تركز مقالة اليوم بشكل أساسي على سلسلة تحليل التعليمات البرمجية المصدر للبرامج الوسيطة "Connect" والوسيطة المساعدة ذات الصلة. أعتقد أن الجميع قد قرأ المقال السابق.
تقدم هذه المقالة طريقة الاستخدام والغرض منها ، وهذه المقالة هي أيضًا بسبب اهتمامي ، بحيث يمكن للقراء فهم أعمق لها. إذا كان هناك أي خطأ في مرحلة التحليل ، فيرجى إعطائي بعض النصائح.
على ما يرام! دعنا نصل إلى نقطة القواعد القديمة. دعونا نلقي نظرة على مثال أولاً ، ونستخدم تحليل المقدمة مجتمعة ، على النحو التالي:
نسخة الكود كما يلي:
var connect = required ("./ lib/connect") ؛
var app = connect.createserver () ؛
app.use (connect.static (__ dirname + "/public" ، {
MAXAGE: 0
})) ؛
app.use (function (req ، res ، next) {
Res.end ("Hello World!") ؛
})
.listen (8888) ؛
2. تحليل خط عن طريق الخط:
(1) ، السطر الأول ، يقدم وحدة "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 ("مرحبًا ، nobita!/n") ؛
}). الاستماع (8888) ؛ // 2
فكيف يفعل ذلك ، انظر إلى رمز المصدر:
نسخة الكود كما يلي:
الصادرات = الوحدة النمطية.
orports.createserver = createServer ؛
Mount "CreateServer" على "الصادرات" العالمية ، ثم قم بتوسيع سمة "CreateServer" وتثبيتها مرة أخرى ، والغرض من ذلك هو أن يكون متوافقًا مع نموذج الكتابة الأصلي.
تم تحقيق الغرض من إنشاء طرق مختلفة. هذه أيضًا فكرة يمكن للجميع التعلم منها في تطورهم اليومي.
(2) ، دعونا نلقي نظرة على السطر الثاني "connect.createserver". ماذا فعلت ، انظر إلى رمز المصدر أدناه:
نسخة الكود كما يلي:
var httpserver = مطلوب ('./ http'). الخادم ،
httpsserver = مطلوب ('./ https'). الخادم ؛
الوظيفة createServer () {
if ('object' == typeof minfuments [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 = function httpserver (الوسيطة) {
this.stack = [] ؛
middleware.foreach (وظيفة (fn) {
this.use (fn) ؛
}، هذا)؛
http.server.call (هذا ، this.handle) ؛
} ؛
/**
* ويرث من `http.server.prototype`.
*/
server.prototype .__ proto__ = http.server.prototype ؛
"Connect" هو النموذج الأولي الموروث من "HTTP Server" ، والذي سيحل محل قائمة طلبات الخادم بالبرنامج الوسيط الذي تستخدمه.
استخدم "Connect.use (Route ، Handle)" لإضافة البرامج الوسيطة إلى كل مسار. سيكون "مقبض" هذه البرامج الوسيطة ملزمة بـ "الطريق" ويتم حفظه في "كومة". في كل مرة يكون هناك طلب "طلب" ،
اجتياز هذا الكومة ، ابحث عن "المقبض" المقابل لـ "Route" ، وتنفيذ "المقبض". إذا كان "مقبض" يدعو أخيرًا "Next ()" ، فسيستمر ذلك في البحث وتنفيذ "المقبض" المطابق التالي.
من خلال تغليف "مقبض" ، من السهل إضافة المزيد من "الوسيطة" إلى "Connect".
(4) ، أخيرًا ، انظر إلى "الاستماع (8888)" ، ما نوع العمل الذي يفعله؟
إنه بسيط للغاية. من خلال ورث كائن الخادم الأساسي ، فإنه يعطي وظيفة "الاستماع" للاستماع إلى منافذ محددة.
server.prototype .__ proto__ = http.server.prototype
فيما يلي رمز المصدر بالكامل لـ "connect.js". من أجل توفير المساحة ، تم حذف جميع التعليقات ، كما هو موضح في الشكل أدناه:
للإضافة:
نسخة الكود كما يلي:
fs.readdirsync (__ dirname + '/middleware'). foreach (وظيفة (اسم الملف) {
if (//.js$/.test(filename)) {
var name = filename.substr (0 ، filename.lastindexof ('.')) ؛
orports.middleware .__ definester __ (name ، function () {
تتطلب الإرجاع ('./ middleware/' + name) ؛
}) ؛
}
}) ؛
كائن "الوسيطة" "تصدير" "تصدير" ثم حلقة إلى كائن "الوسيطة" هي طريقة تقوم مباشرة بتحميل وحدة ملف .js في المجلد "الوسيطة".
استخدام: "Exports.Utils.merge (الصادرات ، التصدير.
ثلاثة ، دعنا نلخص:
(1) سيساعد فهم نية التصميم للرمز المصدر على زيادة المكاسب في التطبيق.
(2) عند النظر إلى الكود المصدر ، فهم العملية ثم خصم التفاصيل النحوية.
(3) تعلم من أفكار التنفيذ الذكية في الكود المصدري ، ولكن لا تنقل التصميم ، تصميم من أجل التصميم.
(4) استمر في تحليل الوسيطة ذات الصلة غدًا واستمر تحديثها. . . . . .