کدنویسی و انتشار پکیج NPM — از صفر تا صد

۳۵۱ بازدید
آخرین به‌روزرسانی: ۰۱ مهر ۱۴۰۲
زمان مطالعه: ۵ دقیقه
کدنویسی و انتشار پکیج NPM — از صفر تا صد

NPM یک ابزار مدیریت پکیج برای Node.js است و یک ریپازیتوری مرکزی محسوب می‌شود که می‌توانید ریپوهای خود را روی آن منتشر کرده و ریپازیتوری‌های دیگران را از آنجا دانلود کنید. هر ریپویی که روی NPM منتشر می‌شود، به صورت پیش‌فرض عمومی است. امکان انتشار ریپوهای خصوصی نیز وجود دارد، اما این کار هزینه دارد. در این مقاله با روش کدنویسی و انتشار پکیج NPM آشنا می‌شویم.

پیش‌نیازها

در این مقاله دو پیش‌نیاز داریم که پس از آماده شدن آن‌ها می‌توانیم به کار عملی بپردازیم:

  • نصب Node.js از این آدرس (+)
  • ایجاد یک حساب NPM در این آدرس (+)

پکیج یا ماژول

تفاوت ظریفی بین پکیج‌ها و ماژول‌ها وجود دارد که در این بخش آن را توضیح می‌دهیم.

بر اساس مستندات npmjs پکیج یک فایل یا دایرکتوری است که به وسیله فایل package.json توصیف می‌شود. در واقع پکیج باید دارای package.json باشد تا بتواند در رجیستری NPM منتشر شود.

ماژول یک فایل یا دایرکتوری تحت دایرکتوری node_modules است که می‌تواند از سوی تابع require بارگذاری شود. ماژول باید یا یک فایل جاوا اسکریپت و یا یک پوشه شامل package.json با فیلد nain و یا یک پوشه با فایل index.js باشد.

بنابراین همه پکیج‌ها، ماژول محسوب می‌شوند، اما همه ماژول‌ها نمی‌توانند پکیج باشند، زیرا هیچ الزامی به گنجاندن فایل package.json در ماژول‌ها وجود ندارد.

چه چیزی منتشر می‌کنیم؟

از آنجا که نقطه تمرکز ما در این مقاله بر روی انتشار پکیج‌های NPM است، یک پروژه ساده به نام Calculator ایجاد می‌کنیم. این ماشین حساب 4 متد برای جمع، تفریق، ضرب و تقسیم خواهد داشت.

در ادامه روش تبدیل این پروژه به یک پکیج و انتشار آن رh هم به صورت نسخه جاوا اسکریپت و هم تایپ اسکریپت بررسی می‌کنیم.

نسخه جاوا اسکریپت

چنان که پیش‌تر اشاره کردیم، هر پکیج به یک فایل package.json نیاز دارد. بنابراین ترمینال یا خط فرمان را باز کرده و با دستور npm init چنین فایلی ایجاد می‌کنیم. این دستور چند سؤال از ما می‌پرسد که پاسخ داده و مقدار yes وارد می‌کنیم:

// make a direcotry
mkdir calculator

// cd into direcory
cd calculator

// initialize package.json
npm init

بدین ترتیب فایل زیر ایجاد می‌شود:

کدنویسی و انتشار پکیج NPM
فرایند npm init

فایل package.json

1{
2  "name": "calculator",
3  "version": "1.0.0",
4  "description": "Basic calculator with four methods",
5  "main": "index.js",
6  "scripts": {
7    "test": "echo \"Error: no test specified\" && exit 1"
8  },
9  "keywords": [
10    "calculator",
11    "add",
12    "subtract",
13    "multiply",
14    "divide"
15  ],
16  "author": "Bhargav Bachina",
17  "license": "ISC"
18}

اگر به فیلد main در فایل package.json فوق توجه کنید، می‌بینید که این فایل اصلی یا آغازین پکیج است. در ادامه فایل index.js را ایجاد می‌کنیم.

فایل index.js

1var Calculator = function(){};
2
3Calculator.prototype.add = function(a,b) {
4    return a + b;
5}
6
7Calculator.prototype.subtract = function(a,b) {
8    return a - b;
9}
10
11Calculator.prototype.multiply = function(a,b) {
12    return a * b;
13}
14
15Calculator.prototype.divide = function(a,b) {
16    return a / b;
17}
18
19module.exports = new Calculator();

اکنون پکیج ما آماده است. پیش از انتشار پکیج باید وارد حساب npm خود شویم. این کارها باید در پوشه ریشه پروژه که فایل package.json قرار دارد انجام دهید:

// login into your account
npm login

// publish your package
npm publish

زمانی که آن را منتشر کنید نام و نسخه پکیج را از روی فیلدهای نام و نسخه در فایل package.json می‌گیرد:

کدنویسی و انتشار پکیج NPM

اینک وارد حساب npm خود می‌شویم تا پکیجمان را ببینیم.

کدنویسی و انتشار پکیج NPM

نسخه تایپ اسکریپت

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

به این منظور باید پکیج‌های وابستگی dev را به صورت ts-node و typescript نصب کنیم تا پروژه از جاوا اسکریپت به تایپ اسکریپت ترجمه شود:

// make a direcotry
mkdir calculator

// cd into direcory
cd calculator

// initialize package.json
npm init

