ماژول‌های ECMAScript در Node.js

ماژول‌های ECMAScript (ESM) استاندارد رسمی برای بسته‌بندی کد جاوااسکریپت هستند. این ماژول‌ها با استفاده از دستورهای import و export تعریف می‌شوند و در Node.js به‌طور کامل پشتیبانی می‌شوند. Node.js علاوه بر پشتیبانی از ESM، امکان تعامل با سیستم قدیمی CommonJS را نیز فراهم می‌کند. توسعه‌دهندگان می‌توانند با استفاده از پسوند .mjs، فیلد "type": "module" در فایل package.json یا فلگ --input-type=module فایل‌ها را به‌عنوان ماژول ECMAScript مشخص کنند. این ماژول‌ها قابلیت‌های مدرن مانند import.meta، بارگذاری پویا (import())، و پشتیبانی از JSON و WASM را ارائه می‌دهند.

import / export.mjs / .cjs / package.json typerelative, bare, and absolute specifiersfile:, node:, data: URLs

~4 دقیقه مطالعه · آخرین به‌روزرسانی ۸ دی ۱۴۰۴

1. معرفی


ماژول‌های ES با استفاده از import و export تعریف می‌شوند. برای مثال:


// addTwo.mjs
export function addTwo(num) {
  return num + 2;
}

// app.mjs
import { addTwo } from './addTwo.mjs';
console.log(addTwo(4)); // خروجی: 6

2. فعال‌سازی ماژول‌های ES


  • فایل‌هایی با پسوند .mjs.
  • فایل package.json با فیلد "type": "module".
  • استفاده از فلگ --input-type=module.

برای فعال‌سازی CommonJS می‌توان از پسوند .cjs یا "type": "commonjs" استفاده کرد.


3. Specifierها در import


  • نسبی: ./startup.js یا ../config.mjs.
  • Bare: some-package یا some-package/shuffle.
  • مطلق: file:///opt/nodejs/config.js.

در specifierهای نسبی و مطلق باید پسوند فایل به‌طور کامل ذکر شود.


4. URLها


  • ماژول‌ها به‌صورت URL بارگذاری و cache می‌شوند.
  • پروتکل‌های file:، node: و data: پشتیبانی می‌شوند.
  • پروتکل data: از JavaScript، JSON و WASM پشتیبانی می‌کند.

5. Import Attributes


ویژگی‌های import امکان مشخص کردن نوع ماژول را فراهم می‌کنند:


import fooData from './foo.json' with { type: 'json' };

برای وارد کردن JSON باید ویژگی type: 'json' مشخص شود.


6. ماژول‌های داخلی


ماژول‌های داخلی Node.js دارای named exports و یک default export هستند:


import { readFile } from 'node:fs';
import EventEmitter from 'node:events';

برای همگام‌سازی named exports می‌توان از module.syncBuiltinESMExports() استفاده کرد.


7. بارگذاری پویا با import()


import() امکان بارگذاری غیرهمزمان ماژول‌ها را فراهم می‌کند و هم در CommonJS و هم در ES پشتیبانی می‌شود.


8. ویژگی‌های import.meta


  • import.meta.url: آدرس کامل فایل ماژول.
  • import.meta.filename: مسیر کامل فایل ماژول.
  • import.meta.dirname: نام پوشهٔ جاری ماژول.
  • import.meta.main: اگر ماژول نقطهٔ ورود برنامه باشد مقدار true دارد.

9. مثال: import.meta.main


export function foo() { return 'Hello, world'; }

function main() {
  console.log(foo());
}

if (import.meta.main) main();

نتیجه‌گیری


ماژول‌های ECMAScript در Node.js روشی مدرن و استاندارد برای سازمان‌دهی کد هستند. با استفاده از دستورهای import و export، پشتیبانی از JSON و WASM، و ویژگی‌هایی مانند import.meta، توسعه‌دهندگان می‌توانند برنامه‌هایی تمیز، قابل تعامل و آینده‌نگر ایجاد کنند.


1. import.meta.resolve


import.meta.resolve(specifier) یک رشتهٔ URL مطلق برمی‌گرداند که نشان‌دهندهٔ مسیر حل‌شدهٔ ماژول است. این قابلیت مشابه require.resolve عمل می‌کند اما در محیط ESM استفاده می‌شود.


const asset = import.meta.resolve('component-lib/asset.css');
// file:///app/node_modules/component-lib/asset.css

import.meta.resolve('./dep.js');
// file:///app/dep.js

این ویژگی می‌تواند عملیات همگام روی فایل‌سیستم انجام دهد و در loaders سفارشی در دسترس نیست.


2. تعامل با CommonJS


  • دستور import می‌تواند ماژول‌های CommonJS را بارگذاری کند.
  • در این حالت، module.exports به‌عنوان default export ارائه می‌شود.
  • Node.js تلاش می‌کند با تحلیل استاتیک، named exports را نیز شناسایی کند.

// cjs.cjs
exports.name = 'exported';

// ESM
import { name } from './cjs.cjs';
console.log(name); // 'exported'

3. تفاوت‌های ESM و CommonJS


  • در ESM خبری از require، exports یا module.exports نیست.
  • __filename و __dirname با import.meta.filename و import.meta.dirname جایگزین می‌شوند.
  • برای بارگذاری Addonها باید از module.createRequire() یا process.dlopen استفاده کرد.
  • require.main با import.meta.main جایگزین می‌شود.
  • کش ماژول‌ها در ESM مستقل از require.cache است.

