استيراد وتصدير الملفات والوحدات البرمجية في جافاسكريبت

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

لحسن حظنا كمطوري جافاسكريبت، باتت هذه اللغة الآن تدعم خاصة استيراد وتصدير الوحدات البرمجية (Modules)، ما يعني أننا نستطيع تقسيم أكوادنا لعدة ملفات واستدعاء ملف داخل آخر عند الحاجة إليه.

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

استيراد وتصدير الوحدات على طريقة ES5

تعرف كذلك بطريقة CommonJS، وفيها يتم استيراد الوحدات عن طريق الدالة ()require وتصديرها بواسطة التعبير module.exports.

هذا مثال بسيط على استيراد الوحدات في React.js على طريقة ES5.

نلاحظ بأننا قمنا باستيراد مكتبة react في أول سطر، وهي تكون موجودة عادة في مجلد /node_modules و Node.js يعرف جيدا أين وكيف يجد كل هذه التبعيات داخل هذا المجلد.

أما السطر الثاني ففيه نقوم باستيراد المكون Product الذي خصصنا له ملفا اسمه Product.js.

أما الإستيراد الثالث فهو لملف App.css، وهنا يجب معرفة أنه لا يمكن استيراد ملفات CSS باستخدام طريقة وحدات الجافاسكريبت، وإنما تمكننا من فعل ذلك هنا لأننا نقوم باستخدام Webpack (نسيت أن أخبركم في البداية أنني قمت بإنشاء المشروع بواسطة الأداة create-react-app التي بدورها تستعين ب Webpack ك Module Bundler). هذا الأخير من ضمن مميزاته الكثيرة، أنه يمكننا من استيراد ملفات CSS داخل أكواد جافاسكريبت.. هكذا ببساطة 😀

أما ما تبقى فهو مجرد تعريف لمكون جديد في React سميته App وبداخله أقوم بإظهار ثلاث مكونات من نوع Product الذي قمنا سابقا باستيراده من الملف Product.js.

ليس من الضروري تعيين الإمتداد js. عند استيراد الملفات في جافاسكريبت، فقط  require('Product')  عوض require('Product.js') .

الملف Product.js بسيط :

السطر الأول كما رأينا سابقا هو استيراد ل React، وأسفله الدالة أو المكون Product الذي يقوم بعرض عنوان المنتج داخل وسم <h2>.

ما يهمنا بالدرجة الأولى في هذا الملف هو السطر الأخير. بدون module.exports لن نتمكن من من تصدير واستيراد هذه الوحدة من أي مكان وبالتالي تصبح بلا جدوى!

عندما نطلب من Node.js أن يستورد وحدة من ملف معين، فإنه يذهب ويقرأ ذلك الملف ويبحث عن التعبير module.exports للتأكد من توفر هذه الوحدة للإستيراد أم لا.

استيراد أكثر من وحدة

في المثال السابق قمنا باستيراد وحدة واحدة فقط من الملف Product.js، وهي المكون Product. ماذا لو كان علينا أن نجمع عدة وحدات في ملف واحد ونقوم بتصديرها كلها ؟ هذا ممكن بطبيعة الحال والطريقة سهلة :

وتكون طريقة الإستدعاء كالتالي :

استخدام طريقة ES6 الحديثة

فكرة الوحدات بطريقة ES6 هي نفسها مقارنه مع طريقة ES5، ولكن هناك اختلاف بسيط في التركيب أو Syntax.
عوض استخدام require نستخدم الكلمة import، وعندما نريد تصدير وحدة واحدة فقط من ملف جافاسكريبت (نعتبرها افتراضية في هذه الحالة) فإننا نستعمل التعبير export default :

لسنا على مجبرين على استخدام default هنا، ولكن بدون استخدامها سيكون علينا استخدام المعقوفتين { } عند استدعاء الوحدة.

أما إذا أردنا أن نعرض عدة وحدات للتصدير، فنقوم بما يلي :

نقوم فقط بوضع كلمة export قبل الدالة أو الكلاس أو أي كائن نريد تصديره.


هذا تقريبا أهم ما يمكن قوله عن نظام تصدير واستيراد الملفات في بيئة جافاسكريبت. توجد بعض التفاصيل الذي تحتاج معرفتها عند مستوى معين من الممارسة، ولكن كبداية، هذه المقدمة تكفي لفهم الفكرة جيدا.

يمكنك استخدام الطريقة التي تفضلها، ولكن تذكر أنه لا يمكن خلطهما معا، مثلا لا يمكنك التصدير ب module.exports والإستيراد بواسطة import، لا علاقة بينهما 😀 .
الأمر الثاني الذي أريد ذكره، هو أن طريقة ES6 هي المستقبل، كونها جزء أصلي من الإصدار الجديد للجافاسكريبت وليس خاصة ب Node.js فقط، وبالتالي يستحسن استخدامها منذ الآن. يمكنك الإستعانة بمجمع الوحدات Webpack من أجل تجاوز مشكل الدعم المحدود من المتصفحات الكبيرة، إلى حين وصول الدعم والتوافقية الكاملين.

1 تعليق

  1. مقالة جميلة، هناك طريقة أخرى لتنظيم برمجياتك تسمى بـ Import multiple exports from module
    هي انشاء ملف فهرسة (index) داخل المجلد و تضع بداخله تصدير (Export) جميع الملفات التي تحتاجها ثم تستدعيها وقت الحاجة بين قوسين معكوفتين.

ترك الرد

Please enter your comment!
Please enter your name here