// install dv dependencies
npm i ts-node typescript --save-dev


نسخه تایپ اسکریپت فایل‌ها به صورت زیر است:

فایل index.js

1export class Calculator {
2
3    public add(a: number, b: number): number {
4        return a + b;
5    }
6
7    public subtract(a: number, b: number): number {
8        return a - b;
9    }
10
11    public multiply(a: number, b: number): number {
12        return a * b;
13    }
14
15    public divide(a: number, b: number): number {
16        return a / b;
17    }
18}

فایل package.json

1{
2  "name": "bachicaltypescript",
3  "version": "1.0.0",
4  "description": "Calculator with basic methods",
5  "main": "dist/index.js",
6  "scripts": {
7    "build": "tsc",
8    "test": "echo \"Error: no test specified\" && exit 1"
9  },
10  "keywords": [
11    "calclulator",
12    "add",
13    "subtract",
14    "multiply",
15    "divide"
16  ],
17  "author": "Bhargav Bachina",
18  "license": "ISC",
19  "devDependencies": {
20    "ts-node": "^8.1.0",
21    "typescript": "^3.4.5"
22  }
23}

فایل tsconfig.json

1{
2  "compilerOptions": {
3    "target": "es5",
4    "module": "commonjs",
5    "declaration": true,
6    "outDir": "./dist",
7    "strict": true
8  }
9}

پکیج ts-node از فایل tsconfig.json برای ترجمه تایپ اسکریپت به جاوا اسکریپت استفاده می‌کند و همه فایل‌ها را زیر پوشه dist گردآوری می‌کند.

// build the project
tsc

// you can add build script to package.json
npm run build

// publish
npm publish
کدنویسی و انتشار پکیج NPM
فایل تعریف نوع
کدنویسی و انتشار پکیج NPM
انتشار نسخه تایپ اسکریپت

همواره به خاطر داشته باشید که کد خود را روی Github قرار دهید و این اطلاعات را در فایل package.json قرار دهید تا هر گونه باگ یا مشکل از سوی جامعه اوین سورس متذکر شود.

استفاده از پکیج در پروژه‌های دیگر Node.js

اکنون دو پکیج داریم که یکی در زبان جاوا اسکریپت و دیگری در زبان تایپ اسکریپت است. در این بخش هر دو آن‌ها را تست می‌کنیم:

// install
npm i bachinacalculator –save
کدنویسی و انتشار پکیج NPM
نصب پکیج‌ها

پکیج را ایمپورت کرده و مورد استفاده قرار می‌دهیم:

کدنویسی و انتشار پکیج NPM

خروجی به صورت زیر است:

کدنویسی و انتشار پکیج NPM

نسخه تایپ اسکریپت را نیز می‌توانید به همین روش نصب کرده و مورد استفاده قرار دهید. اما باید آن را در پروژه تایپ اسکریپت ایمپورت کنید.

به‌روزرسانی پکیج‌ها و نسخه‌بندی معناشناختی

اینک متوجه می‌شویم که فایل readme برای پکیج‌های خود نداریم، بنابراین این فایل را اضافه کرده و پکیج را به‌روزرسانی می‌کنیم.

کدنویسی و انتشار پکیج NPM
فایل README.md

اکنون فایل README.md را اضافه کرده‌ایم و باید نسخه پروژه را پیش از انتشار افزایش دهیم. در نمودار زیر نسخه‌بندی معناشناختی توضیح داده شده است:

کدنویسی و انتشار پکیج NPM
نسخه‌بندی معناشناختی

فایل README.md را به پروژه خود اضافه کرده‌ایم و با توجه به این که این یک وصله محسوب می‌شود عدد patch را در فایل package.json افزایش می‌دهیم.

کدنویسی و انتشار پکیج NPM
تغییر نسخه
کدنویسی و انتشار پکیج NPM
انتشار و به‌روزرسانی

به این ترتیب می‌توانیم نسخه به‌روز شده پکیج را در NPM ببینیم که فایل README.md به آن اضافه شده و جدیدترین نسخه محسوب می‌شود.

کدنویسی و انتشار پکیج NPM

اگر به زبانه version بروید، می‌توانید سابقه نسخه‌ها را در آنجا ببینید.

کدنویسی و انتشار پکیج NPM

جمع‌بندی و معرفی بهترین رویه‌ها

  • برای انتشار پکیج‌ها روی NPM به یک حساب روی این رجیستری نیاز دارد. به صورت پیش‌فرض همه پکیج‌ها عمومی هستند.
  • پکیج‌ها و ماژول‌ها متفاوت هستند. همه ماژول‌ها پکیج نیستند، چون باید دارای فایل package.json باشند.
  • می‌توانیم پکیج‌ها را هم در زبان جاوا اسکریپت و هم تایپ اسکریپت منتشر کنیم.
  • در زبان تایپ اسکریپت باید تعاریف نوع را همراه با سورس کد داشته باشیم.
  • فایل package.json همه اطلاعات پکیج شامل نام، نسخه، وابستگی‌ها و غیره را در خود دارد.
  • همواره از رویکرد نسخه‌بندی معناشناختی برای تعیین نسخه پکیج پیروی کنید.
  • همواره ریپوی گیت‌هاب مربوط به کد منبع پکیج را تعیین کرده و issue-ها را باز کنید.

سخن پایانی

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
bb-tutorials-and-thoughts
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *