Skip to main content

Command Palette

Search for a command to run...

Backend Engineering Series #1: Node.js Architecture Explained

Updated
4 min readView as Markdown
A

i am learner whatever i will learn i will write here

Welcome to the Backend Engineering Series.

In this series we will explore how backend systems actually work — from the basics of Node.js architecture to the internals of the event loop and asynchronous programming.

In this first article, we will understand the architecture of Node.js and how it enables high-performance, non-blocking applications.

Node.js Architecture Explained (Super Easy Guide)

Before learning the Event Loop, it is very important to understand Node.js Architecture.

Because the Event Loop is just one part of Node.js.

If you understand the architecture, the rest of Node.js concepts become much easier.

So let's understand how Node.js works internally.


1. JavaScript Cannot Run by Itself

JavaScript needs something called a JavaScript Engine to run.

Example engines:

Platform Engine
Chrome V8
Firefox SpiderMonkey
Node.js V8

Node.js uses Google's V8 Engine.

The V8 engine:

  • reads JavaScript code

  • converts it into machine code

  • runs the program

Example:

console.log("Hello Node.js")

When you run:

node app.js

the V8 engine executes this code.


2. Node.js Is More Than Just V8

Node.js is not just the V8 engine.

It combines three main components:

V8 Engine
C++ bindings
libuv

Each part has a different job.


3. C++ Bindings (Node APIs)

Node.js provides many built-in APIs like:

  • fs (file system)

  • http (server)

  • crypto

  • timers

Example:

const fs = require("fs")

fs.readFile("data.txt",(err,data)=>{
 console.log(data)
})

When we call fs.readFile(), JavaScript actually calls C++ code inside Node.js, which talks to the operating system.

This is how Node.js interacts with your computer.


4. libuv (The Most Important Part)

Node.js uses a library called libuv.

libuv handles things like:

  • asynchronous operations

  • file system tasks

  • networking

  • event loop

  • thread pool

libuv is the reason Node.js can handle many operations without blocking the program.


5. Node.js Uses a Single Thread

Node.js runs JavaScript on one main thread.

This means JavaScript executes one task at a time.

Example:

console.log("Start")

for(let i=0;i<1000000000;i++){}

console.log("End")

The loop blocks the program.

This is called blocking code.

Blocking code is bad for servers because it stops other users from being served.


6. Non-Blocking Architecture

Node.js solves this problem using asynchronous programming.

Instead of waiting for slow tasks like:

  • reading files

  • database queries

  • API calls

Node.js sends these tasks to libuv.

While the task is running, Node.js continues doing other work.

When the task finishes, the result is returned as a callback.

Example:

fs.readFile("file.txt",(err,data)=>{
 console.log(data)
})

Node.js does not wait for the file to finish reading.


7. Thread Pool

Node.js also has something called a thread pool.

Default size:

4 threads

These threads handle heavy tasks like:

  • file system operations

  • cryptography

  • compression

  • DNS lookup

Example:

const crypto = require("crypto")

crypto.pbkdf2("password","salt",100000,1024,"sha256",()=>{
 console.log("Done")
})

This heavy operation runs in the thread pool, not in the main thread.


8. How Node.js Handles a Request

Let's imagine a user sends a request to a Node.js server.

The flow looks like this:

User Request
     ↓
Node.js Server
     ↓
JavaScript Code Runs
     ↓
Async Task Sent to libuv
     ↓
Thread Pool Handles Task
     ↓
Result Returned
     ↓
Callback Executes

Because Node.js does not block the main thread, it can handle many requests at the same time.


9. Why Node.js Is Fast

Node.js is fast because it uses:

  • single thread execution

  • non-blocking I/O

  • asynchronous architecture

  • thread pool for heavy tasks

This allows Node.js to handle thousands of connections efficiently.


CONCLUSION

Important things to remember:

  • Node.js uses the V8 engine to run JavaScript

  • Node.js APIs are implemented using C++ bindings

  • libuv handles asynchronous operations

  • Node.js uses a thread pool for heavy tasks

  • Node.js follows a non-blocking architecture

Because of this design, Node.js can build fast and scalable backend applications.

3 views