javascript - ما الغرض من Node.js module.exports وكيف تستخدمه؟
(6)
ما الغرض من Node.js module.exports وكيف تستخدمه؟
يبدو أنني لا أستطيع العثور على أي معلومات حول هذا ، ولكن يبدو أنه جزء مهم إلى حد كبير من Node.js لأنني غالباً ما أراه في شفرة المصدر.
وفقًا لوثائق Node.js :
وحدة
إشارة إلى
module
الحالية. فيmodule.exports
بشكل خاص هو نفس كائن الصادرات. راجعsrc/node.js
لمزيد من المعلومات.
لكن هذا لا يساعد حقاً.
ما الذي يفعله module.exports
بالضبط ، وماذا سيكون مثال بسيط؟
الرابط الرجوع هو مثل هذا:
exports = module.exports = function(){
//....
}
سوف تتعرض خصائص exports
أو module.exports
، مثل الوظائف أو المتغيرات ، في الخارج
هناك شيء يجب أن توليه مزيدًا من الاهتمام: لا override
الصادرات.
لماذا ا ؟
نظرًا لأن الصادرات هي مجرد مرجع لـ module.exports ، يمكنك إضافة الخصائص إلى الصادرات ، ولكن إذا تجاوزت الصادرات ، فسيتم قطع الرابط المرجعي.
مثال جيد :
exports.name = 'william';
exports.getName = function(){
console.log(this.name);
}
مثالا سيئا :
exports = 'william';
exports = function(){
//...
}
إذا كنت تريد فقط عرض دالة أو متغير واحد فقط ، مثل هذا:
// test.js
var name = 'william';
module.exports = function(){
console.log(name);
}
// index.js
var test = require('./test');
test();
تعرض هذه الوحدة وظيفة واحدة فقط وتكون خاصية الاسم خاصة بالنسبة للخارج.
بعض الأشياء القليلة التي يجب عليك الاهتمام بها في حالة تعيين مرجع إلى كائن جديد exports
و / أو modules.exports
1. جميع الخصائص / الطرق التي سبق إرفاقها exports
الأصلية أو module.exports
يتم فقدان عمليات التصدير لأن الكائن الذي تم تصديره module.exports
الآن إلى آخر جديد
هذا واضح ، ولكن إذا قمت بإضافة طريقة تصدير في بداية وحدة موجودة ، فتأكد من أن الكائن الأصلي الذي تم تصديره لا يشير إلى كائن آخر في النهاية
exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object
module.exports.method3 = function () {}; // exposed with method1 & method2
var otherAPI = {
// some properties and/or methods
}
exports = otherAPI; // replace the original API (works also with module.exports)
2. في حالة واحدة من exports
أو module.exports
تشير إلى قيمة جديدة ، فإنها لا تشير إلى نفس الكائن أكثر من ذلك
exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object
// method added to the original exports object which not exposed any more
module.exports.method3 = function () {};
3. نتيجة صعبة. إذا قمت بتغيير المرجع إلى كل من exports
و module.exports
، من الصعب أن نقول أي واجهة برمجة التطبيقات مكشوفة (يبدو أن module.exports
يفوز)
// override the original exported object
module.exports = function AConstructor() {};
// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {};
تقوم الوحدة النمطية بتغليف التعليمة البرمجية ذات الصلة في وحدة واحدة من التعليمات البرمجية. عند إنشاء وحدة نمطية ، يمكن تفسير ذلك على أنه نقل كل الوظائف ذات الصلة إلى ملف.
افترض أن هناك ملف Hello.js يتضمن وظيفتين
sayHelloInEnglish = function() {
return "Hello";
};
sayHelloInSpanish = function() {
return "Hola";
};
نكتب دالة فقط عندما تكون فائدة الشفرة أكثر من مكالمة واحدة.
لنفترض أننا نريد زيادة فاعلية الوظيفة إلى ملف مختلف ، فيقول World.js ، في هذه الحالة ، يأتي تصدير ملف إلى صورة يمكن الحصول عليها بواسطة module.exports.
يمكنك فقط تصدير كل من الوظيفة بواسطة الكود الموضح أدناه
var anyVariable={
sayHelloInEnglish = function() {
return "Hello";
};
sayHelloInSpanish = function() {
return "Hola";
};
}
module.export=anyVariable;
الآن تحتاج فقط إلى طلب اسم الملف إلى World.js inorder لاستخدام هذه الوظائف
var world= require("./hello.js");
عند تقسيم شفرة البرنامج على ملفات متعددة ، يتم استخدام module.exports
لنشر المتغيرات والوظائف لمستهلك الوحدة النمطية. يتم استبدال استدعاء require()
في ملف المصدر الخاص بك مع module.exports
المقابل من الوحدة النمطية.
تذكر عند كتابة وحدات
- يتم تخزين أحمال الوحدة النمطية مؤقتًا ، وتقيم المكالمة الأولية فقط جافا سكريبت.
- من الممكن استخدام المتغيرات والوظائف المحلية داخل وحدة نمطية ، وليس كل شيء يحتاج إلى التصدير.
- الكائن
module.exports
متاح أيضاexports
الاختزال. ولكن عند العودة لوظيفة فردية ، استخدم دائمًاmodule.exports
.
لقد تم الإجابة على هذا بالفعل ولكني أردت إضافة بعض التوضيحات ...
يمكنك استخدام كل من exports
و module.exports
لاستيراد التعليمات البرمجية إلى التطبيق الخاص بك مثل هذا:
var mycode = require('./path/to/mycode');
حالة الاستخدام الأساسية التي ستراها (على سبيل المثال ، في كود المثال ExpressJS) هي أنك تقوم بتعيين الخصائص على كائن exports
في ملف .js الذي تقوم باستيراده باستخدام require()
لذلك في مثال حساب بسيط ، يمكن أن يكون لديك:
(counter.js):
var count = 1;
exports.increment = function() {
count++;
};
exports.getCount = function() {
return count;
};
... ثم في التطبيق الخاص بك (web.js ، أو في الحقيقة أي ملف .js آخر):
var counting = require('./counter.js');
console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2
بعبارات بسيطة ، يمكنك التفكير في الملفات المطلوبة كدوال تقوم بإرجاع كائن واحد ، ويمكنك إضافة خصائص (سلاسل ، أرقام ، صفائف ، وظائف ، أي شيء) إلى الكائن الذي يتم إرجاعه عن طريق تعيينها على exports
.
في بعض الأحيان ستحتاج إلى الكائن الذي تم إرجاعه من استدعاء require()
لتكون دالة يمكنك الاتصال بها ، بدلاً من مجرد كائن به خصائص. في هذه الحالة ، يجب أيضًا تعيين module.exports
، كما يلي:
(sayhello.js):
module.exports = exports = function() {
console.log("Hello World!");
};
(app.js):
var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"
يتم شرح الفرق بين الصادرات و module.exports بشكل أفضل في هذه الإجابة هنا .
هناك بعض الوحدات النمطية الافتراضية أو الموجودة في node.js عند تنزيل وتثبيت node.js مثل http ، sys إلخ.
نظرًا لأنهم بالفعل في node.js ، عندما نريد استخدام هذه الوحدات ، فإننا في الأساس نرغب في استخدام وحدات الاستيراد ، ولكن لماذا؟ لأنهم موجودون بالفعل في العقدة. يشبه الاستيراد نقلها من node.js ووضعها في برنامجك. ثم استخدامها.
في حين أن الصادرات هي عكس ذلك تمامًا ، فأنت تقوم بإنشاء الوحدة التي تريدها ، دعنا نقول module module.js ووضع هذه الوحدة في العقدة ، يمكنك القيام بذلك عن طريق تصديرها.
قبل أن أكتب أي شيء هنا ، تذكر ، module.exports.additionTwo هو نفسه مثل export.additionTwo
هاه ، لذلك هذا هو السبب ، نحن نحب
exports.additionTwo = function(x)
{return x+2;};
كن حذرا مع الطريق
لنفترض أنك أنشأت وحدة add.js ،
exports.additionTwo = function(x){
return x + 2;
};
عند تشغيل هذا على موجه الأوامر الخاص بك NODE.JS:
node
var run = require('addition.js');
هذا سوف خطأ قائلا
خطأ: لا يمكن العثور على module addition.js
ويرجع ذلك إلى أن عملية node.js غير قادرة على add.js لأننا لم نذكر المسار. لذلك ، يمكننا تعيين المسار باستخدام NODE_PATH
set NODE_PATH = path/to/your/additon.js
الآن ، يجب تشغيل هذا بنجاح دون أي أخطاء !!
شيء آخر ، يمكنك أيضًا تشغيل ملف addition.js عن طريق عدم تعيين NODE_PATH ، والعودة إلى موجه الأوامر nodejs:
node
var run = require('./addition.js');
بما أننا نوفر المسار هنا بقولنا أنه في الدليل الحالي. ./
يجب أن يعمل هذا أيضًا بنجاح.