4. JSON Modules


JSON باید با ویژگی with { type: 'json' } وارد شود:


import config from './package.json' with { type: 'json' };

5. WASM Modules


  • پشتیبانی از import در دو فاز: Source Phase و Instance Phase.
  • Source Phase امکان بارگذاری مستقیم WebAssembly.Module را فراهم می‌کند.
  • Instance Phase فایل‌های .wasm را مانند ماژول‌های معمولی بارگذاری می‌کند.

6. Top-level await


در ESM می‌توان از await در سطح بالا استفاده کرد:


// a.mjs
export const five = await Promise.resolve(5);

// b.mjs
import { five } from './a.mjs';
console.log(five); // 5

7. الگوریتم Resolution


الگوریتم پیش‌فرض ESM مبتنی بر URL است و شامل ویژگی‌های زیر است:


  • حل مسیر نسبی و مطلق.
  • عدم پشتیبانی از پسوندهای پیش‌فرض.
  • عدم پشتیبانی از پوشه‌ها به‌عنوان main.
  • پشتیبانی از node_modules برای bare specifiers.

نتیجه‌گیری


ویژگی import.meta.resolve و قابلیت‌های تعامل بین ESM و CommonJS در Node.js ابزارهای قدرتمندی برای مدیریت ماژول‌ها فراهم می‌کنند. با پشتیبانی از JSON، WASM و top-level await، توسعه‌دهندگان می‌توانند برنامه‌هایی مدرن، انعطاف‌پذیر و چندمنظوره بسازند.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

آشنایی کامل با ماژول Cluster در Node.js و نحوه افزایش مقیاس‌پذیری سرور

ماژول Cluster در Node.js به توسعه‌دهندگان اجازه می‌دهد چندین پردازش همزمان ایجاد کنند که یک پورت سرور را به اشتراک می‌گذارند. این کار باعث استفاده بهتر از هسته‌های CPU و افزایش توان پردازش برنامه می‌شود. در این مقاله نحوه کار Cluster، مدیریت Workerها، تنظیمات مهم و مثال عملی را بررسی می‌کنیم.

ادامه

راهنمای جامع ماژول VM در Node.js (ماژول node:vm)

ماژول node:vm امکان کامپایل و اجرای کد جاوااسکریپت در کانتکست‌های ایزولهٔ V8 را فراهم می‌کند. این کانتکست‌ها مانند یک «سندباکس سبک» داخل برنامهٔ Node.js عمل می‌کنند و هرکدام globalThis مخصوص خود را دارند. این ماژول برای اجرای پویا، موتورهای قالب (Template Engines)، سیستم‌های افزونه (Plugin Systems)، REPLها و تست ایزولهٔ منطق بسیار مناسب است. اما نکتهٔ بسیار مهم: vm یک ابزار امنیتی نیست و نباید برای اجرای کدهای غیرقابل‌اعتماد استفاده شود.

ادامه

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

ادامه

راهنمای جامع Worker Threads در Node.js (ماژول node:worker_threads)

ماژول node:worker_threads امکان اجرای واقعی چندریسمانی (Multithreading) را در Node.js فراهم می‌کند. برخلاف مدل تک‌ریسمانی سنتی Node.js، Worker Threads اجازه می‌دهند کارهای سنگین CPU در ریسه‌های جداگانه اجرا شوند بدون اینکه حلقهٔ رویداد (Event Loop) مسدود شود. این ماژول از حافظهٔ اشتراکی، انتقال بدون کپی (Zero‑Copy)، کانال‌های پیام، Worker Pool، محدودیت منابع و ابزارهای همگام‌سازی پیشرفته پشتیبانی می‌کند. Worker Threads برای پردازش‌های محاسباتی سنگین ایده‌آل هستند، در حالی که I/O همچنان باید توسط ریسهٔ اصلی مدیریت شود.

ادامه

راهنمای جامع ماژول util در Node.js

ماژول node:util مجموعه‌ای از توابع کمکی قدرتمند برای استفاده در هستهٔ Node.js و همچنین توسعهٔ برنامه‌ها ارائه می‌دهد. این ماژول ابزارهایی برای دیباگ، بازرسی اشیا، تبدیل Callback ↔ Promise، قالب‌بندی رشته‌ها، بررسی انواع، مدیریت خطاها، رمزگذاری متن، پردازش MIME، پارس آرگومان‌های CLI، سیگنال‌های Abort، و ابزارهای متفرقه فراهم می‌کند. این ماژول یکی از جعبه‌ابزارهای اصلی و ضروری برای توسعه‌دهندگان Node.js است.

ادامه

راهنمای جامع ماژول URL در Node.js

ماژول node:url ابزارهایی برای تحلیل، ساخت، و دست‌کاری URLها در Node.js فراهم می‌کند. Node.js دو API برای کار با URL دارد: WHATWG URL API — استاندارد مدرن و سازگار با مرورگرها (توصیه‌شده). Legacy API — API قدیمی Node.js (غیرتوصیه‌شده). WHATWG URL API یک رابط تمیز، سازگار و قدرتمند برای کار با اجزای URL، پارامترهای query، الگوهای URL و حتی Blob URLها ارائه می‌دهد.

ادامه