আপনি যখন npm কমান্ড চালান তখন কী ঘটে?

আপনি একটি npm কমান্ডে এন্টার চাপলেন। আপনার প্রজেক্ট বিল্ড হলো। এটি জাদুর মতো মনে হয়।

এটি কোনো জাদু নয়। এটি নেটওয়ার্ক রিকোয়েস্ট, কোড পার্সিং এবং ফাইল অপ্টিমাইজেশনের একটি ধারাবাহিক প্রক্রিয়া।

অন্ধভাবে কমান্ড চালানো বন্ধ করুন। পরিবর্তে এর ইঞ্জিনটি বোঝার চেষ্টা করুন।

আপনি প্রতিদিন যে ৬টি কোর কমান্ড ব্যবহার করেন, সেগুলোর পেছনে আসলে কী ঘটে তা নিচে দেওয়া হলো।

  1. npm install

এই কমান্ডটি আপনার package.json ফাইলটি পড়ে। এটি আপনার টুলগুলোর সঠিক ভার্সন খুঁজে পেতে একটি ক্লাউড রেজিস্ট্রির সাথে যোগাযোগ করে।

  • এটি রেজিস্ট্রি থেকে প্যাকেজ ডাউনলোড করে।
  • এটি node_modules ফোল্ডার তৈরি করে।
  • এটি একটি dependency tree তৈরি করে।
  • এটি সঠিক ভার্সনগুলো রেকর্ড করার জন্য package-lock.json আপডেট করে।
  1. npm run format:check

এটি একটি ভেরিফিকেশন ধাপ। এটি আপনার কোড কোনো পরিবর্তন না করেই আপনার স্টাইল রুলস অনুসরণ করছে কি না তা পরীক্ষা করে।

  • এটি আপনার ফাইলগুলোর একটি ভার্চুয়াল লেআউট তৈরি করে।
  • এটি Prettier-এর মতো রুলসের সাথে আপনার ফাইলগুলোর তুলনা করে।
  • আপনার স্পেসিং বা সিনট্যাক্স ভুল হলে এটি ত্রুটি (error) চিহ্নিত করে।

এই ত্রুটিগুলো ঠিক করতে npm run format চালান। এই কমান্ডটি Prettier ব্যবহার করে আপনার ফাইলগুলোকে সঠিক স্টাইলে পুনরায় লিখে ফেলে।

  1. npm run lint

এটিকে আপনার কোডের জন্য একটি স্পেলচেকার (spellchecker) হিসেবে ভাবুন। ESLint এমন ত্রুটি খুঁজে বের করে যা আপনার লজিক নষ্ট করে দেয়।

  • এটি সিনট্যাক্স এরর খুঁজে বের করে।
  • এটি অব্যবহৃত ভেরিয়েবল শনাক্ত করে।
  • এটি মিসিং ইমপোর্ট শনাক্ত করে।
  • এটি ভুল React Hook ব্যবহারের ক্ষেত্রে সতর্ক করে।
  1. npm run build

এই কমান্ডটি আপনার অ্যাপকে বাস্তব জগতের জন্য প্রস্তুত করে। এটি একটি dist ফোল্ডার তৈরি করে।

  • এটি tree shaking করার জন্য একটি বান্ডলার ব্যবহার করে। এটি আপনার ইমপোর্ট করা কিন্তু কখনও ব্যবহার না করা কোডগুলো মুছে ফেলে।
  • এটি minification সম্পন্ন করে। এটি বাইট সাশ্রয় করতে হোয়াইটস্পেস সরিয়ে ফেলে এবং ভেরিয়েবলগুলোর নাম পরিবর্তন করে।
  • এটি CSS এবং অ্যাসেটগুলো প্রসেস করে।
  • এটি সার্ভারের জন্য প্রস্তুত অপ্টিমাইজড স্ট্যাটিক ফাইল আউটপুট হিসেবে দেয়।
  1. npm run dev

এটি আপনার লোকাল ডেভেলপমেন্ট সার্ভার চালু করে। আপনি যদি Vite ব্যবহার করেন, তবে এটি Native ES Modules ব্যবহার করে।

  • আপনার ব্রাউজার যখন ফাইলগুলোর জন্য রিকোয়েস্ট করে, কেবল তখনই এটি ফাইলগুলো কম্পাইল করে।
  • এটি Hot Module Replacement (HMR)-এর জন্য WebSockets ব্যবহার করে।
  • এটি পুরো পেজ রিফ্রেশ না করেই আপনার ব্রাউজারে এডিট করা কোডটি তাৎক্ষণিকভাবে পরিবর্তন করে দেয়।
  1. npm run preview

ডেপ্লয় করার আগে আপনার কাজ পুনরায় যাচাই করতে এটি ব্যবহার করুন। এই কমান্ডটি আপনার সোর্স কোডকে উপেক্ষা করে। এটি শুধুমাত্র আপনার dist ফোল্ডারটি দেখে।

  • এটি Vercel বা AWS-এ আপনার অ্যাপটি কেমন আচরণ করবে তার একটি সিমুলেশন তৈরি করে।
  • এটি লোকাল সার্ভারে আপনার প্রোডাকশন বিল্ডটি সার্ভ করে।

