الرئيسية تعليم لغات البرمجة وحدة النمط الوحدوي (Modules) واستيراد وتصدير الملفات في جافاسكريبت (Import/Export)

وحدة النمط الوحدوي (Modules) واستيراد وتصدير الملفات في جافاسكريبت (Import/Export)

amr gamal سبتمبر 06, 2026

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

في هذا الدليل الشامل، سننتقل بالمستوى البرمجي خطوة إلى الأمام عبر تعلم كيفية تنظيم ملفات المشروع الاحترافية باستخدام نظام الاستيراد والتصدير (Import و Export)، وهو الأساس البنيوي الذي تقوم عليه جميع تطبيقات الويب الحديثة وإطارات العمل المتقدمة مثل رياكت (React) و فيو (Vue) وأنجلار (Angular).

وحدات جافاسكريبت

ما هي وحدات جافاسكريبت (JavaScript Modules)؟

قبل ظهور معيار ECMAScript 2015 (المعروف بـ ES6)، كانت لغة جافاسكريبت تتعامل مع كل ملف نصي على أنه جزء من النطاق العام (Global Scope). كان هذا يعني أن أي متغير أو دالة تُعرف في ملف ما، تصبح متاحة تلقائياً في أي ملف آخر يتم تحميله في الصفحة، مما كان يسبب تداخلات خطيرة في الأسماء، وأخطاء غير متوقعة، وصعوبة بالغة في تتبع مصادر البيانات إذا زاد حجم المشروع.

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

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

التصدير: إخراج الكود (Export)

لكي تتمكن من مشاركة جزء من الكود الموجود في ملف ما (مثل دالة معينة، متغير، أو صنف) مع ملفات أخرى، يجب عليك أولاً "تصديره". توفر لك لغة جافاسكريبت نوعين أساسيين من التصدير لتلبية مختلف احتياجات التصميم البرمجي:

  1. التصدير المسمى (Named Export)
  2. التصدير الافتراضي (Default Export)

1. التصدير المسمى (Named Export)

يسمح لك هذا النوع بتصدير أكثر من قيمة (سواء كانت دالة، متغيراً، أو كائناً) من نفس الملف. عند استخدام التصدير المسمى، يجب أن تتطابق الأسماء تماماً عند عملية الاستيراد في الملفات الأخرى.

// ملف: mathUtils.js
export const PI = 3.14159;

export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}

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

2. التصدير الافتراضي (Default Export)

يُستخدم التصدير الافتراضي عندما ترغب في تصدير قيمة رئيسية واحدة فقط من الملف، مثل مكون واجهة مستخدم رئيسي، أو صنف (Class) واحد يمثل جوهر الملف. ومن أهم خصائص هذا النوع أنه يمكن أن يحتوي كل ملف على تصدير افتراضي واحد فقط.

// ملف: User.js
export default class User {
    constructor(name) {
        this.name = name;
    }

    sayHello() {
        return `مرحباً، أنا ${this.name}`;
    }
}

لاحظ هنا أننا استخدمنا export default مع تعريف الصنف. عند استخدام هذا النوع، لا يشترط أبداً أن يتطابق اسم الملف مع اسم الصنف أو العنصر المعرّف داخله.

الاستيراد: جلب الكود (Import)

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

استيراد العناصر المسماة (Named Imports)

عند استيراد عناصر مسماة، يجب وضع الأسماء المطلوبة داخل أقواس متعرجة {} مع التأكد من مطابقتها التامة للأسماء التي تم تصديرها بها.

// ملف: main.js
import { PI, add } from './mathUtils.js';

console.log(PI); // 3.14159
console.log(add(5, 10)); // 15

استيراد العناصر الافتراضية (Default Imports)

على عكس العناصر المسماة، عند استيراد عنصر افتراضي، لا نستخدم الأقواس المتعرجة أبداً، ويمكننا تسمية المتغير أو الصنف المستورد بأي اسم نراه مناسباً للمشروع.

// ملف: app.js
import UserAccount from './User.js';

const user = new UserAccount('سارة');
console.log(user.sayHello()); // مرحباً، أنا سارة

الدمج بين التصدير المسمى والافتراضي

