انتقل إلى محتوى الدرس
الدرس 101
دورة جافا سكريبت

الوحدات البرمجية Modules في JavaScriptJavaScript Modules

نظّم مشاريع JavaScript باحتراف عبر الوحدات القياسية ES Modules وعزل النطاقات والتصدير والاستيراد المسمى والافتراضي والسمة type="module" والتحميل عند الطلب.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

في السكربتات التقليدية كانت جميع المتغيرات العليا الموزعة على عدة وسوم <script> تشترك في النطاق العام الواحد window، ما يسبب تصادم الأسماء وأخطاء ترتيب التحميل. حلت الوحدات القياسية (ES Modules — ESM) هذه المشكلة بمنح كل ملف نطاقاً خاصاً معزولاً؛ فتظل جميع المتغيرات والدوال خاصة بالملف ما لم تُصدَّر صراحةً بالكلمة export.

مخطط عمل وحدات ES Modules من التصدير والاستيراد الانتقائي إلى التحميل عبر script type="module"

يمكن لملف الأدوات المساعدة تصدير عدة عناصر عبر التصدير المسمى سواء مباشرةً أمام التعريف (export const TAX = 0.15;) أو مجمّعة في نهاية الملف. ويستورد الملف المستهلك ما يحتاجه فقط بالاسم المطابق داخل قوسين معقوفين، مع إمكانية إعادة التسمية بالكلمة as مثل import { addTax as computeTotal } from "./pricing.js";.

JavaScript
// pricing.js:
// export const TAX_RATE = 0.15;
// export function addTax(n) { return n * (1 + TAX_RATE); }

import { TAX_RATE, addTax as withTax } from './pricing.js';
document.getElementById('esm-named').textContent =
  `Rate: ${TAX_RATE * 100}% | Total: $${withTax(200)}`;

عندما يركز الملف على مكون رئيسي واحد (مثل صنف Router أو دالة تنسيق رئيسية)، يمكنه تعريف تصدير افتراضي واحد كحد أقصى عبر export default، ويُستورد بدون أقواس معقوفة بأي اسم معبر يختاره المستورد.

وجه المقارنةالتصدير المسمى (Named)التصدير الافتراضي (Default)
العدد المسموح بالملفعدد غير محدود من العناصرتصدير افتراضي واحد فقط (1)
صيغة التصديرexport function parse() {}export default class Router {}
صيغة الاستيرادimport { parse } from "./mod.js"import Router from "./mod.js"
مطابقة الاسميجب مطابقة الاسم الأصلي أو asيختار المستورد أي اسم محلي مباشرة

لتفعيل نظام الوحدات في الصفحة، يُحمّل ملف البداية بالسمة <script type="module" src="./app.js"></script>. وتتميز وسوم type="module" بأربع خصائص تلقائية: تفعيل الوضع الصارم (Strict Mode) تلقائياً، وتأجيل التنفيذ حتى اكتمال بناء شجرة HTML مثل defer، وعزل متغيراتها عن الكائن العام window، وتوفير بيانات الوحدة عبر import.meta.url.

HTML
<div id="mod-info"></div>
<script type="module">
  const apiToken = 'internal-only';
  const leakedToWindow = ('apiToken' in window);
  const hasMetaUrl = typeof import.meta.url === 'string';
  document.getElementById('mod-info').textContent =
    `Window leak: ${leakedToWindow} | meta: ${hasMetaUrl}`;
</script>

تُكتب عبارات import الثابتة في أعلى الملف وتُحمَّل مسبقاً عند بدء التشغيل. أما عندما يضم تطبيقك ميزة ثقيلة كمحرك رسوم بيانية لا يفتحه إلا بعض الزوار، فيمكنك استدعاء التعبير الوظيفي import("./chart-engine.js") داخل مستمع نقرة الزر لتحميل الوحدة عند الطلب فقط وتسريع فتح الصفحة الأولي.

ونظراً لأن التحميل الديناميكي عبر الشبكة يتم بصورة غير متزامنة، ستتعلم ربطه عملياً خطوة بخطوة في الفصل السادس عشر المخصص للبرمجة غير المتزامنة.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس عزل النطاقات عبر وحدات ES Modules، والتصدير والاستيراد المسمى وإعادة التسمية بـ as، والتصدير الافتراضي export default، وتشغيل الوحدات عبر <script type="module">، وفكرة التحميل عند الطلب عبر import(). الخطوة التالية: انتقل إلى الفصل الرابع عشر ودرس «الأنماط المتقدمة لتعريف الكائنات» لدراسة أنماط الإنشاء الأربعة والدمج والقواميس النقية والنسخ العميق.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ES Module (ESM) الوحدة القياسية ES Module
ملف JavaScript مستقل النطاق يعزل متغيراته داخلياً ويشارك ما يحدده المطور فقط عبر export وimport.
للمراجعة
02 Named Export التصدير المسمى Named Export
تصدير عنصر أو أكثر بأسمائها الصريحة بحيث تُستورد بنفس الأسماء داخل قوسين معقوفين.
للمراجعة
03 Default Export التصدير الافتراضي export default
المكون الرئيسي الأوحد المُصدَّر من الوحدة بالكلمتين export default ويُستورد بدون أقواس معقوفة.
للمراجعة
04 Live Binding الربط الحي للقراءة فقط
ارتباط حي للقراءة فقط يجعل المتغير المستورد يعكس أي تحديث تجريه الوحدة المصدرة على قيمته.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 ESM ESM
ECMAScript Modules
نظام الوحدات القياسي الرسمي المدمج أصيلاً في المتصفحات وبيئات تشغيل JavaScript الحديثة.
للمراجعة
02 CORS CORS
Cross-Origin Resource Sharing
سياسة أمان مشاركة الموارد عبر الأصول التي يطبقها المتصفح عند جلب ملفات الوحدات الخارجية.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. بدّل بين تبويبات المحاكي الثلاثة لمقارنة صياغة الاستيراد المسمى والافتراضي واستيراد الكائن الشامل.

  2. شغّل مثال الوسم script type="module" في محرر التجربة وتحقق من عدم تسرب متغير الوحدة إلى الكائن window.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

كم تصديراً افتراضياً (export default) يُسمح بوجوده في ملف وحدة JavaScript واحد؟

02

ما الصياغة الصحيحة لإعادة تسمية التصدير المسمى formatDate ليصبح fmt عند الاستيراد؟

03

يعمل الكود داخل الوسم <script type="module"> في الوضع الصارم تلقائياً دون الحاجة لكتابة "use strict".

04

تعريف const x = 10 في المستوى الأعلى داخل <script type="module"> ينشئ تلقائياً الخاصية window.x === 10.

05

ما السمة التي تخبر المتصفح بالتعامل مع وسم script كوحدة ES Module قياسية؟

06

إذا استوردت ثلاثة ملفات مختلفة الوحدة "./logger.js"، فكم مرة ينفذ المتصفح كود "./logger.js"؟

07

أي عبارة تجمع كافة التصديرات المسماة من "./math.js" داخل كائن واحد باسم MathTools؟

08

يُسمح للملف المستورد بإعادة إسناد قيمة جديدة مباشرةً للمتغير المستورد مثل TAX_RATE = 0.25.

09

ما الخاصية المدمجة داخل وحدة ES Module التي تحتوي على الرابط الكامل لملف الوحدة الحالي؟

10

لماذا يلجأ المطورون لاستدعاء التعبير الديناميكي import("./chart.js") داخل حدث النقر؟