تا اینجا با صادرات و واردات معمولی آشنا شدیم. اما در دنیای واقعی، ماژولها به دو روش کاملاً متفاوت قابلیتهای خود را به اشتراک میگذارند. علاوه بر این، وقتی تعداد فایلها بالا میرود، احتمال این که نام توابع تکراری شود (مثلاً داشتن دو تابع به نام draw) بسیار زیاد است.
در این بخش یاد میگیریم چطور این دو سیستم صادرات را مدیریت کنیم و چطور جلوی تداخل نامها (Naming Conflicts) را بگیریم.
تمام مواردی که تا این لحظه صادر کردیم، از نوع صادرات نامدار (Named Exports) بودند. یعنی هر تابع یا متغیر با نام خودش صادر میشد و موقع وارد کردن هم دقیقاً باید از همان نام داخل آکولاد {} استفاده میکردیم.
اما نوع دیگری از صادرات به نام صادرات پیشفرض (Default Export) وجود دارد. این روش برای زمانی طراحی شده که یک ماژول فقط «یک قابلیت اصلی یا پیشفرض» دارد. همچنین این کار سازگاری ماژولهای مدرن را با سیستمهای قدیمی (مثل CommonJS و AMD) بسیار راحتتر میکند.
فرض کنید در فایل square.js تابعی به نام randomSquare() داریم که یک مربع با رنگ و اندازه تصادفی رسم میکند. میخواهیم این تابع، قابلیت اصلی و پیشفرض این فایل باشد. در انتهای فایل مینویسیم:
export default randomSquare;
نکته بسیار مهم: دقت کردید؟ هیچ آکولادی وجود ندارد! حتی میتوانید کلمه کلیدی
export defaultرا مستقیماً پشت یک تابع بدون نام (Anonymous Function) هم بگذارید:
export default function (ctx) {
// کدهای تابع در اینجا
}
حالا در فایل main.js، این تابع پیشفرض را به این صورت وارد میکنیم:
import randomSquare from "./modules/square.js";
باز هم بدون آکولاد! از آنجا که هر ماژول فقط و فقط میتواند یک صادرات پیشفرض داشته باشد، مرورگر دقیقاً میداند که منظور شما کدام تابع است. کد بالا در واقع خلاصه شدهی دستور زیر است:
import { default as randomSquare } from "./modules/square.js";
as)تصور کنید پروژه شما بزرگتر میشود و علاوه بر مربع (square.js)، فایلهایی برای رسم دایره (circle.js) و مثلث (triangle.js) هم اضافه میکنید. به احتمال خیلی زیاد، هر سه فایل تابعی به نام draw() یا reportArea() دارند!
اگر بخواهید همه آنها را در فایل اصلی وارد کنید، مرورگر گیج میشود و خطای تداخل نام (Redeclaration error) میدهد:
// ❌ این کد خطا میدهد چون مرورگر نمیداند draw مال کدام است!
import { name, draw } from "./modules/square.js";
import { name, draw } from "./modules/circle.js";
asخوشبختانه با کلمه کلیدی as میتوانید نام آیتمها را موقع صادرات یا واردات عوض کنید تا در فایل فعلی کاملاً منحصربهفرد باشند.
بهترین کار این است که فایلهای ماژول را دستنخورده باقی بگذارید و موقع import کردن در فایل اصلی، نام آنها را اختصاصی کنید:
// وارد کردن قابلیتهای مربع با نام جدید
import {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
reportPerimeter as reportSquarePerimeter,
} from "./modules/square.js";
// وارد کردن قابلیتهای دایره با نام جدید
import {
name as circleName,
draw as drawCircle,
reportArea as reportCircleArea,
reportPerimeter as reportCirclePerimeter,
} from "./modules/circle.js";
همچنین میتوانید این تغییر نام را در همان فایل ماژول و موقع خروجی گرفتن انجام دهید:
// inside square.js
export {
name as squareName,
draw as drawSquare,
reportArea as reportSquareArea,
}
و سپس در فایل اصلی بدون نیاز به تغییر نام، از همان نامهای جدید استفاده کنید:
// inside main.js
import { squareName, drawSquare } from "./modules/square.js";
یک نصیحت حرفهای: انتخاب با شماست، اما معماری تمیزتر این است که کدهای ماژول را ساده و عمومی نگه دارید و تغییر نام را در بخش
importانجام دهید. این کار بهخصوص زمانی که از پکیجهای آماده و کتابخانههای دیگران (Third-party modules) استفاده میکنید و دسترسی برای تغییر کدهای آنها ندارید، تنها راه نجات شماست!
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript