نحوه ایجاد ماژول Nodejs

نحوه ایجاد ماژول Nodejs
آفلاین
user-avatar
عرفان حشمتی
30 دی 1399, خواندن در 15 دقیقه

در Nodejs ،ماژول مجموعه‌ای از توابع و شی‌های جاوااسکریپت است که می‌تواند توسط برنامه‌های خارجی مورد استفاده قرار گیرد. توصیف یک قطعه کد به عنوان یک ماژول، بیشتر به کاری که انجام می‌دهد اشاره دارد. هرگونه فایل NodeJs یا مجموعه‌ای از فایل‌ها که توابع و داده‌های آن برای برنامه‌های خارجی قابل استفاده باشد، می‌تواند یک ماژول در نظر گرفته شود.

از آنجا که ماژول‌ها مجموعه‌ای از قابلیتها را فراهم می‌کنند، بنابراین می‌توانند در بسیاری از برنامه‌های بزرگتر مورد استفاده مجدد قرار بگیرند و به شما این امکان را می‌دهند تا برنامه‌هایی را به هم پیوست کنید که با پیچیدگی همراه هستند و راه را برای اشتراک کد با سایر توسعه دهندگان هموار می‌کنند. توانایی نوشتن ماژول‌هایی که توابع و داده‌های مفید را صادر می‌کند، به شما امکان می‌دهد به جامعه گسترده NodeJs کمک کنید. در واقع تمام پکیج‌هایی که در npm استفاده می‌کنید به صورت بسته بندی شده و به عنوان ماژول به اشتراک گذاشته می‌شوند. این امر ایجاد یک ماژول را به یک مهارت اساسی برای یک توسعه دهنده Node.Js تبدیل می‌کند.

در این آموزش، یک ماژول NodeJs ایجاد خواهید کرد که نشان می‌دهد توسعه دهندگان وب از چه رنگی باید در طراحی خود استفاده کنند. با ذخیره سازی رنگ‌ها به صورت آرایه و ارائه تابعی برای بازیابی تصادفی، ماژول را توسعه خواهید داد. پس از آن، روش‌های مختلف وارد کردن ماژول به برنامه NodeJs را اجرا خواهید کرد.

پیش نیازها

  • ابتدا به NodeJs و npm در محیط توسعه خود نیاز دارید. این آموزش از نسخه 10.17.0 استفاده می‌کند. برای نصب این مورد در macOS یا Ubuntu 18.04، مراحل مربوط به نصب NodeJs و ایجاد یک محیط توسعه محلی در macOS یا بخش نصب با PPA در آموزش نصب NodeJs در اوبونتو 18.04 را دنبال کنید. با نصب NodeJs در واقع npm را نیز نصب خواهید کرد.
  • همچنین باید با فایل package.json آشنا باشید و تجربه کار با دستورات npm نیز مفید خواهد بود. برای به دست آوردن این تجربه، نحوه استفاده از ماژول‌های NodeJs را با npm و package.json، به ویژه مرحله 1 یعنی ایجاد فایل package.json که در ادامه می‌خوانید، دنبال کنید.
  • به علاوه برای کار با NodeJs REPL (خواندن، ارزیابی، چاپ و حلقه) به شما کمک می‌کند که از این برای تست ماژول خود استفاده خواهید کرد. اگر در این مورد به اطلاعات بیشتری نیاز دارید، راهنمای ما را در مورد نحوه استفاده از NodeJs REPL بخوانید.

مرحله 1 - ایجاد ماژول

این مرحله شما را در ایجاد اولین ماژول NodeJs راهنمایی می‌کند. ماژول شما شامل مجموعه‌ای از رنگ‌ها در یک آرایه خواهد بود و تابعی را برای به دست آوردن یک مورد تصادفی فراهم می‌کند. شما از ویژگی NodeJs داخلی برای اکسپورت کردن استفاده خواهید کرد تا تابع و آرایه را در دسترس برنامه‌های خارجی قرار دهید.

