دليل Node.js ، الجزء الثاني: JavaScript ، V8 ، بعض حيل التطوير

من خلال نشر الجزء الأول من ترجمة هذا الدليل على Node.js ، قررنا معرفة رأي الجمهور حول ما إذا كان علينا الاستمرار في العمل على المشروع وإجراء استطلاع صغير. كما اتضح أن 94٪ من الذين صوتوا أيدوا مبادرتنا. حتى تلبية الجزء الثاني من البرنامج التعليمي Node.js.



سنتحدث اليوم عن نوع معرفة JS التي تحتاجها من أجل تطوير التطبيقات لنظام Node.js بكفاءة ، ومناقشة الاختلافات بين المتصفح ورمز جافا سكريبت من جانب الخادم ، ونتحدث عن محركات JS وبعض تقنيات تطوير Node.js.


ما نوع معرفة JS التي أحتاجها لتطوير Node.js؟


لنفترض أنك بدأت البرمجة للتو. ما هو العمق الذي تحتاجه لتعلم JavaScript لإتقان Node.js بنجاح؟ يصعب على المبتدئ الوصول إلى هذا المستوى عندما يكتسب ثقة كافية في مهاراته المهنية. بالإضافة إلى ذلك ، عند دراسة البرمجة ، قد تشعر أنك لا تفهم بالضبط أين ينتهي متصفح JavaScript ويبدأ تطوير Node.js.

إذا كنت في بداية مسار مبرمج جافا سكريبت ، أنصحك ، قبل الكتابة لـ Node.js ، بإتقان مفاهيم اللغة التالية بشكل جيد:

  • الإنشاءات المعجمية.
  • التعبيرات.
  • أنواع.
  • المتغيرات
  • وظائف
  • هذه الكلمة.
  • وظائف السهم
  • دورات
  • نطاقات.
  • المصفوفات
  • سلاسل القالب.
  • ضع فاصلة منقوطة.
  • اعمل في وضع صارم.

في الواقع ، تستمر هذه القائمة ، ولكن إذا كنت تتقن كل شيء ، فهذا يعني أنك ستضع أساسًا جيدًا لتطوير العميل والخادم المنتج في JavaScript.
تعتبر مفاهيم اللغة التالية مهمة جدًا أيضًا لفهم أفكار البرمجة غير المتزامنة ، والتي تعد أحد الأجزاء الأساسية لـ Node.js. على وجه الخصوص ، نحن نتحدث عن ما يلي:

  • وظائف البرمجة والاستدعاء غير المتزامنة.
  • المؤقتات.
  • وعود.
  • متزامن / في انتظار البناء.
  • دوائر قصيرة.
  • دورة الأحداث.

هناك العديد من مواد جافا سكريبت التي تسمح للمبتدئين بتعلم اللغة. على سبيل المثال ، إليك الدورة التدريبية للمؤلف لهذا الدليل ، وإليك قسمًا مفيدًا جدًا من MDN ، إليك البرنامج التعليمي لـ javascript.ru. يمكنك تعلم آليات JavaScript الأساسية على freecodecamp.com .

أعلاه ، تحدثنا عن كيف يمكن للمبتدئين أن يهتموا بمسألة أين تكمن الحدود بين تطوير خادم جافا سكريبت والعميل. لنتحدث عنه.

الاختلافات بين منصة Node.js والمتصفح


كيف يختلف تطوير JS لـ Node.js عن برمجة المتصفح؟ التشابه بين هذه البيئات هو أنه يتم استخدام نفس اللغة هناك وهناك. لكن تطوير التطبيقات المصممة للتشغيل في متصفح يختلف تمامًا عن تطوير تطبيقات الخادم. على الرغم من استخدام نفس اللغة ، هناك بعض الاختلافات الرئيسية التي تحول هذين النوعين من التطوير إلى أنشطة مختلفة تمامًا.

وتجدر الإشارة إلى أنه إذا كان شخصًا ما كان يتعلم الواجهة الأمامية لبدء Node.js ، فإن لديه فرصة جادة للغاية لإتقان كل ما هو ضروري بسرعة نظرًا لأنه سيكتب بلغة يعرفها بالفعل. إذا تمت إضافة الحاجة إلى تعلم بيئة جديدة والحاجة إلى تعلم لغة جديدة ، فإن المهمة ستكون أكثر تعقيدًا.
لذا فإن الاختلاف الرئيسي بين العميل والخادم هو البيئة التي يجب عليك البرمجة لها ، في الأنظمة البيئية لهذه البيئات.

