آشنایی مقدماتی با NPM

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 17 دی 1397
دسته بندی ها : جاوا اسکریپت

نودجی‌اس این امکان را برای ما فراهم کرده که بتوانیم اپلیکیشن‌های جاوااسکریپتی را در طرف سرور ایجاد کنیم. نودجی‌اس با استفاده از سی‌پلاس‌پلاس نوشته و روی موتور V8 JavaScript runtime ساخته شده است. به صورت اصلی نودجی‌اس را برای این موضوع ایجاد کردند تا بتوانند اپلیکیشن‌های مربوط به محیط سرور را پیاده‌سازی بکنند اما بعدها توسعه‌دهندگان مختلفی از نودجی‌اس استفاده‌های دیگری از جلمه خودکارسازی فرایند‌های محلی کردند. از آن زمان به بعد کل اکوسیستم توسعه نودجی‌اس تغییر پیدا کرد. حال ما می‌توانیم ابزارهای مختلفی را مشاهده کنیم که براساس نودجی‌اس ساخته شده‌اند – Grunt، Gulp و Webpack – ابزارهایی از این دست هستند.

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

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

اما قبل از آنکه سراغ استفاده از NPM برویم نیاز است که ابتدای کار node.js را نصب بکنیم.

نصب Node.js

وارد وبسایت Node.js شوید و نسخه‌ای که به آن نیاز دارید را دانلود بکنید. در این وبسایت می‌توانید نسخه‌های مختلفی از نودجی‌اس را که برای سیستم عامل‌های مختلفی ایجاد شده است را مشاهده بکنید. ما در این آموزش از نسخه پایدار 6.10.3 استفاده می‌کنیم.

فرایند نصب کردن نودجی‌اس در لینوکس بسیار ساده است. اگر از اوبونتو استفاده می‌کنید می‌توانید از طریق دستور sudo apt install nodejs این کار را انجام دهید. با این حال بعد از دانلود بسته نصبی مخصوص سیستم عامل و نصب آن، برای مطمئن شدن از نصب و مشاهده نسخه آن می‌توانید دستورات زیر را وارد کنید:

$ which node

/usr/bin/node

$ node --version

v6.10.3

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

$ node

> console.log('Node is running');

Node is running

> .help

.break Sometimes you get stuck, this gets you out

.clear Alias for .break

.exit  Exit the repl

.help  Show repl options

.load  Load JS from a file into the REPL session

.save  Save all evaluated commands in this REPL session to a file

> .exit

حال که نودجی‌اس را نصب کردید نیاز است از این به بعد تمرکز خودمان را روی پکیج منیجر نودجی‌اس یا همان npm بگذاریم. با استفاده از دستورات زیر می‌توانیم مکان و نسخه آن را بدست بیاوریم:

$ which npm

/usr/bin/npm

$ npm --version

3.10.10

ماژول‌های پکیج شده‌ی نودجی‌اس

npm می‌تواند پکیج‌های مورد نیاز شما را به صورت محلی و به صورت همگانی یا Global نصب بکند. در حالت محلی npm پکیج‌های مورد نظرتان را در دایرکتوری node_modules ذخیره می‌کند. این دایرکتوری در مسیر روت پروژه شما قرار می‌گیرد. اما در حالت همگانی پکیج‌های شما در آدرس {prefix}/lib/node_modules/ ذخیره می‌شود. در واقع prefix شامل دایرکتوری usr یا usr/local می‌شود که برای هر کاربر منحصر به فرد است. در نهایت برای آنکه بتوانید همه پکیج‌ها را به صورت همگانی نصب بکنید نیاز است که از دسترسی ریشه استفاده نمایید. اینگونه بسیاری از مشکلات امنیتی نیز حل خواهد شد.

تغییر مسیر ذخیره پکیج‌های همگانی

دستور npm config list را وارد کنید و خروجی را مشاهده نمایید:

$ npm config list

; cli configs

user-agent = "npm/3.10.10 node/v6.10.3 linux x64"

; userconfig /home/sitepoint/.npmrc

prefix = "/home/sitepoint/.node_modules_global"

; node bin location = /usr/bin/nodejs

; cwd = /home/sitepoint

; HOME = /home/sitepoint

; "npm config ls -l" to show all defaults.

این دستور اطلاعاتی در ارتباط با بسته نصبی ما می‌دهد. در حال حاضر مهم است که مسیر اصلی برای ذخیره پکیج‌ها را دریافت کنیم.

$ npm config get prefix

/usr

حال همانطور که می‌دانید می‌خواهیم این مسیر را تغییر دهیم. برای این کار باید به متغیر prefix دسترسی داشته باشیم. ما قصد داریم پکیج ها را در مسیر home/.node_modules_global نصب کنیم. برای اینکار ابتدا دایرکتوری لازمه را ایجاد می‌کنیم و بعد از آن مقدار prefix را به مسیری که نیاز داریم تغییر می‌دهیم:

$ cd ~ && mkdir .node_modules_global

$ npm config set prefix=$HOME/.node_modules_global

با استفاده از این پیکربندی ساده حال ما محل پکیج نودجی‌اس را تغییر دادیم. همچنین انجام چنین کاری باعث می‌شود که فایلی با نام .npmrc در دایرکتوری home ایجاد شود.

$ npm config get prefix

/home/sitepoint/.node_modules_global

$ cat .npmrc

prefix=/home/sitepoint/.node_modules_global

با وجود انجام این تغییرات اما هنوز NPM در مکانی قرار گرفته است که توسط root مدیریت می‌شود. اما  از آن‌جایی که مکان پکیج‌های همگانی را تغییر داده‌ایم، می‌توانیم کارهای دیگری را نیز انجام بدهیم. ابتدا ما نیاز داریم که یک بار دیگر npm را نصب بکنیم، با این کار npm برای کاربر کنونی به خوبی نصب خواهد شد:

$ npm install npm --global
└─┬ npm@5.0.2
  ├── abbrev@1.1.0
  ├── ansi-regex@2.1.1
....
├── wrappy@1.0.2
└── write-file-atomic@2.1.0

در نهایت ما نیاز داریم که .node_modules_global/bin را به متغیر محیطی خودمان یعنی $PATH اضافه کنیم. حال با این کار می‌توانیم پکیج‌های همگانی را از طریق خط فرمان اجرا کنیم. برای انجام این کار کافی‌ست کد خط زیر را به فایل .profile، .bash_profile و یا .bashrc اضافه کرده و ترمینال را مجددا راه اندازی کنیم.

export PATH="$HOME/.node_modules_global/bin:$PATH"

حال .node_modules_global/bin با نسخه درست در مکان درست نمایش داده می‌شود:

$ which npm

/home/sitepoint/.node_modules_global/bin/npm

$ npm --version

5.0.2

نصب پکیج‌ها در حالت همگانی

در حال حاضر ما فقط یک پکیج را داریم که به صورت همگانی نصب شده است. منظورمان از این پکیج هم خود npm است. بیایید این حالت را تغییر بدهیم و پکیج جدیدی را اضافه کنیم. این پکیج UglifyJS نام دارد و برای کوچک کردن فایل‌های جاوااسکریپتی به کار می‌رود:

$ npm install uglify-js --global

/home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs

+ uglify-js@3.0.15

added 4 packages in 5.836s

همانطور که از خروجی مشاهده می‌کنید، پکیج ما به خوبی نصب شده است. 

لیست پکیج‌های همگانی

ما می‌توانیم لیستی از تمام پکیج‌هایی را که به صورت همگانی نصب کرده‌ایم چاپ کنیم. برای اینکار کافی‌ست دستور npm list را با آرگومان –global وارد کنیم:

$ npm list --global

home/sitepoint/.node_modules_global/lib
├─┬ npm@5.0.2
│ ├── abbrev@1.1.0
│ ├── ansi-regex@2.1.1
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
....................
└─┬ uglify-js@3.0.15
  ├─┬ commander@2.9.0
  │ └── graceful-readlink@1.0.1
  └── source-map@0.5.6

البته می‌توانیم از طریق آرگومان –depth=0 میزان جزئیات هر کدام از پکیج‌ها را کنترل بکنیم.

$ npm list -g --depth=0

/home/sitepoint/.node_modules_global/lib
├── npm@5.0.2
└── uglify-js@3.0.15

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

هر پکیجی را که به صورت همگانی نصب کنید از طریق خط فرمان قابلیت دسترسی پیدا خواهد کرد. برای مثال اگر بخواهیم یک فایل جاوااسکریپتی را با استفاده از پکیج uglifyjs کوچک کنیم کافی‌ست به صورت زیر عمل نماییم:

$ uglifyjs example.js -o example.min.js

نصب پکیج‌ها در حالت محلی

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

$ npm init

package name: (project)

version: (1.0.0)

description: Demo of package.json

entry point: (index.js)

test command:

git repository:

keywords:

author:

license: (ISC)

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

{

  "name": "project",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "author": "",

  "license": "ISC"

}

نکته: اگر دنبال راهی سریع‌تر برای ایجاد این فایل هستید کافی‌ست دستور npm init --y را در ابتدا وارد کنید.

هر کدام از فیلدهای موجود در این فایل بجز scripts و main به خوبی قابل تشخیص و فهم هستند. فیلد main در حال اشاره کردن به فایل جاوااسکریپتی اصلی پروژه است. جایی که زمان اجرای پروژه از آن استفاده می‌کنید. همچنین scripts شامل دستورهایی می‌شود که ممکن است در زمان اجرای پروژه و پکیج‌های مختلف چندین بار اجرا شوند. می‌توانید در ارتباط با این موضوعات در این لینک اطلاعات بیشتری کسب کنید. 

بیایید یک پکیج را به صورت محلی نصب کنیم:

$ npm install underscore

npm notice created a lockfile as package-lock.json. You should commit this file.

npm WARN project@1.0.0 No description

npm WARN project@1.0.0 No repository field.

+ underscore@1.8.3

added 1 package in 0.344s

حال اگر به دایرکتوری پروژه دقت کنید می‌بینید که یک lockfile ایجاد شده است. در ادامه این موضوع را بررسی می‌کنیم. 

اگر به فایل package.json مراجعه بکنید مشاهده خواهید کرد که یک فیلد جدید به نام dependencies همراه با یک موجودیت جدید که نام پکیج ماست اضافه شده است. 

{

  ...

  "dependencies": {

    "underscore": "^1.8.3"

  }

}

مدیریت dependencies با package.json

همانطور که مشاهده می‌کنید ما Undrescore را به عنوان یک پکیج محلی در اختیار داریم. همچنین در مقابل نام پکیج، نسخه آن که ۱.۸.۳ باشد را می‌توان مشاهده کرد. منظور از علامت ^ این است که هرگاه این پکیج در جای دیگری نصب شد، آخرین نسخه آن را نصب کند. البته این نسخه باید سازگاری کامل را با پروژه داشته باشد به همین دلیل محدوده آن از ۱.۸.۳ تا نسخه ۲ تعریف می‌شود. برای اطلاعات بیشتر در ارتباط با این موضوع می‌توانید این مطلب را مطالعه کنید.

قبل از اینکه این قسمت از مطلب را به پایان برسانیم، بیایید یک بار کارکرد این پکیج را بررسی کنیم. یک فایل با نام test.js را در مسیر اصلی پروژه ایجاد کنید و قطعه کد زیر را در آن قرار دهید:

const _ = require('underscore');

console.log(_.range(5));

حال فایل را با استفاده از دستور node test.js اجرا کنید. با انجام این کار باید خروجی [0, 1, 2, 3, 4] را مشاهده نمایید.

حذف یک پکیج محلی

npm همچنان این قابلیت را به ما می‌دهد تا بتوانیم یک پکیج محلی را از پروژه حذف کنیم. برای مثال اگر بخواهیم Undrescore را حذف کنیم کافی‌ست از دستور uninstall استفاده نماییم:

$ npm uninstall underscore

removed 2 packages in 0.107s

$ npm list

project@1.0.0 /home/sitepoint/project

└── (empty)

نصب یک نسخه ویژه از پکیج‌

زمانی که یک پکیج را نصب می‌کنید، به صورت پیشفرض آخرین نسخه از آن نصب خواهد شد. برای مثال در فرایند نصب underscore نسخه ۱.۸.۳ نصب شد. اما اگر بخواهیم یک نسخه ویژه برای مثال ۱.۸.۲ را نصب کنیم باید به صورت زیر عمل نماییم:

$ npm install underscore@1.8.2

+ underscore@1.8.2

added 1 package in 1.574s

$ npm list

project@1.0.0 /home/sitepoint/project

└── underscore@1.8.2

بروزرسانی یک پکیج‌

با استفاده از دستور outdated می‌توانیم از وجود بروزرسانی برای یک پکیج مطلع شویم:

$ npm outdated

Package     Current  Wanted  Latest  Location

underscore    1.8.2   1.8.3   1.8.3  project

ستون Current نسخه کنونی پکیج را به ما نشان می‌دهد. Latest به ما آخرین نسخه موجود از پکیج را معرفی می‌کند و Wanted نشانگر آخرین نسخه‌ای است که بروزرسانی به آن موجب اشکال در پروژه نمی‌شود. 