در ابتدا، شما با تصمیم گیری در مورد ذخیره سازی داده‌ها در مورد ماژول شروع خواهید کرد. هر رنگی یک شی خواهد بود و دارای یک خصوصیت name است که انسان به راحتی می‌تواند آن را شناسایی کند و خصوصیت code نیز یک رشته است که حاوی کد رنگی HTML می‌باشد. کدهای رنگی HTML اعداد شش رقمی هگزادسیمال هستند که به شما امکان تغییر رنگ عناصر در یک صفحه وب را می‌دهند. با مطالعه مقاله HTML Color Codes and Names می‌توانید درباره کدهای رنگ HTML بیشتر بدانید.

سپس تصمیم خواهید گرفت که چه رنگ‌هایی را در ماژول خود پشتیبانی کنید. ماژول شما شامل یک آرایه به نام allColors خواهد بود که شامل شش رنگ است. همچنین دارای تابعی به نام ()getRandomColor است که به طور تصادفی رنگی را از آرایه شما انتخاب می‌کند و آن را برمی‌گرداند.

در ترمینال خود، پوشه جدیدی به نام Colors بسازید و وارد آن شوید:

mkdir colors
cd colors

npm را باز کنید تا برنامه‌های دیگر بعدا بتوانند این ماژول را ایمپورت کنند:

npm init -y

شما برای پرش از دستورات معمول برای سفارشی کردن package.json خود از y- استفاده کردید. اگر این ماژولی بود که میخواستید در npm منتشر کنید، به همه این اعلانها با دادههای مربوطه پاسخ میدهید. همانطور که در مقاله نحوه استفاده از ماژولهای NodeJs با npm و package.json توضیح داده شده است.

در این حالت، خروجی شما به صورت زیر است:

