~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 میتوان کدهای قابل استفادهٔ مجدد ایجاد کرد، وابستگیها را مدیریت نمود، و ساختار پروژهها را بهینه کرد.
نوشته و پژوهش شده توسط دکتر شاهین صیامی