সবাইকে অভিবাদন!
আমি নিশ্চিত যে আপনি বিভিন্ন প্যাকেজ ম্যানেজার ব্যবহার করে Node.js প্রকল্পগুলি দেখেছেন, যেমন:
আমি নিজে এটি দেখেছি এবং উপরের সমস্তটির সাথে কাজ করেছি, কিন্তু আমার মনে সবসময় একটি প্রশ্ন ছিল - কী লোক/টিমকে এনপিএম- এর পরিবর্তে সুতা বা পিএনপিএম ব্যবহার করতে চালিত করে? পেশাদার কি? কোন কনস আছে?
আচ্ছা… এর খুঁজে বের করা যাক!
আমি তাদের "গতি" এর পরিপ্রেক্ষিতে npm , সুতা এবং pnpm তুলনা করার সিদ্ধান্ত নিয়েছি...
আপনি নীচে 3 টি ব্যবস্থা দেখতে পাবেন:
কোনো ক্যাশে ছাড়াই একটি লক ফাইল তৈরি করুন।
কোনো ক্যাশে ছাড়াই বিদ্যমান লক ফাইল থেকে নির্ভরতা ইনস্টল করুন।
গ্লোবাল ক্যাশ সহ বিদ্যমান লক ফাইল থেকে নির্ভরতা ইনস্টল করুন।
ক্যাশে দুই ধরনের আছে:
গ্লোবাল
সাধারণত ব্যবহারকারীর হোম ডিরেক্টরিতে সংরক্ষণ করা হয় (fe, ~/.yarn/berry/cache
)।
স্থানীয়।
প্রকল্প ডিরেক্টরিতে সংরক্ষিত (fe, <project-dir>/.yarn
)।
যদিও #2 এবং #3 আমার অভিজ্ঞতায় সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে, আমি শুধু ক্ষেত্রেই #1 নিয়েছি (যদিও এটি একটি বিরল ঘটনা)।
আমি বেঞ্চমার্কের উদাহরণ হিসাবে create-react-app থেকে একটি নমুনা প্রকল্প ব্যবহার করেছি।
এটি Node.js ইকোসিস্টেমের জন্য একটি ডিফল্ট প্যাকেজ ম্যানেজার - আর কি বলব? এটি ইনস্টলেশন প্যাকেজের সাথে আসে, তাই আপনি যখন আপনার মেশিনে Node.js ইনস্টল করেন (অথবা আপনি সেখানে Node.js সেট আপ করলে যেকোনো CI প্রদানকারীতে) এটি মূলত ব্যবহারের জন্য প্রস্তুত।
এটি আমার মনে একটি বিশাল "প্রো" - আপনাকে এটি আলাদাভাবে ইনস্টল করার দরকার নেই!
সেখানে অসামান্য কিছুই নেই - এটা শুধু... কাজ করে! এবং আমি বছরের পর বছর ধরে কোনও বড় বাগ দেখিনি - এটি বেশ স্থিতিশীল বলে মনে হয় এবং কাজটি সম্পন্ন করে।
এনপিএম এর বৈশিষ্ট্যগুলি আমি এ পর্যন্ত ব্যবহার করেছি:
npm আপনার প্রোজেক্ট রুটের node_modules
ফোল্ডারে নির্ভরতা সঞ্চয় করে। অনেকটাই অকপট।
ℹ️ package-lock.json
তালিকাভুক্ত প্যাকেজগুলির জন্য রেজিস্ট্রি সম্পর্কে তথ্য সঞ্চয় করে - যদি আপনি একটি একক সুযোগ থেকে প্যাকেজ পেয়ে থাকেন, যেমন @example-company
বিভিন্ন রেজিস্ট্রিতে (উদাহরণস্বরূপ - npm এবং GitHub প্যাকেজগুলি ):
এখন, আসুন দেখি এটি ইনস্টলেশন গতির পরিপ্রেক্ষিতে কীভাবে কাজ করে…
লেগেছেpackage-lock.json
তৈরি করতে এবং কোনো ক্যাশে ছাড়াই নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
npm i
লেগেছেpackage-lock.json
থেকে নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
npm ci
লেগেছেpackage-lock.json
থেকে গ্লোবাল ক্যাশে নির্ভরতা ইনস্টল করার জন্য।
ব্যবহৃত কমান্ড:
npm ci
আমি একটি ওয়ার্কস্পেস তৈরি করতে এবং সম্পূর্ণ ওয়ার্কস্পেসের জন্য একবারে এবং নির্দিষ্ট প্রকল্পগুলির জন্য আলাদাভাবে নির্ভরতা পরিচালনা করতে সক্ষম হয়েছিলাম।
অন্য কথায় - এটি কোনও বাগ/সমস্যা ছাড়াই কাজটি সম্পন্ন করে এবং অফিসিয়াল ডকুমেন্টেশনটি বেশ সহজবোধ্য।
কর্মক্ষেত্র বৈশিষ্ট্য যা আমি এতদিন ব্যবহার করেছি:
সত্যই, আমি সুতার কিছু বৈশিষ্ট্য অনেক চেষ্টা করিনি। আমি বলতে চাচ্ছি, আমি কিছু প্রকল্পে কাজ করার সময় "নির্ভরতা ইনস্টল করার" পরিপ্রেক্ষিতে এটি অনেক ব্যবহার করেছি, এবং এটি বেশ।
সুতা একটি Node.js ইনস্টলারের সাথে আসে না, তাই আপনাকে এটি আলাদাভাবে ইনস্টল করতে হবে। এর মানে হল যে আপনার CI পাইপলাইনে একটি অতিরিক্ত পদক্ষেপ থাকবে - আপনি আপনার প্রকল্প নির্ভরতা ইনস্টল করার আগে আপনাকে সুতা সেট আপ করতে হবে।
নির্ভরতা ইনস্টল করার জন্য সুতার দুটি পদ্ধতি রয়েছে:
“ জিরো ইন্সটল ” (ডিফল্ট) - .yarn
ফোল্ডার তৈরি করে এবং yarn.lock
এবং .pnp.cjs
ফাইলে প্যাকেজ তালিকাভুক্ত করে।
একটি নিয়মিত - npm- এর মতো, নির্ভরতাকে node_modules
এ সঞ্চয় করে এবং yarn.lock
ফাইলে তালিকাভুক্ত করে।
ℹ️ সুতা লক ফাইলগুলি সমস্ত তালিকাভুক্ত প্যাকেজের রেজিস্ট্রি সম্পর্কে তথ্য সংরক্ষণ করে শুধুমাত্র যদি আপনি পুরানো (নিয়মিত) ইনস্টলেশন পদ্ধতি ব্যবহার করেন।
⚠️ মনে রাখবেন যে " জিরো ইন্সটল " স্থানীয় ক্যাশে প্যাকেজগুলি সংরক্ষণ করছে এবং আপনার লক ফাইলগুলির লিঙ্ক প্রদান করছে বলে মনে হচ্ছে:
এটি আপনার জন্য গুরুত্বপূর্ণ হতে পারে যদি আপনি একটি Dockerfile বা CI পাইপলাইন পেয়ে থাকেন যেখানে আপনি একটি পরিচ্ছন্ন পরিবেশে নির্ভরতা ইনস্টল করেন এবং তারপর এটিকে অন্যটিতে সরাতে চান (আপনাকে .yarn
ফোল্ডার এবং স্থানীয় ক্যাশে উভয়ই কপি করতে হবে)।
যেহেতু সুতার জন্য ডিফল্ট পদ্ধতি এখন " জিরো ইন্সটল " এবং পুরানো পদ্ধতির চেয়ে ভাল পারফরম্যান্স রয়েছে - আমরা শুধুমাত্র এই পদ্ধতির সাথে বেঞ্চমার্ক রেকর্ড করতে যাচ্ছি।
লেগেছেyarn.lock
ফাইল তৈরি করতে এবং ক্যাশে ছাড়াই নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
yarn install
লেগেছে
ব্যবহৃত কমান্ড:
yarn install --frozen-lockfile
লেগেছে
ব্যবহৃত কমান্ড:
yarn install --frozen-lockfile
আমি একটি ওয়ার্কস্পেস তৈরি করতে এবং সমস্ত প্রকল্পের জন্য এবং আলাদাভাবে নির্দিষ্ট প্রকল্পগুলির জন্য নির্ভরতা পরিচালনা করতে সক্ষম হয়েছিলাম।
কর্মক্ষেত্র বৈশিষ্ট্য যা আমি এতদিন ব্যবহার করেছি:
ডকুমেন্টেশন ঠিক আছে, কিন্তু কমান্ডের নাম এবং পতাকাগুলি কিছুটা বিভ্রান্তিকর।
উদাহরণস্বরূপ, রুট ( . ) এবং নেস্টেড b2b
প্রোজেক্টে test
স্ক্রিপ্ট চালানোর জন্য আমাকে অবশ্যই এটি চালাতে হবে:
yarn workspaces foreach -A --include '{.,b2b}' run test
এনপিএম এর সাথে তুলনা করে:
npm run test --workspace=b2b --include-workspace-root
pnpm বর্তমানে হাইপে রয়েছে - অনেক কোম্পানি এবং ওপেন সোর্স প্রকল্প এটি ব্যবহার করে ।
সুতার মতো - pnpm একটি Node.js ইনস্টলারের সাথে আসে না, তাই আপনাকে এটি আলাদাভাবে ইনস্টল করতে হবে। এর মানে হল যে আপনার CI পাইপলাইনে একটি অতিরিক্ত পদক্ষেপ থাকবে - আপনি আপনার প্রকল্প নির্ভরতা ইনস্টল করার আগে আপনাকে pnpm সেট আপ করতে হবে।
পিএনপিএমকে " দ্রুত, ডিস্ক স্পেস দক্ষ প্যাকেজ ম্যানেজার " হিসাবে বিবেচনা করা হয় …
প্রকৃতপক্ষে, স্থানীয়ভাবে নির্ভরতা পরিচালনার ক্ষেত্রে আমি "ডিস্ক স্পেস দক্ষ" বিবৃতির সাথে একমত।
ডিফল্টরূপে, pnpm ভাগ করা নির্ভরতা ডি-ডুপ্লিকেট করে। pnpm প্যাকেজগুলির জন্য সিমলিঙ্ক তৈরি করে যেগুলি একাধিক নির্ভরতায় ব্যবহৃত হয়। অর্থাৎ, যদি প্যাকেজ a
এবং b
প্যাকেজ c
ব্যবহার করে একটি নির্ভরতা হিসাবে - pnpm প্যাকেজ c
একটি একক অনুলিপি হিসাবে সংরক্ষণ করবে এবং প্যাকেজ a
এবং b
এর জন্য সিমলিংক তৈরি করবে। এইভাবে, প্যাকেজ ম্যানেজার হার্ড কপি তৈরি করে না এবং আপনার SSD/HDD-এ মেমরি সংরক্ষণ করে।
ℹ️ pnpm-lock.yaml
তালিকাভুক্ত প্যাকেজের রেজিস্ট্রি সম্পর্কে তথ্য সংরক্ষণ করে না।
⚠️ মনে রাখবেন যে pnpm কখনও কখনও এটিকে একটি প্রকল্প রাখার পরিবর্তে গ্লোবাল ক্যাশে নির্ভরতা সঞ্চয় করে।
লেগেছেpnpm-lock.yaml
তৈরি করতে এবং কোনো ক্যাশে ছাড়াই নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
pnpm install
লেগেছেpnpm-lock.yaml
থেকে নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
pnpm i --frozen-lockfile
লেগেছেpnpm-lock.yaml
থেকে নির্ভরতা ইনস্টল করতে।
ব্যবহৃত কমান্ড:
pnpm i --frozen-lockfile
এখন, সেখানেই জিনিসগুলি সত্যিই আকর্ষণীয় হয়ে উঠেছে...
pnpm এর অনেকগুলি কনফিগারেশন বিকল্প রয়েছে, তবে কিছু মূল কার্যকারিতা কেবল কাজ করে না!
আসুন কয়েকটি বাগ পর্যালোচনা করি যা আমি সম্মুখীন করেছি:
শুধুমাত্র নির্দিষ্ট প্রকল্পগুলির জন্য নির্ভরতা ইনস্টল করতে সক্ষম হওয়া গুরুত্বপূর্ণ -- আপনি যখন কর্মক্ষেত্রের মধ্যে নির্দিষ্ট প্রকল্পগুলির সাথে সম্পর্কিত পাইপলাইন তৈরি করেন তখন এটি মনোরেপোসের জন্য বেশ কার্যকর।
অর্থাৎ, কল্পনা করুন আপনি আপনার কর্মক্ষেত্রে পেয়েছেন:
এগুলি সমস্তই আলাদা npm প্রকল্প, কিন্তু এগুলি একই রেপো ☝️ এর অংশ৷
এখন, আপনি শুধুমাত্র এন্ড-টু-এন্ড পরীক্ষা চালানোর জন্য একটি পাইপলাইন চান। সুতরাং, আপনার শুধুমাত্র শেষ থেকে শেষ পরীক্ষা নির্ভরতা প্রয়োজন, তাই না?
ঠিক আছে, আপনি এটি করতে সক্ষম হবেন না - পিএনপিএম আপনাকে পুরো ওয়ার্কস্পেসের জন্য নির্ভরতা ইনস্টল করতে বাধ্য করছে!
pnpm install --filter <project-name>
শুধুমাত্র নির্বাচিত প্রকল্পগুলির জন্য নির্ভরতা ইনস্টল করার কথা ছিল, কিন্তু এটি কাজ করে না।
একটি বছর পুরানো বাগ আছে এবং এটি সম্প্রতি একটি অ-কাজ করা ফিক্স দিয়ে বন্ধ করা হয়েছে।
আপনি যখন pnpm install
চালান তখন pnpm সম্পূর্ণ ওয়ার্কস্পেসের (সমস্ত প্রকল্প) জন্য ডিফল্টভাবে নির্ভরতা ইনস্টল করে
আপনি যদি আপনার ওয়ার্কস্পেস রুটে .npmrc
এ recursive-install=false
সেট করেন তাহলে আপনি এই আচরণটি বিকল্প করতে পারেন।
কিন্তু এটি আরেকটি বাগ প্রবর্তন করে যা ইতিমধ্যেই প্রায় 2 বছর পুরানো ৷
ডিফল্টরূপে pnpm একটি একক লক ফাইলে ( npm এবং yarn এর মতো) নির্ভরতা তালিকা সংরক্ষণ করে।
আপনি যদি আপনার ওয়ার্কস্পেস রুটে .npmrc
এ shared-workspace-lockfile=false
সেট করেন তাহলে আপনি এই আচরণটিও বিকল্প করতে পারেন।
এটি আমাদের ওয়ার্কস্পেস বৈশিষ্ট্যটি রাখতে এবং একটি নির্দিষ্ট প্রকল্পের জন্য নির্ভরতা ইনস্টল করতে --ignore-workspace
পতাকা ব্যবহার করার অনুমতি দেবে।
যাইহোক, এই সেটিংটি আরও কয়েকটি সমস্যা উপস্থাপন করে:
eslint
এবং tsc --noEmit
আমার গিটহাব অ্যাকশন পাইপলাইনে একটি "জাভাস্ক্রিপ্ট হিপ আউট অফ মেমরি" ত্রুটি নিক্ষেপ করে।
কিছু নির্ভরতা বিশ্বব্যাপী ক্যাশে সংরক্ষণ করা হয় এবং node_modules/.pnpm
এ সিমলিংক করা হয়।
# | npm | সুতা | পিএনপিএম |
---|---|---|---|
একটি লক ফাইল তৈরি করুন | 60 সেকেন্ড | 16.5 সেকেন্ড | 31 সেকেন্ড |
কোনো ক্যাশে ছাড়াই নির্ভরতা ইনস্টল করুন | 18 সেকেন্ড | 11 সেকেন্ড | 8 সেকেন্ড |
বিশ্বব্যাপী ক্যাশে নির্ভরতা ইনস্টল করুন | 8 সেকেন্ড | 8 সেকেন্ড | 5 সেকেন্ড |
উপরের বেঞ্চমার্ক অনুসারে, npm হল সবচেয়ে ধীরগতির প্যাকেজ ম্যানেজার ☝️
যাইহোক, আসুন এই ফলাফলগুলি ব্যাখ্যা করি...
এটি একটি বিরল ঘটনা। সাধারণত, একটি লক ফাইল প্রজেক্ট ইনিশিয়ালাইজেশনে তৈরি করা হয় এবং আপনি যখন প্যাকেজ ইনস্টল/আপডেট করেন তখন প্রসারিত হয়।
এটি মাথায় রেখে - আপনি যখন প্যাকেজ ম্যানেজার চয়ন করেন তখন এটির উপর নির্ভর করা খুব গুরুত্বপূর্ণ বিষয় বলে মনে হয় না।
বেশিরভাগ ক্ষেত্রে, আপনার প্রকল্পগুলি নির্ভরতার একটি নির্দিষ্ট তালিকা রাখে এবং আপনি খুব কমই কিছু যোগ/সরান।
সম্ভবত, আপনি সময়ে সময়ে আপনার প্যাকেজগুলির সংস্করণগুলিকে বাম্প করবেন - এই পরিবর্তনগুলি ছোট এবং আপনি ক্যাশে থেকে বাকি প্যাকেজগুলি পুনরায় ব্যবহার করবেন৷
অন্য কথায়, সাধারণ ব্যবহারের ক্ষেত্রে হল -- প্যাকেজ রেজিস্ট্রি থেকে নতুন প্যাকেজ আনুন এবং বাকিগুলি ক্যাশে থেকে নিন।
পিএনপিএম (5-8 সেকেন্ড) মাঝখানে সুতা (8-11 সেকেন্ড) সহ npm (8-18 সেকেন্ড) থেকে প্রায় দ্বিগুণ দ্রুত।
আমি মনে করি পিএনপিএম সর্বোত্তম কাজ করে যদি প্যাকেজ ম্যানেজারের জন্য আপনার প্রয়োজনীয়তা "শুধুমাত্র নির্ভরতা ইনস্টল" এর মতো সহজ হয়।
যদিও pnpm একটি Node.js ইনস্টলার আউট-অফ-এ-বক্সের সাথে আসে না, কোরপ্যাক বা বিদ্যমান অ্যাকশন সহ CI পাইপলাইনে সেট আপ করা সহজ।
আমি npm পছন্দ করি, কারণ:
package-lock.json
এ প্যাকেজ রেজিস্ট্রিগুলি সঞ্চয় করে যাতে আপনি বিভিন্ন রেজিস্ট্রি থেকে একক সুযোগের সাথে নির্ভরতা ইনস্টল করতে সক্ষম হন।
এই সুবিধাগুলি সেকেন্ডের গতি এবং ডিস্কের স্থানকে ছাড়িয়ে যায় যা আমি সুতা বা pnpm দিয়ে সংরক্ষণ করব।
প্যাকেজ ম্যানেজার নির্বাচন করার জন্য আপনার মানদণ্ড কি? লাজুক হবেন না, এবং নীচের মন্তব্য বিভাগে আপনার চিন্তা আমাকে জানান! 👇😊