وقتی با جاوااسکریپت یا Node.js کار می‌کنیم، احتمالاً با npm یا Node Package Manager برخورد کرده‌ایم. این ابزار اصلی برای مدیریت پکیج‌ها، نصب وابستگی‌ها و به‌روز نگه داشتن پروژه ما با کتابخانه‌های موردنیازش است. اما در کنار آن، ابزاری به نام npx نیز وجود دارد که همراه با npm ارائه می‌شود و معمولاً این سؤال را ایجاد می‌کند: تفاوت این دو چیست؟

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

npm چیست؟

npm مخفف Node Package Manager است و دقیقاً همان کاری را انجام می‌دهد که از اسمش پیداست: مدیریت پکیج‌های Node.js. هر زمانی که به یک «پکیج» جدید برای پروژه خود نیاز داشته باشیم، به npm مراجعه می‌کنیم تا آن را نصب نماییم. این پکیج‌ها می‌توانند شامل توابع کوچک یا فریم‌ورک‌ها و کتابخانه‌های کامل باشند.

اما npm فقط برای نصب کتابخانه‌ها نیست. این ابزار در مدیریت وابستگی‌های پروژه و اسکریپت‌ها هم عالی عمل می‌کند. اگر بخواهیم نسخه‌های خاصی از یک کتابخانه را قفل کنیم تا از مشکلات ناشی از تغییرات ناسازگار جلوگیری نماییم، npm این کار را برایمان انجام می‌دهد. همچنین به ما این امکان را می‌دهد تا اسکریپت‌هایی را در فایل package.json تعریف نماییم تا وظایف متداول مثل تست یا ساخت پروژه را automate کنیم.

npm چگونه کار می‌کند؟

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

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

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

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

npm install <package-name>

به عنوان مثال، اگر بخواهیم کتابخانه cowsay را به پروژه خود اضافه کنیم، باید دستور زیر را اجرا نماییم:

npm install cowsay

این دستور کتابخانه «cowsay» را به پروژه ما اضافه می‌کند و امکان استفاده از آن در کد را فراهم می‌آورد. در نصب سراسری، پکیج در کل سیستم قابل دسترسی خواهد بود و می‌توانیم آن را در هر پروژه‌ای استفاده کنیم. این روش برای ابزارهای command-line که می‌خواهیم از هر جا اجرا شوند مناسب می‌باشد.

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

همچنین، npm به ما این امکان را می‌دهد تا اسکریپت‌هایی را در فایل package.json تعریف کنیم. این اسکریپت‌ها برای خودکارسازی وظایفی مانند راه‌اندازی سرور، اجرای تست‌ها یا ساخت پروژه مورد استفاده قرار می‌گیرند. به‌عنوان مثال:

{
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  }
}

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

npx چیست؟

npx در نسخه ۵٫۲٫۰ npm معرفی شد. در حالی که npm بیشتر روی نصب و مدیریت پکیج‌ها تمرکز دارد، npx برای اجرای پکیج‌ها طراحی شده است.

می‌توانیم npx را به عنوان یک ابزار سریع برای اجرای دستورات در نظر بگیریم. این ابزار به ما اجازه می‌دهد تا پکیج‌های Node.js را بدون نیاز به نصب، اجرا کنیم. npx زمانی مفید است که بخواهیم یک پکیج را فقط یک بار استفاده کرده یا آن را تست کنیم، بدون اینکه به‌طور دائمی روی سیستم ما نصب شود.

پیش از npx، اگر می‌خواستیم از یک ابزار command-line در یک پکیج استفاده کنیم، ابتدا باید آن را به صورت سراسری نصب می‌کردیم. اما npx اکنون این فرآیند را ساده کرده و به ما این امکان را می‌دهد تا بدون این که نیاز باشد تا ابزار مورد نظر خود را به صورت سراسری نصب کنیم، آن را مستقیماً از رجیستری npm اجرا نماییم.

npx چگونه کار می‌کند؟

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

برای مثال، فرض کنید می‌خواهیم از create-react-app برای راه‌اندازی یک پروژه جدید React استفاده کنیم. به روش معمول، باید ابتدا آن را به صورت سراسری نصب کنیم:

npm install -g create-react-app

سپس دستور زیر را اجرا کنیم:

create-react-app my-app

اما، با استفاده از npx می‌توانیم از نصب سراسری صرف نظر کرده و مستقیماً آن را اجرا نماییم:

npx create-react-app my-app

این دستور، create-react-app را دانلود کرده، اجرا می‌کند و پس از اتمام کار، آن را حذف می‌نماید. این روش سریع و راحت است و مانع از شلوغ شدن سیستم با پکیج‌های سراسری می‌شود که ممکن است فقط یک بار استفاده شوند.

اجرای پکیج‌های لوکال با npx

اگر یک پکیج را به صورت لوکال در پروژه خود نصب کرده باشیم، npx می‌تواند آن را بدون نیاز به مشخص کردن مسیر کامل node_modules اجرا کند. برای مثال، اگر Jest را برای تست به صورت لوکال نصب کرده باشیم، می‌توانیم آن را با npx به این صورت اجرا کنیم:

npx jest

npx به طور خودکار پکیج را در پوشه لوکال node_modules پیدا کرده و اجرا می‌کند؛ که این کار باعث صرفه‌جویی در زمان و کاهش مشکلات می‌شود.

فرآیند سه مرحله‌ای اجرای دستورات در npx

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

  1. بررسی لوکال: ابتدا پوشه node_modules پروژه ما را بررسی می‌کند. اگر پکیج را پیدا کند، آن را از اینجا اجرا می‌کند.
  2. بررسی سراسری: اگر پکیج به صورت لوکال وجود نداشته باشد، بررسی می‌کند که آیا به ‌صورت سراسری روی سیستم ما نصب شده است یا خیر. اگر نصب شده باشد، از نسخه سراسری آن استفاده می‌کند.
  3. دانلود از رجیستری npm: در صورتی که پکیج را نه به صورت لوکال و نه به صورت سراسری پیدا نکند، آن را از رجیستری npm دانلود کرده، اجرا می‌کند و پس از اتمام کار، آن را حذف می‌نماید.

اجرای نسخه‌های خاص با npx

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

npx <package-name>@<version>

این انعطاف‌پذیری و سرعت، npx را به ابزاری قدرتمند و ضروری در اکوسیستم Node.js تبدیل کرده است.

تفاوت‌های کلیدی بین npm و npx

هدف و عملکرد

نصب بسته‌ها

استفاده موقت

نحوه استفاده

npm install <package>
npx <package>

تنظیم اسکریپت‌ها

اجرای ابزارهای CLI

راه‌اندازی پروژه‌ها

سازگاری با Node.js

جمع‌بندی: چه زمانی باید از npm یا npx استفاده کنیم؟

به طور کلی، انتخاب بین npm و npx به وظیفه‌ای که داریم و نیازهای پروژه‌مان بستگی دارد.

به‌طور خلاصه، می‌توانیم از npm برای مدیریت بلند مدت وابستگی‌ها و از npx برای وظایف موقتی یا اجرای سریع پکیج‌ها استفاده کنیم.