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

ماژول‌های CommonJS روش اصلی بسته‌بندی کد جاوااسکریپت در Node.js هستند. هر فایل در Node.js به‌عنوان یک ماژول جداگانه در نظر گرفته می‌شود و می‌تواند با استفاده از require() ماژول‌های دیگر را بارگذاری کند. خروجی هر ماژول از طریق exports یا module.exports در دسترس قرار می‌گیرد. این سیستم امکان سازمان‌دهی کد، مدیریت وابستگی‌ها، و استفادهٔ مجدد از ماژول‌ها را فراهم می‌کند.

require() / exports / module.exportsbuilt-in modulescaching / require.cache__dirname / __filename

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

1. معرفی


در Node.js هر فایل یک ماژول مستقل است. برای مثال:


// foo.js
const circle = require('./circle.js');
console.log(`Area: ${circle.area(4)}`);

ماژول circle.js می‌تواند توابع خود را با exports یا module.exports در دسترس قرار دهد.


2. exports و module.exports


  • exports: میانبر برای افزودن ویژگی‌ها به خروجی ماژول.
  • module.exports: امکان جایگزینی کامل خروجی ماژول با یک شیء یا کلاس.

3. فعال‌سازی CommonJS


  • فایل‌های با پسوند .cjs.
  • فایل‌های .js وقتی در package.json مقدار "type": "commonjs" مشخص شده باشد.
  • فایل‌های بدون پسوند یا .js وقتی هیچ type مشخص نشده باشد.

4. دسترسی به ماژول اصلی


با استفاده از require.main می‌توان تشخیص داد که آیا فایل مستقیماً اجرا شده یا به‌عنوان ماژول بارگذاری شده است.


5. مدیریت وابستگی‌ها


Node.js وابستگی‌ها را از پوشهٔ node_modules بارگذاری می‌کند. ساختار پوشه‌ها و symlinkها امکان مدیریت نسخه‌های مختلف ماژول‌ها را فراهم می‌کند.


6. بارگذاری ECMAScript Modules با require()


به‌صورت آزمایشی، require() می‌تواند برخی ماژول‌های ES را بارگذاری کند، اما محدودیت‌هایی مانند عدم پشتیبانی از top-level await وجود دارد.


7. caching


  • ماژول‌ها پس از بارگذاری در require.cache ذخیره می‌شوند.
  • این ویژگی مانع اجرای چندبارهٔ کد ماژول می‌شود.

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


Node.js دارای ماژول‌های داخلی مانند http، fs و crypto است. برخی از آن‌ها نیازمند پیشوند node: هستند.


9. چرخه‌های وابستگی


در صورت وجود وابستگی‌های حلقه‌ای، Node.js یک نسخهٔ ناقص از ماژول را بازمی‌گرداند تا از حلقهٔ بی‌نهایت جلوگیری کند.


10. فایل‌ها و پوشه‌ها به‌عنوان ماژول


  • فایل‌ها با پسوندهای .js، .json و .node بارگذاری می‌شوند.
  • پوشه‌ها می‌توانند با داشتن package.json یا فایل index.js به‌عنوان ماژول بارگذاری شوند.

11. ماژول wrapper


Node.js کد هر ماژول را در یک تابع wrapper قرار می‌دهد تا متغیرهای سطح بالا محلی باقی بمانند و متغیرهای خاص مانند __dirname و __filename فراهم شوند.


12. مثال ساده


// square.js
module.exports = class Square {
  constructor(width) { this.width = width; }
  area() { return this.width ** 2; }
};

// bar.js
const Square = require('./square.js');
const mySquare = new Square(2);
console.log(mySquare.area()); // 4

نتیجه‌گیری


سیستم ماژول‌های CommonJS در Node.js پایهٔ اصلی سازمان‌دهی کد است. با استفاده از require()، exports و module.exports می‌توان کدهای قابل استفادهٔ مجدد ایجاد کرد، وابستگی‌ها را مدیریت نمود، و ساختار پروژه‌ها را بهینه کرد.


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

مقالات مرتبط

آشنایی کامل با ماژول 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ها ارائه می‌دهد.

ادامه