منذ بدايتها ، لم يعتبر أحد من أي وقت مضى JavaScript كلغة برمجة. في عصر الويب 1.0 ، تم استخدام لغة البرمجة النصية هذه بشكل أساسي للتحقق من النماذج وصفحة الويب المؤثرات الخاصة. لم يكن حتى عصر الويب 2.0 ، استخدمها المهندسون الأماميون لتحسين تجربة المستخدم بشكل كبير على صفحة الويب التي تم تقدير JS على نطاق واسع. نظرًا لأن JS يصبح شائعًا بشكل متزايد ، فإنه يخضع لتغييرات في مكتبة الأدوات ومكتبة المكونات وإطار الواجهة الأمامية والتطبيقات الأمامية. تفتقر JavaScript بطبيعتها إلى ميزة: الوحدات ، وظهور مواصفات CommonJS يعوض عن هذا القصور. ستقدم هذه المقالة آلية مواصفات CommonJS وآلية وحدة العقدة.
في اللغات الأخرى عالية المستوى ، تحتوي Java على ملفات فئة ، و Python لديها آلية استيراد ، وتتضمن PHP وتتطلب. الطريقة التي تقدم بها JS الكود من خلال علامة <script> تبدو فوضوية. في الماضي ، كان على الناس استخدام مساحات الأسماء وطرق أخرى لتقييد الكود بشكل مصطنع. لم يكن حتى ظهرت مواصفات CommonJS أن JavaScript في الواجهة الأمامية والخلفية قادرة على تحقيق وحدة رائعة. تقترض العقدة مواصفات وحدات CommonJS لتنفيذ نظام وحدة سهل الاستخدام للغاية.
1. مواصفات وحدة الشائعة
تنقسم مواصفات وحدة CommonJS إلى 3 أجزاء:
1). مرجع الوحدة النمطية: أدخل واجهة برمجة تطبيقات الوحدة النمطية في السياق الحالي من خلال طريقة المتطلبات () وتمرير معرف الوحدة ، مثل Var Math = require ("Math") ؛
2). تعريف الموديل: تصدير الطرق أو متغيرات الوحدة الحالية من خلال كائن التصدير. يوجد أيضًا كائن الوحدة النمطية في الوحدة النمطية ، والصادرات هي في الواقع سمة الوحدة النمطية. في العقدة ، يكون الملف عبارة عن وحدة ، و "المتغيرات العالمية" في الوحدة غير مرئية للعالم الخارجي. فقط السمات المثبتة على الصادرات هي عامة ، مثل التصدير. orports.pi = 3.1415926 ؛
3). معرف module: هو في الواقع المعلمة التي تم تمريرها لتتطلب (). على سبيل المثال ، "الرياضيات" المذكورة أعلاه ، يجب أن تكون سلسلة تتوافق مع تسمية الجمل ، أو مسار نسبي أو مطلق يبدأ بـ ". ".." لا يمكن أن يكون لها لاحقة اسم الملف ".js"
2. عملية تنفيذ وحدة العقدة
في العقدة ، تنقسم الوحدات النمطية إلى فئتين: إحداها هي الوحدة الأساسية التي توفرها العقدة نفسها ، والآخر هو وحدة الملف التي كتبها المستخدم نفسه. يتم تجميع بعض الوحدات الأساسية في ملفات ثنائية أثناء تجميع رمز مصدر العقدة. عند بدء تشغيل العقدة ، يتم تحميل الوحدة الأساسية مباشرة في الذاكرة ، وبالتالي فإن سرعة التحميل هي الأسرع. يتم تحميل وحدة الملف ديناميكيًا في وقت التشغيل وتتطلب ثلاث خطوات: تحليل المسار ، وموقع الملف ، والتجميع والتنفيذ. لاحظ أن ذاكرة التخزين المؤقت للعقدة قدمت وحدات لتقليل النفقات العامة أثناء المقدمة الثانوية ، وتبني الاستراتيجية الأكثر تفضيلًا للتحميل الثانوي لنفس الوحدة.
2.1 تحليل المسار
يحلل تحليل المسار بشكل أساسي معرفات الوحدة النمطية المذكورة أعلاه ، والتي تنقسم بشكل أساسي إلى الفئات التالية:
1) الوحدات الأساسية ، مثل HTTP ، FS ، المسار ، إلخ.
2) وحدة ملف المسار النسبي بدءا من. أو .
3) وحدة ملفات المسار المطلقة تبدأ بـ /
4) وحدة الملفات المخصصة ، والتي قد تكون في شكل ملف أو حزمة. ستحاول Node العثور على الملف الهدف واحدًا تلو الآخر وفقًا لوحدة Array Module.
2.2 موقع الملف
بناءً على تحليل المسار ، يجب الانتباه إلى التفاصيل التالية:
1) تحليل تمديد الملف: نظرًا لأن مواصفات CommonJS تسمح بعدم ملء معرفات الوحدة النمطية ، فسيحاول العقدة بترتيب .js و .json و .node
2) تحليل الدليل والحزمة: إذا لم يتم العثور على ملف مقابل بعد تحليل تمديد الملف أعلاه ، ولكن يتم الحصول على دليل ، ستتعامل العقدة مع الدليل كحزمة.
2.3 التجميع والتنفيذ
بعد تحديد موقع الملف المحدد ، ستقوم العقدة بإنشاء كائن وحدة جديد ، تحميل وتجميع وفقًا للمسار. للحصول على امتدادات مختلفة ، تختلف طريقة التحميل:
1)
2)
3) ملف
4) ملفات الامتداد الأخرى: يتم تحميلها كملفات .js
نحن نعلم أن كل ملف وحدة يحتوي على ثلاثة متغيرات: تتطلب الصادرات ، والوحدة النمطية افتراضيًا. حتى في وثيقة API في العقدة ، نعلم أن كل وحدة لديها أيضًا متغيرين: اسم الملف و dirname. من أين أتوا؟ كيف تحقق وحدة العقدة أن "المتغيرات العالمية" المعلنة لن تلوث وحدات أخرى في الواقع؟ في الواقع ، ستقوم العقدة بلف محتويات الملف في البداية والنهاية أثناء تجميع وحدة JS. فيما يلي مثال على ملف JS يتم لفه بواسطة الرأس والذيل:
نسخة الكود كما يلي:
(الوظيفة (الصادرات ، المتطلبات ، الوحدة النمطية ، __filename ، __dirname) {
/* الوسط هو المحتوى الفعلي لملف JS*/
var math = require ('Math') ؛
orports.area = دالة (نصف قطر) {
إرجاع Math.pi * نصف قطر * دائرة نصف قطرها ؛
} ؛
/* ينتهي المحتوى الفعلي لملف JS*/
}) ؛
وبهذه الطريقة ، يتم حقن كل ملف وحدة عزل ، ويتم حقن المتغيرات مثل المتطلبات ، والصادرات ، والوحدات النمطية ، وما إلى ذلك في سياق الوحدة النمطية. هذا هو تنفيذ مواصفات وحدة Node's CommonJS. تكون عملية تجميع وحدة C/C ++ ووحدة CORE معقدة نسبيًا ، لذلك لن أكررها مرة أخرى.
3. كومة استدعاء الوحدة النمطية
من الضروري توضيح علاقات استدعاء الوحدات المختلفة في العقدة ، كما هو موضح في الشكل أدناه:
الوحدة النمطية المدمجة من C/C ++ هي وحدة أقل مستوى وتنتمي إلى الوحدة النمطية الأساسية. يوفر أساسًا واجهات برمجة التطبيقات لاتصال وحدات JavaScript Core ووحدات ملف JavaScript بجهات خارجية. في الواقع ، لا يوجد أي اتصال تقريبًا مع هذه الوحدات. هناك مسؤوليتان رئيسيتان للوحدة النمطية الأساسية لـ JavaScript: إحداها هي العمل كطبقة تغليف وطبقة سد الوحدة النمطية المدمجة من C/C ++ لمكالمات وحدة الملفات ، والآخر هو وحدة وظيفية نقية لا تحتاج إلى التعامل مع الطبقة الأساسية. عادة ما تتم كتابة وحدات الملفات من قبل أطراف ثالثة ، بما في ذلك وحدات JavaScript العادية ووحدات امتداد C/C ++.
4. الحزمة و NPM
4.1 بنية الحزمة
الحزمة هي في الأساس ملف أرشيف (عادةً ما يكون .zip أو .tar.gz) ، والذي يتم إلغاء ضغطه واستعادته إلى دليل بعد التثبيت. تتكون مواصفات حزمة CommonJS من جزأين: بنية الحزمة وملف وصف الحزمة. يجب أن تحتوي بنية الحزمة التي تتوافق تمامًا مع مواصفات CommonJS على الملفات التالية:
1) .package.json: ملف وصف الحزمة
2) .bin: الدليل حيث يتم تخزين الملفات الثنائية القابلة للتنفيذ
3) .lib: الدليل حيث يتم تخزين رمز JavaScript
4) .DOC: الدليل حيث يتم تخزين المستند
5). الاختبار: الدليل حيث يتم تخزين حالات اختبار الوحدة
4.2 ملف وصف الحزمة
ملف وصف الحزمة هو ملف JSON - Package.json ، الموجود في الدليل الجذر للحزمة ، هو جزء مهم من الحزمة ويتم استخدامه لوصف المعلومات العامة للحزمة. ترتبط جميع سلوكيات NPMS التي سيتم ذكرها لاحقًا ارتباطًا وثيقًا بحقول هذا الملف. أدناه ، سنستخدم ملف Package.json لمشروع إطار ويب معروف كمثال لتوضيح معنى بعض الحقول الشائعة الاستخدام.
1) .NAME: اسم الحزمة
2) .Description: حزمة مقدمة
3) .version: يجب أن يتوافق رقم الإصدار مع "التحكم في الإصدار الدلالي" ، راجع http://semver.org/
4). الاعتماد: استخدم قائمة الحزم التي تحتاج الحزمة الحالية إلى الاعتماد عليها. هذه الخاصية مهمة جدا. ستقوم NPM بتحميل الحزمة التابعة تلقائيًا من خلال هذه الخاصية
5) .repositories: قائمة المواقع لاستضافة رمز المصدر
يمكن إحالة استخدام الحقول الأخرى إلى الوصف
4.3 الوظائف الشائعة لـ NPM
NPM (مدير حزمة العقدة) ، المعروف باسم مدير حزمة العقدة. وظيفتها الرئيسية هي إدارة حزم العقدة ، بما في ذلك: التثبيت ، إلغاء التثبيت ، التحديث ، العرض ، البحث ، النشر ، إلخ.
4.3.1 تثبيت حزمة NPM
هناك نوعان من تثبيت حزم العقدة: التثبيت المحلي والتثبيت العالمي. الفرق بين الاثنين على النحو التالي:
1). التثبيت المحلي NPM تثبيت <Pack-Name>: سيتم تنزيل الحزمة على الدليل الحالي ولا يمكن استخدامه إلا في الدليل الحالي.
2). التثبيت العالمي NPM تثبيت -g <Pack -Name>: سيتم تنزيل الحزمة على دليل نظام معين ، ويمكن استخدام الحزمة المثبتة في جميع الدلائل.
4.3.2 إدارة حزمة NPM
فيما يلي قائمة بأوامر إدارة الحزم شائعة الاستخدام باستخدام Grunt-Cli (أداة سطر الأوامر Grunt) كمثال:
1.
2 ).
3 ).
4). NPM إلغاء تثبيت Grunt-Cli
5). NPM قائمة: تحقق من التثبيت على الحزم
6 ).