1. What is Node.js?
Node.js হলো একটি JavaScript Runtime Environment, যার মাধ্যমে Browser-এর বাইরে JavaScript Code Run করা যায়। সাধারণত JavaScript Browser-এ চলে, কিন্তু Node.js ব্যবহার করে আমরা Server-side Application, Backend API এবং Command-line Tools তৈরি করতে পারি।
Node.js Google Chrome-এর V8 JavaScript Engine ব্যবহার করে JavaScript Code Execute করে। এটি Open-source এবং Cross-platform।
Example:
console.log("Hello from Node.js!");
Terminal-এ Run করো:
node app.js
Output:
Hello from Node.js!
2. How the Web Works: Client, Server and HTTP
আমরা যখন কোনো Website Open করি, তখন Client এবং Server-এর মধ্যে Data আদান-প্রদান হয়।
- Client: যে Device বা Browser থেকে Website Access করা হয়।
- Server: যেখানে Website-এর Application এবং Data থাকে।
- HTTP: Client এবং Server-এর মধ্যে Communication করার Protocol।
Request and Response Cycle
যখন আমরা Browser-এ কোনো Website-এর URL লিখি, তখন Browser Server-এর কাছে একটি HTTP Request পাঠায়। Server Request Process করে এবং একটি HTTP Response পাঠায়। এরপর Browser সেই Response অনুযায়ী Website Display করে।
Client (Browser)
|
| HTTP Request
v
Server
|
| Process Request
v
HTTP Response
|
v
Client (Browser)
Example:
GET /users HTTP/1.1
Host: example.com
Server Response:
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Arif",
"age": 25
}
3. Understanding the Node.js Runtime
Node.js Runtime হলো এমন একটি Environment, যেখানে Browser ছাড়াই JavaScript Code Execute করা যায়।
Node.js-এর গুরুত্বপূর্ণ Components:
- V8 Engine: JavaScript Code Execute করে।
- Event Loop: Asynchronous Operations পরিচালনা করতে সাহায্য করে।
- libuv: Asynchronous I/O এবং Event Loop-এর বিভিন্ন কাজ পরিচালনা করে।
- Node.js APIs: File System, HTTP, Path এবং অন্যান্য Built-in Features প্রদান করে।
এই Components-এর মাধ্যমে Node.js Server-side Application তৈরি করতে সাহায্য করে।
4. Event Loop and Non-blocking Architecture
Node.js-এর অন্যতম গুরুত্বপূর্ণ Feature হলো Event Loop এবং Non-blocking Architecture।
Node.js সাধারণত JavaScript Code একটি Main Thread-এ Execute করে। কোনো I/O Operation যেমন File Read বা Network Request শুরু হলে Node.js অপেক্ষা না করে অন্য কাজ চালিয়ে যেতে পারে। Operation Complete হলে তার Callback বা সংশ্লিষ্ট Handler Event Loop-এর মাধ্যমে Execute হয়।
Example:
console.log("Start");
setTimeout(() => {
console.log("Timer Finished");
}, 2000);
console.log("End");
Output:
Start
End
Timer Finished
এখানে setTimeout()-এর জন্য JavaScript Execution থেমে থাকে না। তাই End আগে Print হয়।
5. Synchronous vs Asynchronous Programming
JavaScript-এ কাজ করার দুটি গুরুত্বপূর্ণ পদ্ধতি হলো Synchronous এবং Asynchronous Programming।
Synchronous: একটির কাজ শেষ হওয়ার পর পরবর্তী কাজ শুরু হয়। অর্থাৎ Code ধারাবাহিকভাবে Execute হয়।
Asynchronous: কোনো কাজ সম্পন্ন হওয়ার জন্য অপেক্ষা না করে অন্য কাজ চালিয়ে যাওয়া যায়।
Synchronous Example
console.log("First");
console.log("Second");
console.log("Third");
Output:
First
Second
Third
Asynchronous Example
console.log("First");
setTimeout(() => {
console.log("Second");
}, 1000);
console.log("Third");
Output:
First
Third
Second
6. Callbacks and Callback Hell
Callback হলো এমন একটি Function, যেটি অন্য একটি Function-এর Argument হিসেবে Pass করা হয় এবং নির্দিষ্ট সময়ে Execute করা হয়।
Example:
function greet(name, callback) {
console.log("Hello " + name);
callback();
}
function message() {
console.log("Welcome to Node.js");
}
greet("Arif", message);
Output:
Hello Arif
Welcome to Node.js
What is Callback Hell?
যখন একাধিক Asynchronous Callback-এর মধ্যে অনেকগুলো Nested Callback তৈরি হয়, তখন Code জটিল এবং পড়তে অসুবিধা হয়। একে Callback Hell বলা হয়।
Example:
setTimeout(() => {
console.log("First Task");
setTimeout(() => {
console.log("Second Task");
setTimeout(() => {
console.log("Third Task");
}, 1000);
}, 1000);
}, 1000);
এই ধরনের Nested Structure Code Maintain করা কঠিন করে তোলে। Promise এবং Async/Await ব্যবহার করে এই সমস্যা অনেকটাই কমানো যায়।
7. Promises in JavaScript
Promise হলো JavaScript-এর একটি Object, যা কোনো Asynchronous Operation-এর ভবিষ্যতের Result অথবা Error Represent করে।
Promise-এর তিনটি State রয়েছে:
- Pending: Operation এখনো Complete হয়নি।
- Fulfilled: Operation সফলভাবে Complete হয়েছে।
- Rejected: Operation ব্যর্থ হয়েছে।
Example:
const myPromise = new Promise((resolve, reject) => {
const success = true;
if (success) {
resolve("Task Completed");
} else {
reject("Something went wrong");
}
});
myPromise
.then(result => console.log(result))
.catch(error => console.log(error));
Output:
Task Completed
এখানে resolve() সফল Result প্রদান করে এবং reject() Error নির্দেশ করে। .then() দিয়ে Successful Result এবং .catch() দিয়ে Error Handle করা হয়।
8. Async/Await and Error Handling
async এবং await ব্যবহার করে Asynchronous Code আরও সহজ ও Readable করা যায়।
- async: কোনো Function-কে Async Function হিসেবে Define করে এবং সেটি সবসময় Promise Return করে।
- await: কোনো Promise Settle হওয়া পর্যন্ত সেই Async Function-এর Execution Pause করে।
Example:
function getData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Data Loaded Successfully");
}, 1000);
});
}
async function main() {
const result = await getData();
console.log(result);
}
main();
Error Handling with try...catch
Async/Await ব্যবহার করার সময় কোনো Error হলে সেটি Handle করার জন্য try...catch ব্যবহার করা হয়।
async function getUser() {
try {
const response = await fetch(
"https://jsonplaceholder.typicode.com/users/1"
);
if (!response.ok) {
throw new Error("Failed to fetch user");
}
const data = await response.json();
console.log(data);
} catch (error) {
console.log("Error:", error.message);
}
}
getUser();
এখানে try Block-এর মধ্যে Asynchronous Operation করা হয়েছে এবং কোনো Error হলে catch Block সেটি Handle করবে।
9. CommonJS vs ES Modules
Node.js-এ Code বিভিন্ন File-এ ভাগ করে ব্যবহার করার জন্য Module System রয়েছে। CommonJS এবং ES Modules হলো JavaScript-এর দুটি Module System।
CommonJS
CommonJS-এ require() দিয়ে Module Import এবং module.exports দিয়ে Export করা হয়।
Export:
// math.js
function add(a, b) {
return a + b;
}
module.exports = add;
Import:
// app.js
const add = require("./math");
console.log(add(10, 20));
ES Modules (ESM)
ES Modules-এ import এবং export ব্যবহার করা হয়।
Export:
// math.js
export function add(a, b) {
return a + b;
}
Import:
// app.js
import { add } from "./math.js";
console.log(add(10, 20));
| CommonJS | ES Modules |
|---|---|
require() | import |
module.exports | export |
| Traditional Node.js Module System | Standard JavaScript Module System |
Node.js-এ ES Modules ব্যবহার করতে সাধারণত package.json-এ "type": "module" যোগ করা হয় অথবা .mjs Extension ব্যবহার করা হয়।
10. npm Ecosystem and Package Management
npm-এর পূর্ণরূপ হলো Node Package Manager। এটি Node.js-এর জনপ্রিয় Package Management System। npm ব্যবহার করে আমরা বিভিন্ন Library এবং Package Install, Update ও Manage করতে পারি।
Check npm version:
npm -v
Initialize a project:
npm init -y
Install a package:
npm install express
Install a development dependency:
npm install -D nodemon
Remove a package:
npm uninstall express
11. package.json and Dependencies
package.json হলো Node.js Project-এর একটি গুরুত্বপূর্ণ Configuration File। এখানে Project-এর Name, Version, Scripts এবং Dependencies-এর Information থাকে।
Example:
{
"name": "my-node-project",
"version": "1.0.0",
"description": "Learning Node.js",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"express": "^5.0.0"
},
"devDependencies": {
"nodemon": "^3.0.0"
}
}
Dependencies vs DevDependencies
Dependencies: Application Run করার জন্য যেসব Package প্রয়োজন হয়, সেগুলো এখানে থাকে। যেমন: Express এবং Mongoose।
DevDependencies: Development এবং Testing-এর সময় প্রয়োজন হয়, কিন্তু Production Application Run করার জন্য সাধারণত প্রয়োজন হয় না। যেমন: Nodemon এবং ESLint।
What are npm Scripts?
package.json-এর scripts Section-এ আমরা বিভিন্ন Command সংরক্ষণ করতে পারি।
{
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
}
Run the scripts:
npm start
npm run dev
Conclusion
Node.js হলো JavaScript-এর একটি গুরুত্বপূর্ণ Runtime Environment, যা ব্যবহার করে আমরা Backend Application এবং Server তৈরি করতে পারি। এর Event Loop, Non-blocking Architecture, Callback, Promise এবং Async/Await Asynchronous Programming সহজ করে তোলে।
অন্যদিকে, CommonJS ও ES Modules Code Organize করতে এবং npm Project-এর Packages Manage করতে সাহায্য করে। Node.js ভালোভাবে শিখতে হলে এই বিষয়গুলো পরিষ্কারভাবে বোঝা জরুরি। কারণ এগুলোই পরবর্তী সময়ে Express.js, Database এবং Backend Development শেখার মূল ভিত্তি তৈরি করবে।