Output
{
  "name": "colors",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

اکنون یک ویرایشگر متن خط فرمان مانند nano را باز کنید و یک فایل جدید ایجاد کنید تا به عنوان نقطه ورودی ماژول شما عمل کند:

nano index.js

ماژول شما چند کار انجام می‌دهد. ابتدا کلاس Color را تعریف خواهید کرد. کلاس Color شما با نام و کد HTML خود نمونه سازی می‌شود. برای ایجاد کلاس خطوط زیر را اضافه کنید:

class Color {
  constructor(name, code) {
    this.name = name;
    this.code = code;
  }
}

اکنون که ساختار داده خود را برای Color دارید، نمونه‌هایی را به ماژول خود اضافه کنید و آرایه هایلایت شده زیر را در فایل خود بنویسید:

class Color {
  constructor(name, code) {
    this.name = name;
    this.code = code;
  }
}

const allColors = [
  new Color('brightred', '#E74C3C'),
  new Color('soothingpurple', '#9B59B6'),
  new Color('skyblue', '#5DADE2'),
  new Color('leafygreen', '#48C9B0'),
  new Color('sunkissedyellow', '#F4D03F'),
  new Color('groovygray', '#D7DBDD'),
];

در آخر، تابعی را وارد کنید که به صورت تصادفی موردی را از آرایه allColors که به تازگی ایجاد کرده‌اید، انتخاب کند:

class Color {
  constructor(name, code) {
    this.name = name;
    this.code = code;
  }
}

const allColors = [
  new Color('brightred', '#E74C3C'),
  new Color('soothingpurple', '#9B59B6'),
  new Color('skyblue', '#5DADE2'),
  new Color('leafygreen', '#48C9B0'),
  new Color('sunkissedyellow', '#F4D03F'),
  new Color('groovygray', '#D7DBDD'),
];

exports.getRandomColor = () => {
  return allColors[Math.floor(Math.random() * allColors.length)];
}

exports.allColors = allColors;

کلمه کلیدی exports به یک شی گلوبال که در هر ماژول NodeJs موجود است، ارجاع می‌دهد. وقتی سایر ماژول‌های NodeJs آن را ایمپورت می‌کنند، همه توابع و اشیا ذخیره شده در شی exports ماژول نشان داده می‌شوند. برای مثال تابع ()getRandomColor مستقیما روی شی exports ایجاد شده، سپس یک خصوصیت allColors به شی exports اضافه گردیده و به آرایه ثابت محلی allColors که قبلا در اسکریپت ایجاد شده است، ارجاع می‌دهد.

وقتی ماژول‌های دیگر این ماژول را ایمپورت می‌کنند، هم allColors و هم ()getRandomColor نمایش داده می‌شوند و برای استفاده در دسترس هستند.

فایل را ذخیره کرده و از آن خارج شوید.

تا به اینجا ماژولی ایجاد کرده‌اید که شامل آرایه‌ای از رنگ‌ها و تابعی است که به طور تصادفی یکی را برمی‌گرداند. شما همچنین آرایه و تابع را اکسپورت کرده‌اید، بنابراین برنامه‌های خارجی می‌توانند از آنها استفاده کنند. در مرحله بعدی برای نشان دادن اثرات exports، از ماژول خود در برنامه‌های دیگر استفاده خواهید کرد.

مرحله 2 - آزمایش ماژول با REPL

قبل از ایجاد یک برنامه کامل، زمانی را برای تست ماژول اختصاص دهید تا مطمئن شوید که به خوبی کار می‌کند. در این مرحله برای بارگذاری ماژول رنگ‌ها از REPL استفاده خواهید کرد. در حالی که در REPL هستید، تابع ()getRandomColor را فراخوانی کنید تا ببینید عملکرد مطابق انتظار شما را دارد یا خیر.

NodeJs REPL را در همان پوشه فایل index.js باز کنید. برای این کار از دستور زیر استفاده کنید:

node

وقتی REPL باز شد، علامت > را مشاهده خواهید کرد. این بدان معنی است که می‌توانید کدهای جاوااسکریپت را وارد کنید که بلافاصله ارزیابی می‌شوند. اگر می‌خواهید در این مورد بیشتر بخوانید، راهنمای استفاده از REPL را دنبال کنید.

ابتدا موارد زیر را وارد کنید:

colors = require('./index');

در این دستور، متد require() ماژول colors را در قسمت ورودی خود بارگیری می‌کند. وقتی ENTER را فشار دهید، موارد زیر را خواهید گرف:

Output
{
  getRandomColor: [Function],
  allColors: [
    Color { name: 'brightred', code: '#E74C3C' },
    Color { name: 'soothingpurple', code: '#9B59B6' },
    Color { name: 'skyblue', code: '#5DADE2' },
    Color { name: 'leafygreen', code: '#48C9B0' },
    Color { name: 'sunkissedyellow', code: '#F4D03F' },
    Color { name: 'groovygray', code: '#D7DBDD' }
  ]
}

REPL مقدار colors را به ما نشان می‌دهد که همه توابع و اشیا از فایل index.js وارد شده‌اند. هنگامی که از کلمه کلیدی require استفاده می‌کنید، NodeJs تمام محتوای موجود در شی exports ماژول را برمی گرداند.

به یاد بیاورید که ()getRandomColor و allColors را به exports در ماژول color اضافه کردید. به همین دلیل هنگام وارد کردن آنها هر دو را در REPL مشاهده می‌کنید.

در اسرع وقت، تابع ()getRandomColor را تست کنید:

colors.getRandomColor();

می‌بینید که یک رنگ تصادفی به شما داده می‌شود:

Output
Color { name: 'groovygray', code: '#D7DBDD' }

از آنجا که شاخص تصادفی است، ممکن است خروجی‌ها متفاوت باشد. اکنون که کارکرد ماژول color را تأیید کردید، از NodeJs REPL با دستور زیر خارج شوید:

.exit

با این کار شما به خط فرمان ترمینال خود باز خواهید گشت.

به تازگی تأیید کرده‌اید که ماژول شما مطابق انتظار با استفاده از REPL کار می‌کند. در مرحله بعد، همان مفاهیم را اعمال خواهید کرد و ماژول خود را در برنامه بارگیری می‌کنید. همانطور که در یک پروژه واقعی این کار انجام می‌شود.

مرحله 3 - ذخیره ماژول محلی به عنوان یک وابستگی

هنگام آزمایش ماژول خود در REPL، آن را با یک مسیر نسبی وارد کنید. این بدان معنی است که شما برای به دست آوردن محتویات آن از محل فایل index.js مرتبط با دایرکتوری استفاده کرده‌اید. هرچند این کار می‌کند، اما معمولا تجربه برنامه نویسی می‌گوید بهتر است که ماژول ها را با نام آنها وارد کنید تا هنگام تغییر محتوا، ایمپورت‌ها خراب نشود. در این مرحله ماژول colors را با ویژگی install محلی ماژول npm نصب خواهید کرد.

ماژول جدید NodeJs را در خارج از پوشه colors تنظیم کنید. ابتدا به پوشه قبلی بروید و یک پوشه جدید ایجاد کنید. با دستور زیر این کار را انجام دهید:

cd ..
mkdir really-large-application

اکنون وارد پروژه جدید خود شوید:

cd really-large-application

مانند ماژول colors، پوشه خود را با npm مقداردهی اولیه کنید:

npm init -y

package.json زیر تولید می‌شود:

Output
{
  "name": "really-large-application",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

اکنون ماژول colors خود را نصب کرده و از save-- استفاده کنید تا در فایل package.json ضبط شود:

npm install --save ../colors

شما فقط ماژول colors خود را در پروژه جدید نصب کرده‌اید. برای دیدن وابستگی محلی جدید، فایل package.json را باز کنید. با دستور زیر:

nano package.json

متوجه خواهید شد که خطوط هایلایت شده زیر اضافه شده‌اند:

{
  "name": "really-large-application",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "colors": "file:../colors"
  }
}

از فایل خارج شوید.

ماژول colors در دایرکتوری node_modules شما کپی شد. با دستور زیر آن را تأیید کنید:

ls node_modules

که خروجی زیر را ایجاد می‌کند:

Output
colors

در این برنامه جدید از ماژول محلی نصب شده خود استفاده کنید. ویرایشگر متن خود را دوباره باز کنید و یک فایل جاوااسکریپت دیگر ایجاد کنید:

nano index.js

برنامه ابتدا ماژول colors را وارد می‌کند. سپس با استفاده از تابع ()getRandomColor به طور تصادفی رنگی را انتخاب می‌کند. در آخر پیامی را به کنسول چاپ می‌کند که به کاربر می‌گوید از چه رنگی استفاده کند.

کد زیر را در index.js وارد کنید:

const colors = require('colors');

const chosenColor = colors.getRandomColor();
console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);

این فایل را ذخیره کرده و از آن خارج شوید.

برنامه شما اکنون به کاربر گزینه رنگی تصادفی را برای کامپوننت وب سایت اعلام خواهد کرد.

این اسکریپت را با استفاده از دستور زیر اجرا کنید:

node index.js

خروجی شما مشابه این خواهد بود:

Output
You should use leafygreen on your website. It's HTML code is #48C9B0

اکنون ماژول colors را با موفقیت نصب کرده‌اید و می‌توانید آن را مانند سایر پکیج‌های npm استفاده شده در پروژه خود مدیریت کنید. با این حال اگر رنگها و توابع بیشتری را به ماژول colors محلی خود اضافه کنید، باید npm update را در برنامههای خود اجرا کنید تا بتوانید از گزینههای جدید استفاده کنید. در مرحله بعدی، به روش‌های دیگری از رنگ‌های ماژول محلی استفاده می‌کنید و با تغییر کد ماژول، به روزرسانی‌های خودکار را دریافت خواهید کرد.

مرحله 4 – لینک کردن یک ماژول محلی

اگر ماژول محلی شما در حال توسعه است، به روزرسانی مداوم پکیج‌ها ممکن است خسته کننده باشد. یک گزینه جایگزین برای آن لینک کردن ماژول‌ها است. اتصال ماژول این اطمینان را حاصل می‌کند که هرگونه به روزرسانی ماژول بلافاصله در برنامه‌های دیگر که از آن استفاده می‌کنند، منعکس می‌شود.

