Node.js هي لغة خلفية ناشئة مصممة لمساعدة المبرمجين على بناء تطبيقات قابلة للتطوير بسرعة. يحتوي Node.js على العديد من الميزات الجذابة ، وهناك تقارير لا حصر لها. ستقوم هذه المقالة بتحليل ومناقشة ميزات EventEmitter ، والتدفقات ، وأسلوب الترميز ، والبطانة ، وأسلوب الترميز وغيرها لمساعدة المستخدمين على فهم أعمق لـ Node.js.
كمنصة مبنية على وقت تشغيل Chrome JavaScript ، يبدو أن فهمنا ذي الصلة لـ JavaScript قابلة للتطبيق على تطبيقات العقدة ؛ بدون امتدادات أو تعديلات لغوية إضافية ، يمكننا تطبيق تجربة البرمجة الأمامية على البرمجة الخلفية.
eventemitter (مرسل الحدث)
بادئ ذي بدء ، يجب أن تفهم نموذج EventEmitter. يمكن أن يرسل حدثًا بالإضافة إلى حدث يثير اهتمام المستهلك. يمكننا التفكير في الأمر كامتداد لنمط تمريرة رد الاتصال إلى وظيفة غير متزامنة. على وجه الخصوص ، سيكون لدى EventEmitter ميزة أكثر عندما تكون هناك حاجة لتراجعات متعددة.
على سبيل المثال ، يرسل المتصل طلب "ملف قائمة" إلى الخادم البعيد. قد ترغب في تجميع النتائج التي تم إرجاعها وإجراء رد اتصال لكل مجموعة. يتيح لك نموذج EventEmitter إرسال عمليات اتصال "ملف" على كل مجموعة وأداء "نهاية" عند اكتمال جميع العمليات.
عند استخدام EventEmitter ، ما عليك سوى تعيين الأحداث والمعلمات ذات الصلة.
نسخة الكود كما يلي:
var eventEmitter = require ("الأحداث"). EventEmitter ؛
var util = require ('Util') ؛
وظيفة myClass () {
if (! (هذا مثيل myclass)) إرجاع جديد myclass () ؛
eventemitter.call (هذا) ؛
var self = this ؛
setTimeout (وظيفة timeoutcb () {
self.emit ('myevent' ، 'hello world' ، 42) ؛
} ، 1000) ؛
}
util.inherits (myClass ، eventemitter) ؛
يخلق مُنشئ MyClass زنادًا مع تأخير مشغل من 1s وحدث الزناد من MyEvent. لاستخدام الأحداث ذات الصلة ، تحتاج إلى تنفيذ طريقة ON ():
نسخة الكود كما يلي:
var myobj = new myClass () ؛
var start = date.now () ؛
myobj.on ('myevent' ، وظيفة myeventcb (str ، num) {
console.log ('myevent reggered' ، str ، num ، date.now () - start) ؛
}) ؛
تجدر الإشارة هنا إلى أنه على الرغم من أن حدث EventEmitter المشترك هو حدث غير متزامن ، عندما يتم توجيه الوقت ، سيتم مزامنة إجراءات المستمع. لذلك ، إذا كان حدث MyEvent أعلاه يحتوي على 10 مستمعين ، فسيتم استدعاء جميع المستمعين بالترتيب دون انتظار حلقة الحدث.
إذا قامت الفئة الفرعية من EventEmitter بإنشاء حدث (Error ") ، ولكن لا يوجد مستمع يشترك فيه ، فإن فئة Base EventEmitter تطرح استثناء ، مما تسبب في تشغيل حدث Uncaughtexception عند تنفيذ كائن العملية.
فيرور
Verror هو امتداد لخطأ الفئة الأساسية ، والذي يسمح لنا بتحديد رسائل الإخراج باستخدام تنسيق حرف printf.
تيارات
إذا كان هناك ملف كبير جدًا يجب معالجته ، فيجب أن تكون الطريقة المثالية هي قراءة الجزء وكتابة جزء. بغض النظر عن حجم الملف ، سيتم معالجته دائمًا طالما يسمح الوقت. هذا يتطلب مفهوم التدفق. التدفقات هي نموذج آخر يستخدم على نطاق واسع في العقدة ، في العقدة ، تطبيق EventEmitter. يوفر واجهات دوبلكس قابلة للقراءة أو قابلة للكتابة أو كاملة. إنها واجهة مجردة ، وتشمل أحداث التشغيل العادية المقدمة: قابلة للقراءة ، قابلة للكتابة ، تصريف ، البيانات ، النهاية والإغلاق. إذا استطعنا استخدام خطوط الأنابيب لدمج هذه الأحداث بشكل فعال ، فسيتم تحقيق تفاعلات أكثر قوة.
باستخدام .pipe () ، يمكن ملاحظة التواصل مع الضغط الخلفي من خلال خط الأنابيب. يعني الضغط الخلفي: فقط تلك التي يمكن كتابتها ، أو فقط تلك التي يمكن قراءتها.
على سبيل المثال ، نرسل الآن بيانات من stdin إلى ملف محلي وخادم عن بُعد:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
var net = require ('net') ؛
var localfile = fs.createwRiteStream ('localfile.tmp') ؛
net.connect ('255.255.255.255' ، 12345 ، function (client) {
process.stdin.pipe (client) ؛
process.stdin.pipe (localfile) ؛
}) ؛
وإذا أردنا إرسال بيانات إلى ملف محلي ونريد استخدام Gunzip لضغط هذا الدفق ، فيمكننا القيام بذلك:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
var zlib = require ('Zlib') ؛
process.stdin.pipe (zlib.creategunzip ()). الأنابيب (fs.createwRiteStream ('localfile.tar')) ؛
إذا كنت تريد معرفة المزيد عن الدفق ، يرجى النقر هنا.
تدفق التحكم (التحكم في العملية)
نظرًا لأن JS لديها مفاهيم وظيفية مثل الكائنات من الدرجة الأولى والإغلاق وما إلى ذلك ، فمن الممكن تحديد أذونات رد الاتصال بسهولة. هذا مريح للغاية عند النماذج الأولية ، ويمكنه دمج الأذونات المنطقية عند الطلب. ولكن من السهل استخدام وظائف خرقاء مدمجة.
على سبيل المثال ، نريد قراءة سلسلة من الملفات بالترتيب ثم تنفيذ مهمة:
نسخة الكود كما يلي:
fs.readfile ('firstfile' ، 'utf8' ، وظيفة firstcb (err ، firstfile) {
dosomething (Firstfile) ؛
fs.readfile ('Secondfile' ، 'Utf8' ، function SecondCB (err ، secondfile) {
dosomething (Secondfile) ؛
Fs.ReadFile ('Thirdfile' ، 'Utf8' ، وظيفة thirdcb (err ، thirdfile) {
dosomething (Thirdfile) ؛
}) ؛
}) ؛
}) ؛
مشاكل هذا النمط هي:
1. منطق هذه الرموز مبعثر للغاية وغير منظم ، ومن الصعب فهم العمليات التشغيلية ذات الصلة.
2. لا يتم التعامل مع أي أخطاء أو استثناءات.
3. تسرب ذاكرة الإغلاق في JS شائعة جدًا ويصعب تشخيصها واكتشافها.
إذا كنا نريد إجراء سلسلة من العمليات غير المتزامنة على مجموعة إدخال ، فإن استخدام مكتبة التحكم في العمليات يعد اختيارًا أكثر ذكاءً. يستخدم Vasync هنا.
Vasync هي مكتبة للتحكم في العمليات التي تأتي أفكارها من العمليات غير المتزامنة. ما يجعل الأمر مميزًا هو أنه يسمح للمستهلكين بعرض ومراقبة عملية مهمة معينة. هذه المعلومات مفيدة للغاية لدراسة عملية خطأ معين.
نمط الترميز (نمط البرمجة)
نمط البرمجة هو الموضوع الأكثر إثارة للجدل لأنه غالبًا ما يكون غير رسمي. كل شخص لديه تفضيلاتهم الخاصة. من المهم أن تجد أسلوبًا يناسب الأفراد والفرق. قد يجعل بعض التراث التقليدي رحلة تطوير العقدة مكانًا أفضل.
1. اسم الوظيفة
2. حاول تسمية جميع الوظائف.
3. تجنب الإغلاق
4. لا تحدد وظائف أخرى في وظيفة معينة. هذا يقلل من العديد من حوادث تسرب ذاكرة الإغلاق غير المتوقعة.
5. وظائف أكثر وأصغر
على الرغم من أن V8 JIT هو محرك قوي ، إلا أن الوظائف الأصغر والأرق ستكون أفضل مع V8. علاوة على ذلك ، إذا كانت وظائفنا كلها صغيرة ورائعة (حوالي 100 سطر) ، فسوف نشكر أنفسنا أيضًا عند قراءة وصيانة أنفسنا.
تحقق من النمط برمجيًا: الحفاظ على تناسق النمط واستخدم أداة فحص لتحسينه. نحن نستخدم jsstyle.
linting (فحص الرمز)
يمكن أن تقوم أداة LINT بإجراء تحليل ثابت للرمز دون تشغيل ، والتحقق من الأخطاء والمخاطر المحتملة ، مثل عبارات الاستراحة المفقودة في CaseWitch. LINT ليست ببساطة مكافئة لفحص الأسلوب ، فهي تهدف إلى تحليل المخاطر الموضوعية بدلاً من خيارات النمط الذاتي. نستخدم JavaScriptLint ، التي لديها عناصر فحص غنية.
تسجيل (تسجيل)
عندما نكون البرمجة والترميز ، نحتاج إلى رؤية طويلة الأجل. على وجه الخصوص ، فكر في الأدوات اللازمة لاستخدام تصحيح الأخطاء. الخطوة الأولى الممتازة هي القيام بتسجيل فعال. نحتاج إلى تحديد المعلومات ومعرفة ما يتم إيلاء اهتمام خاص به أثناء تصحيح الأخطاء وما هو المستخدم للتحليل والبحث في وقت التشغيل. يوصى باستخدام Bunyan ، ومكتبة تسجيل Node.js مباشرة ، وتنسيق إخراج البيانات هو JSON. لمزيد من المعلومات ، يرجى النقر هنا.
خادم العميل
إذا كان التطبيق قد وزع قدرات المعالجة ، فسيكون ذلك أكثر جاذبية في السوق. يمكن وصف واجهات مماثلة باستخدام واجهة برمجة تطبيقات HTTP Restful أو TCP JSON الأصلية. يتيح ذلك للمطورين الجمع بين الخبرة على العقدة مع بيئات الشبكات غير المتزامنة ، وكذلك استخدام التدفقات مع الأنظمة الموزعة والقابلة للتطوير.
الأدوات المشتركة:
1. إعادة توحيد
ببساطة ، هذه أداة لبناء خدمات الراحة. إنه يوفر دعمًا جيدًا للمشاهدة وتصحيح الأخطاء ، مع دعم Bunyan و Dtrace.
2. سريع
Fast هي أداة خفيفة الوزن تستخدم TCP لمعالجة رسائل JSON. يتم توفير دعم DTRACE ، والذي يسمح لنا بتحديد خصائص الأداء بسرعة لعملاء الخادم.
3. سير العمل
سير العمل مبني على إعادة تكرار ويمكنه تحديد العمليات التجارية لسلسلة من الخدمات عن بُعد وواجهة برمجة التطبيقات. على سبيل المثال: حالة الخطأ ، المهلة ، إعادة الاتصال ، معالجة الازدحام ، إلخ.