JavaScript هي واحدة من لغات البرمجة الأكثر استخدامًا في العالم. إنها اللغة الشائعة في عالم الويب وتستخدمها جميع المتصفحات. تعود ولادة JavaScript إلى عصر Netscape ، وتم تطوير محتواه الأساسي على عجل لمحاربة Microsoft والمشاركة في حرب المتصفح الشرسة في ذلك الوقت. بسبب الإصدار المبكرة ، أدت بعض ميزاتها الفقيرة إلى حتما.
على الرغم من أن وقت تطويره قصير ، إلا أن JavaScript لا يزال لديه العديد من الميزات القوية ، باستثناء ميزة مشاركة مساحة أسماء عالمية لكل نص.
بمجرد تحميل صفحة الويب برمز JavaScript ، يتم حقنها في مساحة الاسم العالمية وستشارك نفس مساحة العنوان مثل جميع البرامج النصية المحملة الأخرى ، والتي ستؤدي إلى العديد من المشكلات الأمنية والصراعات وبعض المشكلات الشائعة ، مما يجعل الأخطاء صعبة التتبع وصعوبة حلها.
ولكن لحسن الحظ ، حددت Node بعض المواصفات لجافا سكريبت من جانب الخادم وتنفذ أيضًا معيار وحدة CommonJS. في هذا المعيار ، يكون لكل وحدة سياقها الخاص ويتميز عن الوحدات الأخرى. هذا يعني أن الوحدات لن تلوث النطاق العالمي ، لأنه لا يوجد ما يسمى النطاق العالمي على الإطلاق ، ولن تتداخل الوحدات النمطية مع بعضها البعض.
في هذا الفصل ، سوف نتعرف على عدة وحدات مختلفة وكيفية تحميلها.
يمكن أن يساعدك تقسيم الكود إلى سلسلة من الوحدات المحددة جيدًا على التحكم في التطبيق الخاص بك. أدناه سوف نتعلم كيفية إنشاء وحداتك الخاصة واستخدامها.
تعرف على كيفية تحميل العقدة وحدات
في العقدة ، يمكن الرجوع إلى الوحدات النمطية من خلال مسارات الملف أو أسماء الوحدات النمطية. إذا تمت الرجوع إلى وحدة غير متنوع بالاسم ، فستقوم العقدة في النهاية بإيصال اسم الوحدة النمطية إلى مسار ملف الوحدة المقابلة. وسيتم تحميل هذه الوحدات الأساسية التي تحتوي على وظائف أساسية مسبقًا عند بدء العقدة.
تتضمن الوحدات النمطية غير الأساسية وحدات طرف ثالث مثبتة باستخدام NPM (Manager Manager Node) ، بالإضافة إلى الوحدات المحلية التي أنشأتها أنت أو زملائك.
كل وحدة تم استيرادها بواسطة البرنامج النصي الحالي ستعرض مجموعة من واجهات برمجة التطبيقات المكشوفة للمبرمج. قبل استخدام الوحدة النمطية ، تحتاج إلى استخدام وظيفة المتطلبات لاستيرادها ، مثل هذا:
نسخة الكود كما يلي:
وحدة var = require ('module_name')
سوف يستورد الرمز أعلاه وحدة نمطية تسمى MODULE_NAME. قد تكون وحدة أساسية أو وحدة نمطية مثبتة مع NPM. تُرجع دالة المتطلبات كائنًا يحتوي على جميع واجهات برمجة التطبيقات العامة للوحدة. بناءً على الوحدة النمطية ، قد يكون الكائن الذي تم إرجاعه أي قيمة javaScript ، أو يمكن أن يكون وظيفة ، أو كائن يحتوي على سلسلة من السمات (وظائف ، أو صفائف ، أو أي كائن JavaScript).
وحدة التصدير
نظام وحدة CommonJS هو الطريقة الوحيدة لمشاركة الكائنات والوظائف بين الملفات الموجودة أسفل العقدة. بالنسبة لبرنامج معقد للغاية ، يجب عليك إعادة بناء بعض الفئات أو الكائنات أو الوظائف في سلسلة من الوحدات القابلة لإعادة الاستخدام المحددة جيدًا. بالنسبة لمستخدمي الوحدة النمطية ، تعرض الوحدة فقط الرمز الذي حددته للعالم الخارجي.
في المثال التالي ، سوف تفهم أنه في العقدة ، تتوافق الملفات والوحدات النمطية واحدة تلو الأخرى. أنشأنا ملفًا يسمى Circle.js ، والذي يقوم فقط بتصدير مُنشئ الدائرة إلى الخارج.
نسخة الكود كما يلي:
دائرة الدالة (x ، y ، r) {
وظيفة r_squared () {
إرجاع Math.Pow (R ، 2) ؛
}
وظيفة الوظيفة () {
إرجاع Math.pi * r_squared () ؛
}
العودة {المنطقة: المنطقة} ؛
}
module.exports = circle ؛
أهم شيء في الكود هو السطر الأخير ، والذي يحدد ما تصدره الوحدة النمطية إلى الخارج. الوحدة النمطية هي متغير خاص ، يمثل الوحدة الحالية نفسها ، و Module.exports هو كائن يتم تصديره من الوحدة النمطية. يمكن أن يكون أي كائن. في هذا المثال ، نقوم بتصدير مُنشئ الدائرة بحيث يمكن لمستخدمي الوحدة النمطية استخدام هذه الوحدة لإنشاء مثيلات دائرة.
يمكنك أيضًا تصدير بعض الكائنات المعقدة ، تتم تهيئة AdvesTs إلى كائن فارغ ، وتصدير أي شيء تريد تعريضه للعالم الخارجي كسمات للوحدة النمطية. على سبيل المثال ، قمت بتصميم وحدة تعرض مجموعة من الوظائف إلى الخارج:
نسخة الكود كما يلي:
وظيفة printa () {
console.log ('a') ؛
}
وظيفة printb () {
console.log ('b') ؛
}
وظيفة printc () {
console.log ('c') ؛
}
module.exports.printa = printa ؛
module.exports.printb = printb ؛
module.exports.pi = math.pi ؛
تصدر هذه الوحدة وظيفتين (printa و printb) ورقم (PI) ، ويبدو أن رمز الاتصال هكذا:
نسخة الكود كما يلي:
var mymodule2 = require ('./ mymodule2') ؛
mymodule2.printa () ؛ // -> أ
mymodule2.printb () ؛ // -> ب
console.log (mymodule2.pi) ؛ // -> 3.141592653589793
وحدة التحميل
كما ذكرنا سابقًا ، يمكنك استخدام وظيفة المتطلبات لتحميل الوحدات النمطية ، ولا تقلق من أن الاتصال المتطلبات في الكود سيؤثر على مساحة الاسم العالمية ، لأنه لا يوجد مفهوم للمساحة العالمية في العقدة. إذا كانت الوحدة موجودة بدون أي بناء جملة أو أخطاء تهيئة ، فستقوم وظيفة المتطلبات بإرجاع كائن الوحدة ، ويمكنك أيضًا تعيين هذا الكائن لأي متغير محلي.
هناك عدة أنواع مختلفة من الوحدات النمطية ، والتي يمكن تقسيمها تقريبًا إلى وحدات أساسية ، وحدات محلية ووحدات الطرف الثالث المثبتة من خلال NPM. وفقًا لنوع الوحدة النمطية ، هناك عدة طرق للإشارة إلى الوحدات النمطية. دعونا نتعرف على هذه المعرفة أدناه.
تحميل الوحدة الأساسية
تحتوي العقدة على بعض الوحدات التي تم تجميعها في ملفات ثنائية ، تسمى الوحدات الأساسية. لا يمكن الرجوع إليها بواسطة المسارات ، ولا يمكن استخدامها إلا مع أسماء الوحدات النمطية. تحتوي الوحدة الأساسية على أعلى أولوية تحميل ، وحتى إذا كانت هناك بالفعل وحدة طرف ثالث تحمل نفس الاسم ، فسيتم تحميل الوحدة الأساسية أولاً.
على سبيل المثال ، إذا كنت ترغب في تحميل وحدة HTTP Core واستخدامها ، فيمكنك القيام بذلك:
نسخة الكود كما يلي:
var http = require ('http') ؛
سيؤدي ذلك إلى إرجاع كائن يحتوي على وحدة HTTP ، والتي تحتوي على واجهات برمجة التطبيقات الخاصة بوحدات HTTP المحددة في وثائق API العقدة.
تحميل وحدة الملفات
يمكنك أيضًا استخدام المسارات المطلقة لتحميل الوحدات النمطية من نظام الملفات:
نسخة الكود كما يلي:
var mymodule = require ('/home/pedro/my_modules/my_module') ؛
يمكنك أيضًا استخدام مسار نسبي بناءً على الملف الحالي:
نسخة الكود كما يلي:
var mymodule = require ('../ my_modules/my_module') ؛
var mymodule2 = require ('./ lib/my_module_2') ؛
انتبه إلى الرمز أعلاه. يمكنك حذف امتداد اسم الملف. إذا لم تتمكن العقدة من العثور على هذا الملف ، فسوف تحاول إضافة لاحقة JS للبحث مرة أخرى بعد اسم الملف (ملاحظة المترجم: في الواقع ، بالإضافة إلى JS ، ستبحث أيضًا عن JSON و Node. للحصول على التفاصيل ، يمكنك رؤية وثائق الموقع الرسمي). لذلك ، إذا كان هناك ملف يسمى my_module.js في الدليل الحالي ، فستكون هناك طريقتان للتحميل:
نسخة الكود كما يلي:
var mymodule = require ('./ my_module') ؛
var mymodule = require ('./ my_module.js') ؛
تحميل وحدة الدليل
يمكنك أيضًا استخدام مسار الدليل لتحميل الوحدة:
نسخة الكود كما يلي:
var mymodule = require ('./ mymoduledir') ؛
سوف تفترض Node أن هذا الدليل هو حزمة الوحدة النمطية ومحاولة البحث عن حزمة تعريف تعريف الحزمة. json في هذا الدليل.
إذا لم يتم العثور عليها ، فستفترض العقدة أن نقطة إدخال الحزمة هي ملف INDEX.JS (ملاحظة المترجم: بالإضافة إلى index.js ، ستبحث أيضًا عن index.node ، وملف .node هو حزمة التمديد الثنائي للعقدة ، انظر المستند الرسمي للحصول على التفاصيل). الرمز أعلاه هو مثال. ستحاول العقدة العثور على ملف ./mymoduledir/index.js.
على العكس من ذلك ، إذا تم العثور على ملف package.json ، فسيحاول Node تحليله والبحث عن السمة الرئيسية في تعريف الحزمة ، ثم استخدم قيمة السمة الرئيسية كمسار نسبي لنقطة الدخول. في هذا المثال ، إذا تم تعريف package.json على النحو التالي:
نسخة الكود كما يلي:
{
"الاسم": "mymodule" ،
"Main": "./lib/mymodule.js"
}
ستحاول العقدة تحميل ملف ./mymoduledir/lib/mymodule.js
تحميل من دليل node_modules
إذا كانت معلمات دالة المتطلبات ليست مسارات نسبية أو أسماء الوحدات الأساسية ، فسيتم البحث في العقدة في الدليل الفرعي Node_Modules للدليل الحالي. على سبيل المثال ، في الكود التالي ، ستحاول Node العثور على الملف./node_modules/mymodule.js:
نسخة الكود كما يلي:
var mymodule = require ('mymodule.js') ؛
إذا لم يتم العثور عليها ، فستستمر العقدة في البحث في مجلد Node_Modules في الدليل العلوي. إذا لم يتم العثور عليها ، فاستمر في البحث في الدليل العلوي حتى يتم العثور على الوحدة النمطية المقابلة أو الوصول إلى دليل الجذر.
يمكنك استخدام هذه الميزة لإدارة محتوى أو وحدات دليل Node_Modules ، ولكن من الأفضل تسليم مهام إدارة الوحدة النمطية إلى NPM (انظر الفصل 1). دليل node_modules المحلي هو الموقع الافتراضي لوحدة تثبيت NPM. هذا التصميم يربط العقدة و NPM معا. عادة ، كمطور ، ليس عليك الاهتمام كثيرًا بهذه الميزة. يمكنك ببساطة تثبيت الحزم وتحديثها وحذفها باستخدام NPM ، والتي ستساعدك على الحفاظ على دليل Node_Modules.
وحدة التخزين المؤقت
سيتم تخزين الوحدة مؤقتًا بعد التحميل الناجح الأول ، أي إذا تم حل اسم الوحدة النمطية إلى نفس مسار الملف ، فسيتم إرجاع كل مكالمة (MyModule ") تمامًا الوحدة النمطية تمامًا.
على سبيل المثال ، هناك وحدة تسمى my_module.js تحتوي على المحتوى التالي:
نسخة الكود كما يلي:
console.log ('الوحدة my_module تهيئة ...') ؛
module.exports = function () {
console.log ('hi!') ؛
} ؛
console.log ('my_module تهيئة.') ؛
ثم استخدم الكود التالي لتحميل الوحدة:
نسخة الكود كما يلي:
var mymoduleInstance1 = require ('./ my_module') ؛
ينتج الإخراج التالي:
نسخة الكود كما يلي:
الوحدة النمطية my_module تهيئة ...
my_module تهيئة
إذا استيرادها مرتين:
نسخة الكود كما يلي:
var mymoduleInstance1 = require ('./ my_module') ؛
var mymoduleinstance2 = require ('./ my_module') ؛
الإخراج لا يزال:
نسخة الكود كما يلي:
الوحدة النمطية my_module تهيئة ...
my_module تهيئة
وهذا يعني ، يتم تنفيذ رمز التهيئة للوحدة مرة واحدة فقط. عندما تقوم بإنشاء الوحدة النمطية الخاصة بك ، إذا كان رمز التهيئة للوحدة يحتوي على رمز قد يكون له آثار جانبية ، فيجب عليك إيلاء اهتمام خاص لهذه الميزة.
ملخص
ألغت Node النطاق العالمي الافتراضي لـ JavaScript وبدلاً من ذلك اعتمدت نظام وحدة CommonJS ، بحيث يمكنك تنظيم الكود بشكل أفضل وتجنب العديد من مشكلات الأمان والأخطاء. يمكنك استخدام وظيفة المتطلبات لتحميل الوحدات الأساسية أو وحدات الطرف الثالث أو تحميل الوحدات النمطية الخاصة بك من الملفات والأدلة.
يمكنك أيضًا استخدام المسارات النسبية أو المطلقة لتحميل الوحدات غير الأساسية. إذا وضعت الوحدة النمطية في دليل Node_Modules أو للوحدات النمطية المثبتة باستخدام NPM ، فيمكنك أيضًا استخدام اسم الوحدة النمطية لتحميله مباشرة.
ملاحظة المترجم:
يوصى بأن يقرأ القراء فصول الوحدة النمطية للوثيقة الرسمية. أنا شخصياً أشعر أنه أكثر وضوحًا من المؤلف. تم إرفاق مثال تمثيلي للغاية ، والذي سيكون من مساعدة كبيرة لفهم تحميل وحدة العقدة. ما يلي مقتبس أيضًا:
نسخة الكود كما يلي:
استخدام المطلوبة (x) لتحميل الوحدات النمطية تحت المسار y
1. إذا كانت x هي الوحدة الأساسية ،
أ. قم بتحميل الوحدة الأساسية وإرجاعها
ب. نهاية
2. إذا بدأ x بـ './' أو '/' أو '../
أ. load_as_file (y + x)
ب. load_as_directory (y + x)
3. load_node_modules (x ، dirname (y))
4. رمي استثناء: "لم يتم العثور عليها"
load_as_file (x)
1. إذا كان x ملفًا ، فحمل x كنصوص JavaScript وانتهي بعد التحميل
2. إذا كان X.JS ملفًا ، فحمل X.JS كنصوص JavaScript وانتهي بعد التحميل
3. إذا كان x.node هو ملف ، فقم بتحميل x.node كمكون إضافي للعقدة وينتهي بعد التحميل.
load_as_directory (x)
1. إذا كان ملف x/package.json موجودًا ،
أ. Parses x/package.json والعثور على الحقل "الرئيسي".
ب. أيضا m = x + (قيمة الحقل الرئيسي)
ج. load_as_file (m)
2. إذا كان ملف x/index.js موجودًا ، قم بتحميل x/index.js كنصي JavaScript وينتهي بعد التحميل.
3. إذا كان ملف x/index.node موجودًا ، قم بتحميل x/index.node كمكون إضافي للعقدة وينتهي بعد التحميل.
load_node_modules (x ، ابدأ)
1. أيضا dirs = node_modules_paths (ابدأ)
2. قم بالعمليات التالية لكل دليل dir تحت dirs:
أ. load_as_file (dir/x)
ب. load_as_directory (dir/x)
node_modules_paths (ابدأ)
1. أيضا أجزاء = انقسام المسار (ابدأ)
2. الجذر أيضًا = فهرس أول مثال على "node_modules" في الأجزاء ، أو 0
3. أيضا أنا = عدد الأجزاء - 1
4. أيضا dirs = []
5. بينما أنا> الجذر ،
أ. إذا كانت الأجزاء [i] = "node_modules" ، فستستمر عملية المتابعة ، وإلا فإن الحلقة التالية
ج. dir = path join (أجزاء [0 .. i] + "node_modules")
ب. dirs = dirs + dir
ج. أيضا أنا = أنا - 1
6. العودة إلى ديرز