Yarn, Npm থেকে PNPM: আমার ডেভেলপমেন্ট লাইফের গেম চেঞ্জার!

🚀 Yarn থেকে PNPM: ডেভেলপমেন্ট লাইফের গেম চেঞ্জার!
হ্যালো ডেভ 👋,
আজ আপনাদের সাথে শেয়ার করতে চাই আমার React Native & Next.js প্রজেক্টে npm থেকে pnpm-এ মাইগ্রেশনের অভিজ্ঞতা। সম্প্রতি প্রজেক্টের node_modules
এর সাইজ একটু বেড়ে গিয়ে ছিল - প্রায় ৬ গিগাবাইট!
একটি মিডিয়াম সাইজের অ্যাপের জন্য এত স্পেস?
কোনো একসময় পড়েছিলাম pnpm ক্যাশিং এবং সিমলিংক ব্যবহার করে, কিন্তু পুরোপুরি pnpm-এ মাইগ্রেট করতে সময় হয়ে উঠছিল না। তবে পরে pnpm-এর হার্ড লিংকিং এবং সিমলিংক (Symbolic Link) ব্যবস্থাপনা নিয়ে বিস্তারিত রিসার্চ করলাম। এটি গ্লোবালি প্যাকেজ স্টোর করে এবং প্রজেক্টে সিমলিংকের মাধ্যমে ব্যবহার করে, যা স্পেস এবং ইনস্টলেশনের সময় উভয়ই কমিয়ে আনে।
🔥 মাইগ্রেশন:
- প্রথমে সব
node_modules
ডিলেট (rm -rf node_modules
) - PNPM ইনস্টল (
npm install -g pnpm
) - নতুন করে ডিপেন্ডেন্সি ইনস্টল (
pnpm install
)
🚀 PNPM এর মূল ধারণা:
- গ্লোবাল স্টোর: সমস্ত প্যাকেজের একটি কপি গ্লোবাল স্টোরে থাকে।
- হার্ড লিংক: প্রজেক্টে প্যাকেজের আলাদা কপি না করে গ্লোবাল স্টোর থেকে হার্ড লিংক তৈরি করে।
- সিমলিংক:
node_modules
ফোল্ডারে প্যাকেজ রিজলিউশন স্ট্রাকচার তৈরি করে, যা প্রকৃত ফাইলগুলোকে পয়েন্ট করে।
✅ সুবিধা:
- দ্রুত ইনস্টলেশন
- স্মার্ট ক্যাশিং সিস্টেম
- কম স্টোরেজ ব্যবহার
- সহজ সংস্করণ নিয়ন্ত্রণ
- গ্লোবাল স্টোর: সব প্রজেক্টে একই প্যাকেজের শুধু একটি কপি রাখে
- হার্ড লিংক: প্রতিটি প্রজেক্টে আলাদা কপি না করে লিংক তৈরি করে
- সিমলিংক:
node_modules
ফোল্ডারে একটি ভার্চুয়াল স্ট্রাকচার তৈরি করে, প্রতিটি প্যাকেজ.pnpm
ফোল্ডারে অবস্থিত হার্ড-লিংকড ফাইলকে পয়েন্ট করে - সিকিউরিটি: ফ্যান্টম ডিপেন্ডেন্সি প্রবলেম ফিক্স করে
👻 ফ্যান্টম ডিপেন্ডেন্সি (Phantom Dependency)
Phantom Dependency মানে এমন একটি প্যাকেজ যা আপনার প্রজেক্টের package.json
-এ নেই, কিন্তু অন্য কোনো প্যাকেজের ডিপেন্ডেন্সি হিসেবে node_modules
-এ চলে এসেছে।
ফলে আপনি সেটা সরাসরি import
বা use
করতে পারেন, যদিও আপনি নিজে তা ইনস্টল করেননি।
🧨 সমস্যা কী?
যদি ভবিষ্যতে সেই ডিপেন্ডেন্সি প্যাকেজটি সরিয়ে দেওয়া হয় বা আপডেট করা হয়, যেটা ওই ফ্যান্টম প্যাকেজের ওপর নির্ভর করছিল, তাহলে আপনার অ্যাপ ব্রেক করে যেতে পারে। কারণ আপনি তো সরাসরি ইনস্টল করেননি, কিন্তু কোডে ব্যবহার করেছেন।
✅ pnpm
এই প্রবলেম ফিক্স করে — আপনি শুধু যা ইনস্টল করেছেন, সেটাই ব্যবহার করতে পারবেন।

এখানে শুধু ইনস্টল করা প্যাকেজ ই আছে এবং সব গুলো প্যাকেজ সিমলিংক করা আছে .pnpm ডিরেক্টরি তে।
🚀 কিভাবে শুরু করবেন?
npm install -g pnpm
pnpm install
🗂️ Stored Package Directory:
pnpm store path
# Example: /home/rasel/.local/share/pnpm/store/v10
🔧 PNPM কমান্ড সমূহ:
pnpm init # নতুন প্রজেক্ট শুরু
pnpm add react # রিয়্যাক্ট ইনস্টল
pnpm add -D typescript # টাইপস্ক্রিপ্ট devDependency হিসেবে
pnpm run dev # স্ক্রিপ্ট চালানো
আরও কমান্ড 👇
pnpm install --frozen-lockfile # lockfile না বদলে আগের মতোই ইনস্টল করে
pnpm add lodash # প্রডাকশন ডিপেন্ডেন্সি হিসেবে lodash যোগ
pnpm add -D eslint # ডেভেলপমেন্ট ডিপেন্ডেন্সি হিসেবে eslint যোগ
pnpm remove lodash # lodash রিমুভ করে
pnpm update # সব প্যাকেজ আপডেট করে
pnpm update react # শুধু react আপডেট করে
pnpm list # সব ইন্সটলড প্যাকেজ দেখায়
pnpm list -r # recursive ভাবে দেখায়
pnpm why <pkg> # কোন প্যাকেজ কার মাধ্যমে এসেছে, তা ট্রেস করে
pnpm outdated # পুরানো প্যাকেজ লিস্ট করে
pnpm run build # build স্ক্রিপ্ট চালায়
pnpm run lint # lint স্ক্রিপ্ট চালায়
pnpm exec eslint src/ # সরাসরি eslint চালায়
pnpm env use --global 18 # নির্দিষ্ট Node.js ভার্সন global এ সেট করে
pnpm store prune # অপ্রয়োজনীয় ক্যাশ ক্লিন করে
pnpm dlx create-next-app # একবারের জন্য কমান্ড চালিয়ে প্যাকেজ রান করে
কেউ কি PNPM ইউজ করছেন? নাকি এখনও Yarn/npm এ আটকে আছেন?
Original Source: https://dev.to/raselmahmuddev/yarn-npm-theke-pnpm-aamaar-ddebhelpmentt-laaipher-gem-cenyjaar-1h50