يتيح لك معيار جافاسكريبت إمكانية الدمج بين النوعين في نفس الملف واستيرادهما معاً في سطر واحد بالشكل المناسب لاحتياجاتك:

// ملف: main.js
import UserAccount, { PI, add } from './mathUtils.js';

console.log(PI);
console.log(add(2, 3));
const user = new UserAccount('أحمدية');
console.log(user.sayHello());

إعادة التوجيه والتسمية أثناء الاستيراد والتصدير

في المشاريع البرمجية الضخمة، قد تواجه أحياناً حالات تحتاج فيها إلى تغيير أسماء الدوال أو المتغيرات المستوردة لتجنب حدوث تداخل في الأسماء (Name Collisions)، أو قد ترغب في دمج عدة وحدات فرعية في وحدة مركزية واحدة لتسهيل إدارتها.

استخدام الكلمة المفتاحية As للتسمية المجاورة

يمكنك تغيير اسم المتغير أو الدالة أثناء عملية الاستيراد أو التصدير بسهولة تامة باستخدام الكلمة المفتاحية as:

// إعادة تسمية الدالة أثناء الاستيراد لتجنب التعارض
import { add as sumFunction } from './mathUtils.js';

console.log(sumFunction(2, 3)); // 5

وبالمثل، يمكنك استخدامها عند التصدير المسمى لإعادة توجيه العناصر بأسماء جديدة ومناسبة لهيكلية المشروع:

// ملف: index.js
export { add as calculateSum, subtract as calculateDiff } from './mathUtils.js';

تشغيل الوحدات في المتصفح والبيئة المحلية

لكي يتعرف المتصفح بذكاء على الملف البرمجى على أنه وحدة نمطية (Module) وليس مجرد ملف سكربت تقليدي قديم، يجب عليك تحديد نوع السكربت صراحة عند استدعائه داخل ملف HTML عبر إضافة خاصية type="module":

<script type="module" src="main.js"></script>

ملاحظة تقنية هامة للمطورين: نظراً للسياسات الأمنية الصارمة للمتصفحات الحديثة (CORS policy)، لا يمكنك تشغيل ملفات جافاسكريبت التي تحتوي على تعليمات import و export عبر فتح ملف الـ HTML مباشرة بالنقر المزدوج من نظام الملفات (أي باستخدام البروتوكول المحلي file://). لتجنب توقف الكود عن العمل، يجب عليك تشغيل المشروع البرمجي عبر خادم محلي خفيف مثل خادم Live Server في محرر الكود VS Code، أو استخدام أي أداة تطوير محلية مشابهة، لضمان عمل الوحدات بشكل سليم ودون ظهور أخطاء في وحدة التحكم (Console).

الأخطاء الشائعة عند التعامل مع الوحدات البرمجية

يتعرض المطورون في مراحل التعلم المختلفة لبعض الأخطاء المتكررة أثناء التعامل مع نظام الـ Modules. إليك أبرز هذه الأخطاء وكيفية تجنبها:

  • نسيان امتداد الملف: في بيئة جافاسكريبت التي تعمل مباشرة في المتصفح، يجب كتابة امتداد الملف كاملاً وصريحاً عند عملية الاستيراد (مثل الكتابة الصحيحة ./file.js وليس ./file فقط).
  • خطأ في تحديد مسار الملف النسبي (Relative Path): يجب التأكد دائماً من كتابة المسار الصحيح نسبياً لمكان الملف الحالي، باستخدام بادئة ./ للملفات الكائنة في نفس المجلد، أو بادئة ../ للخروج مستوى مجلداً واحداً للأمام.
  • محاولة تشغيل الوحدات بدون خادم محلي: كما تم التنويه مسبقاً، تتطلب الوحدات البرمجية بيئة خادم ويب حقيقي لتجاوز قيود الأمان المفروضة في المتصفحات الحديثة.

خلاصة الدرس

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

الكاتب
عمرو جمال

محرر متخصص في تطوير قوالب بلوجر وووردبريس وتقديم شروحات التقنية. أقدم حلولاً مبتكرة لتصميم مواقع عصرية وجذابة.