في المستعرض ، يقع الجزء الأكبر من العمل على عمليات مختلفة مع مستندات الويب عبر DOM ، بالإضافة إلى استخدام واجهات برمجة تطبيقات منصة الويب الأخرى ، مثل ، على سبيل المثال ، آليات للعمل مع ملفات تعريف الارتباط. Node.js ، بالطبع ، لديه كل هذا. لا يوجد كائن document ، ولا كائن window ، بالإضافة إلى كائنات أخرى يوفرها المستعرض.

المستعرض ، بدوره ، ليس لديه آليات البرامج تلك المتوفرة في بيئة Node.js وتوجد في شكل وحدات يمكن توصيلها بالتطبيق. على سبيل المثال ، هذه واجهة برمجة تطبيقات للوصول إلى نظام الملفات.

فرق آخر بين تطوير العميل والخادم في JS هو أنه عند العمل في بيئة Node.js ، فإن المطور لديه السيطرة الكاملة على البيئة. ما لم تكن تقوم بتطوير تطبيق مفتوح المصدر يمكن تشغيله في أي مكان ، فأنت تعرف بالضبط ، على سبيل المثال ، أي إصدار من Node.js سيعمل مشروعك عليه. هذا أمر مريح للغاية مقارنة ببيئة العميل حيث يجب أن تعمل الشفرة في متصفح المستخدم. بالإضافة إلى ذلك ، هذا يعني أنه يمكنك ، دون خوف من المشاكل ، استخدام أحدث ميزات اللغة.

نظرًا لأن جافا سكريبت تتطور بسرعة كبيرة ، فإن المتصفحات ببساطة لا تملك الوقت الكافي لتنفيذ جميع ابتكاراتها بسرعة. بالإضافة إلى ذلك ، لا يعمل جميع المستخدمين على أحدث إصدارات المتصفحات. ونتيجة لذلك ، يضطر المطورون الذين يرغبون في استخدام شيء جديد في برامجهم إلى أخذ ذلك في الاعتبار ، والاهتمام بتوافق تطبيقاتهم مع المتصفحات التي يستخدمونها ، مما قد يؤدي إلى الحاجة إلى التخلي عن ميزات JavaScript الحديثة. يمكنك بالطبع استخدام ناقل Babel لتحويل الشفرة إلى تنسيق متوافق مع معيار EcmaScript 5 ، والذي تدعمه جميع المتصفحات ، ولكنك لن تحتاج إلى ذلك عند العمل مع Node.js.

هناك فرق آخر بين Node.js والمتصفحات هو أن Node.js يستخدم نظام الوحدة النمطية CommonJS ، بينما في المتصفحات يمكنك رؤية بداية تنفيذ معيار ES Modules. من الناحية العملية ، هذا يعني أنه حاليًا في Node.js ، يتم استخدام الإنشاء require() المطلوب لتوصيل التعليمات البرمجية الخارجية ، import في رمز المستعرض.

V8 ومحركات JavaScript أخرى


V8 هو اسم محرك جافا سكريبت المستخدم في متصفح Google Chrome. هو المسؤول عن تنفيذ كود JavaScript ، الذي يدخل إلى المتصفح عند العمل على الإنترنت. يوفر V8 وقت تشغيل لـ JavaScript. يتم توفير DOM وواجهات برمجة تطبيقات النظام الأساسي للويب الأخرى بواسطة المتصفح.

محرك JS مستقل عن المستعرض الذي يعمل فيه. هذه الحقيقة هي التي جعلت من الممكن ظهور وتطوير منصة Node.js. تم اختيار V8 كمحرك لـ Node.js في عام 2009. نتيجة للنمو الهائل في الشعبية ، تحول Node.js V8 إلى محرك أصبح الآن مسؤولًا عن تنفيذ كمية كبيرة من كود JS من جانب الخادم.

النظام البيئي لـ Node.js ضخم. وبفضل هذا ، يتم استخدام V8 أيضًا ، من خلال مشاريع مثل Electron ، لتطوير تطبيقات سطح المكتب.

وتجدر الإشارة إلى أنه بالإضافة إلى V8 ، هناك محركات أخرى:


لا تقتصر قائمة محركات JS على هذا.

تطبق هذه المحركات مواصفات ECMA-262 ، وتسمى أيضًا ECMAScript. هذه المواصفات هي التي توحد JavaScript. يمكن العثور على أحدث نسخة من المعيار هنا .

engineJS تطوير المحرك وطموح الأداء