فایل package-lock.json را به یاد می‌آورید؟ این فایل در npm نسخه ۵ معرفی شد. در واقع این فایل اطمینان آن را می‌دهد که پکیج‌ها روی هر سیستمی که برنامه در آن قرار بگیرد از یک نسخه پیروی می‌کنند. 

حال اگر بخواهیم پکیج مورد نظرمان را بروزرسانی کنیم نیاز است که از دستور update استفاده نماییم:

$ npm update underscore

+ underscore@1.8.3

updated 1 package in 0.236s

$ npm list

project@1.0.0 /home/sitepoint/project

└── underscore@1.8.3

جستجو برای پکیج‌ها

برای آنکه بتوانیم در بین پکیج‌ها عملیات جستجو را انجام دهیم، کافی‌ست به صورت زیر عمل کنید:

$ npm search mkdir

NAME      | DESCRIPTION          | AUTHOR          | DATE       | VERSION

mkdir     | Directory crea…      | =joehewitt      | 2012-04-17 | 0.0.2

fs-extra  | fs-extra conta…      | =jprichardson…  | 2017-05-04 | 3.0.1

mkdirp    | Recursively mkdir,…  | =substack       | 2015-05-14 | 0.5.1

…

برای مثال من پکیج mkdirp را پیدا کردم. حال اگر بخواهم آن را نصب بکنم کافی‌ست از دستور install بهره بگیرم:

$ npm install mkdirp

+ mkdirp@0.5.1

added 2 packages in 3.357s

حال یک فایل mkdir.js ایجاد کنید و کدهای زیر را در آن قرار دهید:

const mkdirp = require('mkdirp');

mkdirp('foo', function (err) {

  if (err) console.error(err)

  else console.log('Directory created!')

});

در نهایت آن را اجرا کنید:

$ node mkdir.js

Directory created!

مدیریت کش

وقتی که یکبار پکیجی را نصب می‌کنید، npm یک نسخه از آن را روی سیستم شما کش می‌کند. بنابراین اگر بار دیگری خواستید یک پکیج را که قبلا نصب کرده‌اید نصب کنید npm بدون استفاده از شبکه پکیج را برای شما نصب می‌کند. این کپی‌ها در دایرکتوری .npm در مسیر home کش می‌شوند:

$ ls ~/.npm

anonymous-cli-metrics.json  _cacache  _locks  npm  registry.npmjs.org

برای آنکه کش npm را پاک کنید کافی‌ست از دستور cache clean استفاده نمایید:

$ npm cache clean

همچنین می‌توانید تمام node_moduleهای فضای کاری‌تان را پاک کنید:

find . -name "node_modules" -type d -exec rm -rf '{}' +

مخفف‌ها

برای برخی از دستورهای موجود در npm که استفاده زیاد دارند یکسری مخفف و میانبر در نظر گرفته شده است که می‌توانید لیستی از چند مورد آن را در زیر مشاهده نمایید:

npm i <package> – install local package

npm i -g <package> – install global package

npm un <package> – uninstall local package

npm up – npm update packages

npm t – run tests

npm ls – list installed modules

در پایان

در این مطلب من سعی کردم تا مبانی و مقدماتی که برای کار با npm لازم دارید را بگویم. در این مطلب شیوه نصب نودجی‌اس و npm گفته شد. همچنین حالت‌های مختلف نصب یک پکیج را بررسی کردیم، با package-lock.json و package.json آشنا شدیم و… .

منبع

مقالات پیشنهادی

آشنایی مقدماتی با زبان برنامه‌نویسی روبی

روبی یک زبان برنامه‌نویسی شئ‌گرا چند منظوره است که توسط Yukihiro Matsumoto -توسعه‌دهنده ژاپنی- توسعه داده شد. این زبان برنامه‌نویسی به خوبی می‌تواند ر...

آشنایی با ساختار اپلیکیشن Ember.js

در مقاله های پیش به معرفی Ember.js پرداختیم. اینبار می خواهیم با ساختار Ember.js آشنا بشیم و یک اپلیکیشن ساده با اون بسازیم. 

هر چه که باید درباره JAMstack بدانید

وقتی که بحث توسعه وب در میان است، انواع مختلفی از Stackهای توسعه وجود دارند؛ استک LAMP، استک MEAN و استک MERN. با تکامل توسعه وب مدرن، مورد جدیدی به ع...

بازاریابی محتوای موبایلی

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