جستجو، مدیریت کش، بازنصب وابستگی‌ها و موارد تکمیلی کار با npm

درسنامه درس 4 از سری آموزش npm
جست و جو، مدیریت کش، بازنصب وابستگی ها و موارد تکمیلی کار با npm

با سلام خدمت شما همراهان گرامی روکسو! به آخرین قسمت از سری آموزش npm برای تازه کارها خوش آمدید، امیدوارم تا این قسمت ما را همراهی کرده باشید.

جستجوی پکیج ها

ما در این سری آموزشی چند بار از دستور mkdir استفاده کرده ایم. آیا پکیج دیگری هم بوده است که چنین کاری را انجام دهد؟ برای پیدا کردن این پکیج باید از npm search استفاده کنیم:

$ npm search mkdir
NAME      | DESCRIPTION          | AUTHOR          | DATE       | VERSION
mkdir     | Directory creation…  | =joehewitt      | 2012-04-17 | 0.0.2
fs-extra  | fs-extra contains…   | =jprichardson…  | 2018-11-07 | 7.0.1
make-dir  | Make a directory…    | =sindresorhus   | 2019-04-01 | 3.0.0
...

بله mkdirp موجود است! بیایید آن را نصب کنیم:

$ 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 install request
+ request@2.88.0
added 48 packages from 59 contributors and audited 65 packages in 2.73s
found 0 vulnerabilities

سپس package.json را چک می کنیم:

"dependencies": {
   "mkdirp": "^0.5.1",
   "request": "^2.88.0",
   "underscore": "^1.9.1"
},

توجه داشته باشید که لیست وابستگی ها به صورت خودکار به روز رسانی شد! در نسخه های قدیمی npm باید با استفاده ازدستور npm install request --save وابستگی ها را در package.json ذخیره می کردید اما دیگر نیازی به این کار نیست. همچنین اگر می خواهید پکیجی را بدون ذخیره شدن در package.json نصب کنید از دستور no-save-- استفاده کنید.

حالا فرض کنید کد پروژه ی خود را روی یک دستگاه دیگر clone (کپی) کرده اید و می خواهید وابستگی ها را نصب کنید. ابتدا پوشه ی node_modules را حذف کرده و سپس دستور npm install را اجرا می کنیم:

$ rm -R node-modules
$ npm list
project@1.0.0 /home/sitepoint/project
├── UNMET DEPENDENCY mkdirp@^0.5.1
├── UNMET DEPENDENCY request@^2.88.0
└── UNMET DEPENDENCY underscore@^1.9.1

npm ERR! missing: mkdirp@^0.5.1, required by project@1.0.0
npm ERR! missing: request@^2.88.0, required by project@1.0.0
npm ERR! missing: underscore@^1.9.1, required by project@1.0.0

$ npm install
added 51 packages from 60 contributors and audited 66 packages in 2.419s
found 0 vulnerabilities

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

مدیریت کش (cache)

زمانی که npm پکیجی را دانلود می کند یک کپی از آن می گیرد و در گوشه ای نگهداری می کند تا دفعه ی بعد که نیاز به نصب آن داشتید مجبور نباشید به اینترنت/شبکه متصل شوید. این نسخه های کپی در دیرکتوری npm. در home path (آدرس اصلی) قرار دارند.

$ ls ~/.npm
anonymous-cli-metrics.json  _cacache  index-v5  _locks  _logs  node-sass

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

$ npm cache clean --force

همچنین در صورتی که روی سیستم خود چندین پروژه ی node دارید و می خواهید حذفشان کنید می توانید تمام پوشه های node_module را حذف کنید:

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

حسابرسی

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

$ npm install express@4.8.0

 express@4.8.0
added 36 packages from 24 contributors and audited 123 packages in 15.97s
found 21 vulnerabilities (8 low, 9 moderate, 4 high)
  run `npm audit fix` to fix them, or `npm audit` for details

به محض نصب چندین گزارش از آسیب پذیری های مختلف دریافت می کنیم. برای نمایش جزئیات بیشتر باید دستور npm audit را اجرا کنیم:

$ npm run audit

 === npm audit security report ===

# Run npm install express@4.16.4  to resolve 21 vulnerabilities
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High          │ Regular Expression Denial of Service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ negotiator                                                   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express                                                      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ express > accepts > negotiator                               │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/106                       │
└───────────────┴──────────────────────────────────────────────────────────────┘


┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Timing Attack                                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ cookie-signature                                             │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express                                                      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ express > cookie-signature                                   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/134                       │
└───────────────┴──────────────────────────────────────────────────────────────┘

همانطور که می بینید لیست بلند و بالایی از پکیج ها را می بینیم که دارای آسیب پذیری امنیتی هستند.

اگر به فیلد Path نگاه کنید، مسیری را به شما نشان می دهد که وابستگی در آن قرار دارد. به طور مثال مسیر express > accepts > negotiator یعنی Express برای اجرا شدن نیاز به پکیج Accepts دارد. همچنین پکیج Accepts برای کار کردن به negotiator وابستگی دارد و همین پکیج است که دارای آسیب پذیری است.

دو راه برای حل این مشکلات وجود دارد؛ یا می توانیم دستور npm install express@4.16.4 و یا npm audit fix را اجرا کنیم. ما می خواهیم از روش دوم استفاده کنیم:

$ npm audit fix

+ express@4.16.4
added 15 packages from 11 contributors, removed 8 packages and updated 28 packages in 5.302s
fixed 21 of 21 vulnerabilities in 123 scanned packages

از گزارش بالا مشخص می شود که تمام آسیب پذیری ها حل شده اند. در واقع دستور npm audit fix پکیج های مورد نظر را به آخرین نسخه به روز رسانی کرد. البته حواستان باشد که تمام آسیب پذیری ها به صورت خودکار تصحیح شدنی نیستند. به طور مثال اگر پکیجی از پایه به روز رسانی شد به طوری که اگر آن را به روز رسانی کنید کد هایتان خراب بشود. در چنین حالت هایی باید کد را بررسی کرده و به صورت دستی تصحیح کنید.

البته اگر برایتان مهم نیست که پروژه تان خراب می شود و باید قسمت هایی از آن را دوباره باز نویسی کنید، می توانید از دستور npm audit fix --force استفاده کنید. پس از اجرای این دستور، دستور npm audit را نیز اجرا کنید تا مطمئن شوید تمام مشکلات برطرف شده اند.

alias ها

alias در لغت به معنی «نام مستعار» یا نامی است که به جای دیگری استفاده شود. حتما متوجه شده اید که در npm چندین روش برای اجرای یک دستور وجود دارد، به این دستورات که به جای هم استفاده می شوند alias می گوییم.

  • <npm i <package - نصب پکیج ها به صورت محلی
  • <npm i -g </package><package - نصب پکیج های سراسری
  • <npm un </package><package - حذف پکیج های محلی
  • npm up - به روز رسانی پکیج ها
  • npm t - اجرای تست ها
  • npm ls - لیست ماژول های نصب شده
  • npm ll یا npm la - نمایش اطلاعات اضافی در مورد پکیج ها و لیست ماژول ها

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

$ npm i express momemt lodash mongoose body-parser webpack

نکته: اگر دوست دارید با تمام دستورات npm آشنا شوید دستور npm help را اجرا کنید.

نکته: ابزارهایی وجود دارند که به شما اجازه می دهند چندین نسخه از Node.js را در یک سیستم داشته باشید؛ ابزار n و ابزار nvm (مخفف Node Version Manager) و ابزار nvm for Windows (مخصوص افرادی که از ویندوز استفاده می کنند).

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

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش npm توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.