محرك V8 مكتوب بلغة C ++ ، يتم تحسينه باستمرار. يمكن تشغيله على العديد من الأنظمة ، خاصة Mac و Windows و Linux. هنا لن نتحدث عن تفاصيل تنفيذ V8. يمكن العثور على معلومات عنها في منشورات أخرى ، بما في ذلك على الموقع الرسمي لـ V8 . تتغير بمرور الوقت ، وأحيانًا على محمل الجد.

V8 يتطور باستمرار ، ويمكن قول الشيء نفسه عن المحركات الأخرى. وهذا يؤدي ، على وجه الخصوص ، إلى زيادة في أداء متصفحات الويب ومنصة Node.js. تتنافس الشركات المصنعة لمحركات المتصفح باستمرار ، وتقاتل من أجل سرعة تنفيذ التعليمات البرمجية ، وهذا مستمر منذ سنوات عديدة. كل هذا مفيد للمستخدمين والمبرمجين.

▍ التفسير والتجميع


تعتبر لغة JavaScript لغة مترجمة ، لكن المحركات الحديثة بعيدة عن تفسير شفرة JS فقط. يقومون بتجميعها. يمكن ملاحظة هذا الاتجاه منذ عام 2009 ، عندما تمت إضافة مترجم JavaScript في Firefox 3.5 ، وبعد ذلك تبنت الشركات المصنعة الأخرى للمحركات والمتصفحات هذه الفكرة.

يقوم V8 بتجميع JavaScript لتحسين أداء التعليمات البرمجية. منذ ظهور خرائط Google في عام 2004 ، تطورت جافا سكريبت ، وتطورت من لغة ، لتنفيذ الميزات التفاعلية لتطبيقات الويب ، عادة ما يكتبون بضع عشرات من الأسطر ، إلى لغة يتم فيها كتابة تطبيقات المتصفح التي تتكون من الآلاف أو حتى المئات ألف سطر من التعليمات البرمجية. يمكن تشغيل هذه التطبيقات لساعات في المتصفح ، وهو يختلف تمامًا عن سيناريوهات استخدام JS القديمة ، حيث لا يمكن استخدام الرمز ، على سبيل المثال ، إلا للتحقق من صحة البيانات التي تم إدخالها في النماذج. في الظروف الحديثة ، يعد تجميع الكود أمرًا منطقيًا ، لأنه على الرغم من أن تنفيذ هذه الخطوة قد يؤخر لحظة إطلاق الكود ، إلا أن الكود يكون أكثر إنتاجية من الكود الذي سيتم معالجته حصريًا من قبل المترجم وسيعمل بشكل أسرع ، ولكنه سيعمل بشكل أبطأ.

الآن ، بعد مناقشة بعض الأحكام المتعلقة بمحركات JS ، وتفسير وتجميع التعليمات البرمجية ، دعنا ننتقل إلى الممارسة. وبالتحديد ، لنتحدث عن كيفية إغلاق تطبيقات Node.js.

الخروج من تطبيق Node.js


هناك عدة طرق لإغلاق تطبيقات Node.js.

لذلك ، عند تنفيذ برنامج في وحدة التحكم ، يمكنك إنهاء عمله باستخدام اختصار لوحة المفاتيح ctrl+c . لكننا مهتمون أكثر بطرق البرمجيات لإغلاق التطبيقات. وسنبدأ ، ربما ، بأمر وقح للخروج من البرنامج ، والذي ، كما ستفهم الآن ، من الأفضل عدم استخدامه.

توفر وحدة process kernel طريقة ملائمة تتيح لك الخروج من تطبيق Node.js برمجيًا. يبدو هذا:

 process.exit() 

عندما يصادف Node.js مثل هذا الأمر في التعليمات البرمجية ، فإن هذا يؤدي إلى حقيقة أن العملية تنتهي على الفور. هذا يعني أن كل شيء فعله البرنامج سيكون وقحًا وغير متقطع إلى حد ما. نحن نتحدث عن الاستدعاءات غير المدعوة ، حول طلبات الشبكة التي يتم تنفيذها في وقت الإصدار ، حول الإجراءات مع الملفات ، حول عمليات الكتابة في stdout أو stderr .

إذا كان هذا الموقف يناسبك ، يمكنك استخدام هذه الطريقة. عندما تسميها ، يمكنك تمريرها إلى عدد صحيح يمكن أن ينظر إليه نظام التشغيل على أنه رمز الخروج للبرنامج.

 process.exit(1) 