در این مرحله، ماژول colors را به برنامه خود لینک کنید. همچنین می‌توانید ماژول colors را اصلاح کرده و تأیید کنید که جدیدترین تغییرات آن بدون نیاز به نصب مجدد یا ارتقا در برنامه اعمال شود.

ابتدا ماژول محلی خود را با دستور زیر حذف کنید:

npm un colors

npm ماژول‌ها را با استفاده از پیوندهای نمادین (پیوندهای همزمانی) لینک می‌کند. اینها مرجع‌هایی هستند كه به فایل‌ها یا دایرکتوری‌های سیستم شما اشاره می‌كنند. لینک کردن ماژول در دو مرحله انجام می‌شود:

  1. ایجاد لینک گلوبال به ماژول. npm لینکی بین دایرکتوری گلوبال node_modules و دایرکتوری ماژول شما ایجاد می‌کند. دایرکتوری گلوبال node_modules مکانی است که تمام پکیج‌های npm کل سیستم شما در آن نصب شده است (شامل هر پکیجی که با g- نصب می‌کنید).
  2. ایجاد لینک محلی. npm لینکی میان پروژه محلی شما ایجاد می‌کند که از ماژول و لینک گلوبال ماژول استفاده می‌کند.

ابتدا با بازگشت به پوشه colors و استفاده از دستور link، لینک گلوبال را ایجاد کنید:

cd ../colors
sudo npm link

پس از تکمیل، خروجی شما به صورت زیر است:

Output
/usr/local/lib/node_modules/colors -> /home/sammy/colors

فقط کافی است در پوشه node_modules به دایرکتوری colors خود یک لینک همسان ایجاد کنید.

به پوشه really-large-application برگردید و پکیج را لینک کنید:

cd ../really-large-application
sudo npm link colors

خروجی مشابه زیر دریافت خواهید کرد:

Output
/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors

توجه: اگر می‌خواهید کمتر تایپ کنید، می‌توانید از ln به جای link استفاده کنید. به عنوان مثال colors npm ln دقیقا به همین روش کار می‌کند.

همانطور که خروجی نشان می‌دهد، شما فقط یک لینک همسان از پوشه node_modules محلی really-large-application خود به لینک همسان colors در node_modules گلوبال خود ایجاد کرده‌اید که به دایرکتوری واقعی با ماژول colors اشاره می‌کند.

فرایند لینک کردن کامل است. فایل خود را اجرا کنید تا مطمئن شوید که به درستی کار می‌کند:

node index.js

خروجی شما مشابه این خواهد بود:

Output
You should use sunkissedyellow on your website. It's HTML code is #F4D03F

عملکرد برنامه شما درست است. سپس تست کنید که آیا بلافاصله به روزرسانی‌ها اعمال می‌شوند. در ویرایشگر متن، فایل index.js را در ماژول colors دوباره باز کنید:

cd ../colors
nano index.js

حالا یک تابع اضافه کنید که بهترین سایه آبی موجود را انتخاب می‌کند. هیچ استدلالی لازم نیست و همیشه سومین مورد از آرایه allColors را برمی‌گرداند. این خطوط را به انتهای فایل اضافه کنید:

class Color {
  constructor(name, code) {
    this.name = name;
    this.code = code;
  }
}