টার্মিনাল কোনো ব্ল্যাক বক্স নয়। যখন আপনি আপনার টুলগুলো বুঝতে পারবেন, তখন আপনি দ্রুত ডিবাগ করতে পারবেন।

এটি কীভাবে কাজ করে তা জানার পর কোন কমান্ডটি আপনার কাজের ধারা (workflow) বদলে দিয়েছে? নিচে আমাকে জানান।

টার্মিনালের নিচের জাদু: আপনি যখন npm কমান্ড চালান তখন আসলে কী ঘটে

আপনি কি কখনও ভেবে দেখেছেন যে npm install টাইপ করে এন্টার চাপলে পর্দার আড়ালে আসলে কী ঘটে? এটি অনেকটা জাদুর মতো মনে হয়—কয়েক সেকেন্ড পরে আপনার node_modules ফোল্ডারটি হঠাৎ করেই ফাইল দিয়ে ভরে যায়।

কিন্তু এখানে কোনো জাদু নেই, আছে একটি অত্যন্ত সুশৃঙ্খল প্রক্রিয়া। চলুন গভীরে যাওয়া যাক।

১. শেল (Shell) এবং কমান্ড

আপনি যখন আপনার টার্মিনালে npm install টাইপ করেন, প্রথম যা ঘটে তা হলো Shell (যেমন Bash, Zsh, বা PowerShell) আপনার কমান্ডটি ব্যাখ্যা (interpret) করে। এটি আপনার সিস্টেমের PATH-এ npm নামে কোনো এক্সিকিউটেবল (executable) ফাইল আছে কিনা তা দেখে।

২. npm CLI নিয়ন্ত্রণ গ্রহণ করে

একবার শেল npm এক্সিকিউটেবলটি খুঁজে পেলে, এটি নিয়ন্ত্রণ npm CLI-এর কাছে হস্তান্তর করে। CLI হলো একটি Node.js অ্যাপ্লিকেশন যা আপনার কমান্ডটি পার্স (parse) করে এবং আপনি কী করতে চান তা নির্ধারণ করে।

৩. ম্যানিফেস্ট পড়া (package.json)

CLI অবিলম্বে আপনার বর্তমান ডিরেক্টরিতে একটি package.json ফাইল খোঁজে। এই ফাইলটি আপনার প্রজেক্টের "source of truth"। এটি npm-কে জানায়:

  • আপনার প্রজেক্টের কোন কোন ডিপেন্ডেন্সি (dependencies) প্রয়োজন।
  • কোন ভার্সনগুলো প্রয়োজন।
  • কোন স্ক্রিপ্টগুলো উপলব্ধ।

৪. লকফাইল পরীক্ষা করা (package-lock.json)

যদি একটি package-lock.json ফাইল থাকে, তবে npm এটি ব্যবহার করে নিশ্চিত করে যে প্রতিবার ঠিক একই ভার্সনের ডিপেন্ডেন্সি ইনস্টল হচ্ছে। এটি "it works on my machine" সমস্যাটি প্রতিরোধ করে।

৫. npm Registry-র সাথে যোগাযোগ করা

এখন, npm-এর আসল কোডটি খুঁজে পেতে হবে। এটি npm Registry-তে (যা জাভাস্ক্রিপ্ট প্যাকেজের একটি বিশাল অনলাইন ডেটাবেস) একটি রিকোয়েস্ট পাঠায়। এটি জিজ্ঞেস করে, "হে, আমার express ভার্সন 4.18.2 প্রয়োজন। তোমার কাছে কি এটি আছে?"

৬. ডিপেন্ডেন্সি রেজোলিউশন (The Tree)

এখান থেকেই বিষয়টি জটিল হয়ে ওঠে। express-এর হয়তো body-parser প্রয়োজন হতে পারে, এবং body-parser-এর হয়তো debug প্রয়োজন হতে পারে। npm একটি Dependency Tree তৈরি করে। এটি ভার্সন কনফ্লিক্ট ছাড়াই সবকিছু ইনস্টল করার সবচেয়ে দক্ষ উপায়টি গণনা করে।

৭. ডাউনলোড এবং এক্সট্রাক্ট করা

একবার ট্রি (tree) তৈরি হয়ে গেলে, npm রেজিস্ট্রি থেকে প্রয়োজনীয় প্যাকেজগুলো .tar.gz ফাইল (tarballs) হিসেবে ডাউনলোড করে। তারপর এটি সেই ফাইলগুলো আপনার node_modules ফোল্ডারে এক্সট্রাক্ট (extract) করে।

৮. লাইফসাইকেল স্ক্রিপ্ট (Lifecycle Scripts)

কিছু প্যাকেজের "lifecycle scripts" থাকে। উদাহরণস্বরূপ, কোনো প্যাকেজ কিছু C++ কোড কম্পাইল করতে বা কিছু কনফিগারেশন সেট আপ করতে postinstall স্ক্রিপ্ট চালাতে পারে।

উপসংহার

পরের বার যখন আপনি npm install চালাবেন, মনে রাখবেন: এটি কোনো জাদু নয়। এটি শেল কমান্ড, রেজিস্ট্রি রিকোয়েস্ট, ডিপেন্ডেন্সি রেজোলিউশন এবং ফাইল ম্যানেজমেন্টের একটি জটিল সমন্বয়।