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 .

وفقا ل: "الوحدات النمطية الجزء 2 - وحدات الكتابة" .


لقد تم الإجابة على هذا بالفعل ولكني أردت إضافة بعض التوضيحات ...

يمكنك استخدام كل من 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');

بما أننا نوفر المسار هنا بقولنا أنه في الدليل الحالي. ./ يجب أن يعمل هذا أيضًا بنجاح.







node.js