وقتی با جاوااسکریپت یا Node.js کار میکنیم، احتمالاً با npm یا Node Package Manager برخورد کردهایم. این ابزار اصلی برای مدیریت پکیجها، نصب وابستگیها و بهروز نگه داشتن پروژه ما با کتابخانههای موردنیازش است. اما در کنار آن، ابزاری به نام npx نیز وجود دارد که همراه با npm ارائه میشود و معمولاً این سؤال را ایجاد میکند: تفاوت این دو چیست؟
در نگاه اول، هر دو ابزار npm و npx به ما کمک میکنند تا با پکیجهای Node.js تعامل داشته باشیم، اما این دو اهداف متفاوتی دارند. در این مقاله، تفاوتهای کلیدی بین npm و npx را بررسی میکنیم، نحوه عملکرد آنها را توضیح میدهیم و به این موضوع میپردازیم که چه زمانی باید از هر کدام استفاده کنیم.
npm مخفف Node Package Manager است و دقیقاً همان کاری را انجام میدهد که از اسمش پیداست: مدیریت پکیجهای Node.js. هر زمانی که به یک «پکیج» جدید برای پروژه خود نیاز داشته باشیم، به npm مراجعه میکنیم تا آن را نصب نماییم. این پکیجها میتوانند شامل توابع کوچک یا فریمورکها و کتابخانههای کامل باشند.
اما npm فقط برای نصب کتابخانهها نیست. این ابزار در مدیریت وابستگیهای پروژه و اسکریپتها هم عالی عمل میکند. اگر بخواهیم نسخههای خاصی از یک کتابخانه را قفل کنیم تا از مشکلات ناشی از تغییرات ناسازگار جلوگیری نماییم، npm این کار را برایمان انجام میدهد. همچنین به ما این امکان را میدهد تا اسکریپتهایی را در فایل package.json
تعریف نماییم تا وظایف متداول مثل تست یا ساخت پروژه را automate کنیم.
اگر 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 در نسخه ۵٫۲٫۰ npm معرفی شد. در حالی که npm بیشتر روی نصب و مدیریت پکیجها تمرکز دارد، npx برای اجرای پکیجها طراحی شده است.
میتوانیم npx را به عنوان یک ابزار سریع برای اجرای دستورات در نظر بگیریم. این ابزار به ما اجازه میدهد تا پکیجهای Node.js را بدون نیاز به نصب، اجرا کنیم. npx زمانی مفید است که بخواهیم یک پکیج را فقط یک بار استفاده کرده یا آن را تست کنیم، بدون اینکه بهطور دائمی روی سیستم ما نصب شود.
پیش از npx، اگر میخواستیم از یک ابزار command-line در یک پکیج استفاده کنیم، ابتدا باید آن را به صورت سراسری نصب میکردیم. اما npx اکنون این فرآیند را ساده کرده و به ما این امکان را میدهد تا بدون این که نیاز باشد تا ابزار مورد نظر خود را به صورت سراسری نصب کنیم، آن را مستقیماً از رجیستری npm اجرا نماییم.
هنگامی که یک دستور را با 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 میتواند آن را بدون نیاز به مشخص کردن مسیر کامل node_modules
اجرا کند. برای مثال، اگر Jest را برای تست به صورت لوکال نصب کرده باشیم، میتوانیم آن را با npx به این صورت اجرا کنیم:
npx jest
npx به طور خودکار پکیج را در پوشه لوکال node_modules
پیدا کرده و اجرا میکند؛ که این کار باعث صرفهجویی در زمان و کاهش مشکلات میشود.
ویژگی جالب npx توانایی آن در تشخیص خودکار پکیج یا دستوری است که میخواهیم اجرا کنیم. این ابزار برای اجرای هر دستور سه مرحله زیر را طی میکند:
node_modules
پروژه ما را بررسی میکند. اگر پکیج را پیدا کند، آن را از اینجا اجرا میکند.به طور پیشفرض، npx آخرین نسخه موجود از یک پکیج را اجرا میکند. اما اگر به نسخه خاصی نیاز داریم، میتوانیم مشخص کنیم که کدام نسخه اجرا شود. به عنوان مثال:
npx <package-name>@<version>
این انعطافپذیری و سرعت، npx را به ابزاری قدرتمند و ضروری در اکوسیستم Node.js تبدیل کرده است.
node_modules
یا مسیرهای نصب سراسری).npm install <package>
npx <package>
package.json
برای ایجاد اسکریپتهای سفارشی دارد.package.json
برای اجرای دستورات ندارد.create-react-app
) ایدهآل است.به طور کلی، انتخاب بین npm و npx به وظیفهای که داریم و نیازهای پروژهمان بستگی دارد.
package.json
لیست میشوند و این امکان را فراهم میکنند که کنترل کاملی روی نسخهها و هماهنگی وابستگیها در پروژه خود داشته باشیم. همچنین، npm ابزار اصلی برای اجرای اسکریپتهای تعریف شده در package.json
است و برای وظایفی مثل build کردن، تست کردن یا اجرای سرور ایدهآل است.create-react-app
برای شروع یک پروژه ریاکت، npx به ما این امکان را میدهد که آن را مستقیما، بدون این که سیستم ما شلوغ شود اجرا نماییم. همچنین برای اجرای پکیجهایی که به صورت لوکال نصب شدهاند، بدون نیاز به نوشتن مسیر کامل، کاربرد دارد و جریان کاری ما را سادهتر میکند.بهطور خلاصه، میتوانیم از npm برای مدیریت بلند مدت وابستگیها و از npx برای وظایف موقتی یا اجرای سریع پکیجها استفاده کنیم.