Chapter 1: Node.js Architecture Deep Dive
Chapter 1 of 15
Chapter 1: Node.js Architecture Deep Dive
1.1 V8 Engine
Node.js is built on Chrome's V8 JavaScript engine, which compiles JavaScript to native machine code. Understanding V8 helps optimize Node.js applications.
V8 Components:
- Parser: Converts JavaScript source to Abstract Syntax Tree (AST)
- Ignition: Interpreter that generates bytecode
- TurboFan: Optimizing compiler that generates machine code
- Orinoco: Garbage collector for memory management
// V8 optimization tips
// 1. Use consistent object shapes
function createUser(name, age) {
return { name, age }; // Same shape every time
}
// 2. Avoid hidden classes
// Bad: Different property order
function badUser(name, age) {
if (name) this.name = name;
if (age) this.age = age; // Different hidden class
}
// Good: Consistent property order
function goodUser(name, age) {
this.name = name;
this.age = age; // Same hidden class
}
1.2 LibUV
LibUV is a multi-platform C library that provides asynchronous I/O operations. It's the foundation of Node.js's event loop.
LibUV Features:
- Event loop implementation
- Thread pool for blocking operations
- File system operations
- Network I/O (TCP, UDP)
- DNS resolution
- Child processes
// LibUV thread pool
// Default size: 4 threads
// Can be increased: UV_THREADPOOL_SIZE=8 node app.js
// Operations using thread pool:
// - fs.* (except fs.FSWatcher)
// - crypto.* (some functions)
// - dns.lookup()
// - zlib.* (except zlib streams)
1.3 Node.js Architecture Layers
// Node.js Architecture:
// ┌─────────────────┐
// │ JavaScript │ Your application code
// ├─────────────────┤
// │ Node.js Core │ Built-in modules (fs, http, etc.)
// ├─────────────────┤
// │ V8 Engine │ JavaScript execution
// ├─────────────────┤
// │ LibUV │ Event loop & async I/O
// └─────────────────┘
1.4 Process and Thread Model
Node.js runs in a single process with a single main thread. The event loop runs on the main thread, while blocking operations are handled by LibUV's thread pool.
// Single-threaded event loop
console.log('Start');
setTimeout(() => console.log('Timeout'), 0);
Promise.resolve().then(() => console.log('Promise'));
console.log('End');
// Output:
// Start
// End
// Promise
// Timeout