pnpm چیه و چرا از npm بهتره؟
خلاصهٔ کاملتر
اگه تا حالا روی چند پروژه جاوااسکریپتی بهصورت همزمان کار کرده باشی، احتمالاً متوجه شدی که پوشه node_modules چقدر فضا میخوره. npm برای هر پروژه یه نسخه جداگانه از هر پکیج رو دانلود و ذخیره میکنه. یعنی اگه ۱۰۰ تا پروژه داشته باشی که همه از یه کتابخونه استفاده میکنن، ۱۰۰ نسخه تکراری از اون کتابخونه روی دیسکته!
pnpm (که مخفف Performant npm هست) با یه رویکرد متفاوت این مشکل رو حل میکنه. بهجای کپی کردن فایلها برای هر پروژه، همه پکیجها رو در یه مخزن مرکزی روی دیسک نگه میداره و بعد با استفاده از hard link اونا رو به پروژههای مختلف متصل میکنه. این یعنی فایلها فقط یه بار روی دیسک وجود دارن، ولی همه پروژهها میتونن ازشون استفاده کنن.
یه ویژگی جالب دیگه اینه که pnpm در مدیریت نسخههای مختلف یه پکیج هم هوشمندانه عمل میکنه. مثلاً اگه نسخه جدیدی از یه پکیج فقط در یه فایل از ۱۰۰ فایلش تغییر داشته باشه، pnpm فقط اون یه فایل جدید رو به مخزن اضافه میکنه، نه کل پکیج رو از اول. این یعنی صرفهجویی واقعی و قابلتوجه در فضای دیسک.
از نظر سرعت هم pnpm حرفهای زیادی برای گفتن داره. فرآیند نصب در سه مرحله انجام میشه: اول وابستگیها شناسایی و دریافت میشن، بعد ساختار node_modules محاسبه میشه، و در آخر فایلها با hard link به پروژه متصل میشن. این روش خیلی سریعتر از روش سنتی npm و Yarn عمل میکنه، چون کارها بهصورت موازیتر انجام میشن.
یه تفاوت مهم دیگه pnpm با npm و Yarn Classic اینه که node_modules رو تخت (flat) نمیذاره. در npm و Yarn، همه پکیجها به ریشه node_modules هوشت میشن، یعنی کدت میتونه به پکیجهایی دسترسی داشته باشه که اصلاً توی package.json پروژهات نیستن! این یه باگ بالقوه و یه مشکل امنیتی جدیه.
pnpm این مشکل رو با استفاده از symlink حل میکنه. فقط وابستگیهای مستقیمی که خودت توی package.json تعریف کردی در ریشه node_modules قرار میگیرن و بقیه پکیجها در دسترس مستقیم کد نیستن. این باعث میشه پروژهات تمیزتر، قابلپیشبینیتر و ایمنتر باشه.
البته اگه ابزارهایی داری که با symlink خوب کنار نمیان، نگران نباش. pnpm یه تنظیم به اسم nodeLinker داره که میتونی اون رو روی hoisted بذاری تا رفتاری شبیه به npm داشته باشه. پس همیشه یه راهحل برای موارد خاص هم وجود داره.
نکات کلیدی:
- pnpm وابستگیها رو در یه مخزن مرکزی ذخیره میکنه و با hard link بین پروژهها به اشتراک میذاره
- در مقایسه با npm، فضای دیسک خیلی کمتری مصرف میشه، مخصوصاً وقتی پروژههای زیاد داری
- برای آپدیت پکیجها فقط فایلهای تغییرکرده اضافه میشن، نه کل پکیج
- نصب پکیجها بهطور قابلتوجهی سریعتر از npm و Yarn انجام میشه
- node_modules تخت نیست؛ فقط وابستگیهای مستقیم پروژه در دسترسن و این امنیت و تمیزی کد رو بالا میبره
- برای سازگاری با ابزارهای قدیمیتر میشه حالت hoisted رو فعال کرد