افتراضيًا ، يتم تعيين هذا الرمز على 0 ، مما يعني إتمامه بنجاح. رموز الخروج الأخرى لها معان مختلفة ، والتي قد تكون مفيدة لاستخدامها في النظام الخاص بك من أجل تأسيس تفاعل بعض البرامج مع الآخرين.
يمكن العثور على تفاصيل حول رموز إيقاف تشغيل البرنامج هنا .

يمكنك أيضًا تعيين رمز خروج للخاصية process.exitCode . يبدو هذا:

 process.exitCode = 1 

بعد انتهاء البرنامج ، سيعيد Node.js هذا الرمز إلى النظام.

وتجدر الإشارة إلى أن عمل البرنامج سينتهي بشكل طبيعي من تلقاء نفسه بعد قيامه بجميع الإجراءات المحددة فيه. ومع ذلك ، في حالة Node.js ، غالبًا ما تكون هناك برامج تم تصميمها ، في ظل الظروف المثالية ، للعمل لمدة غير محددة. نحن نتحدث ، على سبيل المثال ، عن خوادم HTTP مثل هذا:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) 

مثل هذا البرنامج ، إذا لم يحدث شيء ، من الناحية النظرية ، يمكن أن يعمل إلى الأبد. في هذه الحالة ، إذا قمت باستدعاء process.exit() ، فسوف تتم مقاطعة العمليات التي يتم إجراؤها في وقت استدعاء هذا الأمر. وهذا أمر سيئ.

لإكمال عمل هذه البرامج ، تحتاج إلى استخدام إشارة SIGTERM وتنفيذ الإجراءات اللازمة باستخدام المعالج المناسب.

يرجى ملاحظة أنه لاستخدام كائن process ، لا تحتاج إلى توصيل أي شيء باستخدام ما require ، لأن هذا الكائن متاح لتطبيقات Node.js بشكل افتراضي.

خذ بعين الاعتبار المثال التالي:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { app.close(() => {   console.log('Process terminated') }) }) 

ما هي الإشارات؟ الإشارات هي وسيلة للتفاعل بين العمليات في معيار POSIX (واجهة نظام التشغيل المحمولة). يتم إرسال إخطارات إلى العملية من أجل إبلاغه ببعض الأحداث.

على سبيل المثال ، تشير إشارة SIGKILL إلى عملية تحتاج إلى إيقاف التشغيل على الفور. يعمل بشكل مثالي تمامًا مثل process.exit() .

تخبر إشارة SIGTERM العملية أنها تحتاج إلى إجراء إيقاف تشغيل عادي. يتم إرسال هذه الإشارات من مديري العمليات ، مثل upstart أو supervisord ، ومن العديد من الآخرين.

يمكنك إرسال مثل هذه الإشارة من البرنامج نفسه ، باستخدام الأمر التالي:

 process.kill(process.pid, 'SIGTERM') 

لإكمال مثل هذا الأمر بنجاح ، تحتاج إلى معرفة PID للعملية التي تخطط لإكمالها.

قراءة متغيرات البيئة من Node.js


تحتوي وحدة kernel process على خاصية env ، والتي تتيح الوصول إلى جميع متغيرات البيئة التي تم تعيينها في وقت بدء العملية.

فيما يلي مثال للعمل مع متغير البيئة NODE_ENV ، والذي يتم تعيينه افتراضيًا على development :

 process.env.NODE_ENV // "development" 

إذا قمت بتعيين البرنامج على production قبل تشغيل البرنامج النصي ، فسيخبر Node.js أن البرنامج يعمل في بيئة إنتاج.

وبالمثل ، يمكنك العمل مع متغيرات البيئة الأخرى ، على سبيل المثال ، تلك التي قمت بتعيينها بنفسك.

الملخص


تطرقنا اليوم إلى البرمجة المستندة إلى المتصفح والبرمجة من جانب الخادم في جافا سكريبت ، وتحدثنا عن محركات JS ، وكيفية إيقاف تشغيل تطبيقات الخادم ، وكيفية قراءة متغيرات البيئة من برامج Node.js. في المرة القادمة سنتحدث عن استضافة تطبيقات Node.js ، وكيفية استخدام Node.js في وضع REPL ، وكيفية التعامل مع الحجج التي يمكن تمريرها إلى البرامج النصية عند الاتصال بها ، وكيفية التفاعل مع وحدة التحكم ، وكيفية تصميم الرمز في النموذج الوحدات.

أعزائي القراء! ما هي دروس جافا سكريبت التي توصي بها للمبتدئين؟

Source: https://habr.com/ru/post/ar423153/


All Articles