const allColors = [
  new Color('brightred', '#E74C3C'),
  new Color('soothingpurple', '#9B59B6'),
  new Color('skyblue', '#5DADE2'),
  new Color('leafygreen', '#48C9B0'),
  new Color('sunkissedyellow', '#F4D03F'),
  new Color('groovygray', '#D7DBDD'),
];

exports.getRandomColor = () => {
        return allColors[Math.floor(Math.random() * allColors.length)];
        }

exports.allColors = allColors;

exports.getBlue = () => {
  return allColors[2];
}

فایل را ذخیره کرده و از آن خارج شوید. سپس فایل index.js را در پوشه really-large-application باز کنید:

cd ../really-large-application
nano index.js

تابع ()getBlue تازه ایجاد شده را فراخوانی کنید و جمله‌ای را با ویژگی‌های رنگ چاپ کنید. این عبارات را به انتهای فایل اضافه کنید:

const colors = require('colors');

const chosenColor = colors.getRandomColor();
console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);

const favoriteColor = colors.getBlue();
console.log(`My favorite color is ${favoriteColor.name}/${favoriteColor.code}, btw`);

فایل را ذخیره کرده و از آن خارج شوید.

این کد اکنون از تابع ()getBlue تازه ایجاد شده استفاده می‌کند. فایل را مانند قبل اجرا کنید:

node index.js

خروجی مانند زیر خواهید گرفت:

Output
You should use brightred on your website. It's HTML code is #E74C3C
My favorite color is skyblue/#5DADE2, btw

اسکریپت شما بدون استفاده از به روزرسانی npm قادر به استفاده از آخرین تابع در ماژول colors است. با این کار ایجاد تغییرات در برنامه در حال توسعه آسان‌تر خواهد بود.

هنگام نوشتن برنامه‌های بزرگتر و پیچیده‌تر، به این فکر کنید که چگونه کدهای مرتبط را می‌توان در ماژول‌ها گروه بندی کرد و می‌خواهید این ماژول‌ها چگونه تنظیم شوند. اگر ماژول شما فقط قرار است توسط یک برنامه استفاده شود، می‌تواند در همان پروژه باقی بماند و با یک مسیر نسبی ارجاع داده شود. اگر بعدا ماژول شما به طور جداگانه به اشتراک گذاشته می‌شود یا در مکانی کاملا متفاوت از پروژه‌ای که اکنون روی آن کار می‌کنید، نصب یا لینک شود می‌تواند دوام بیشتری داشته باشد. ماژول‌های در حال توسعه فعال نیز از به روزرسانی خودکار لینک دهی بهره مند می‌شوند. اگر ماژول تحت توسعه نباشد، استفاده از npm install ممکن است گزینه آسان‌تری به نظر برسد.

جمع‌بندی

در این مقاله آموختید که ماژول NodeJs یک فایل جاوااسکریپت با توابع و شی‌هایی است که می‌تواند توسط برنامه‌های دیگر استفاده شود. سپس یک ماژول ایجاد کردید و توابع و اشیا خودتان را به هدف exports گلوبال لینک کردید تا در دسترس برنامه‌های خارجی قرار بگیرند. سرانجام آن ماژول را به یک برنامه دیگر وارد کردید که نشان می‌دهد چگونه ماژول‌ها در برنامه‌های بزرگتر جمع آوری می‌شوند.

اکنون که نحوه ایجاد ماژول را می‌دانید، به نوع برنامه‌ای که می‌خواهید بنویسید فکر کنید و آن را به اجزای مختلف تقسیم کنید و هر مجموعه فعالیت و داده منحصر به فرد را در ماژول‌های خود نگه دارید. هرچه تمرین بیشتری برای نوشتن ماژول داشته باشید، توانایی نوشتن برنامه‌های با کیفیت بالای NodeJs را کسب خواهید کرد.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو