Introducció
Node.js és una plataforma de codi obert que permet executar JavaScript al servidor. La seva arquitectura única i eficient és una de les raons principals per la seva popularitat. En aquesta secció, explorarem els components clau de l'arquitectura de Node.js i com funcionen junts per proporcionar un entorn de desenvolupament ràpid i escalable.
Components Clau de l'Arquitectura de Node.js
-
Motor V8 de Google Chrome
- Node.js utilitza el motor V8 de Google Chrome per executar el codi JavaScript. V8 és conegut per la seva velocitat i eficiència, ja que compila el codi JavaScript directament a codi màquina natiu.
-
Event Loop
- L'Event Loop és el cor de Node.js. És un bucle que permet a Node.js realitzar operacions no bloquejants, gestionant múltiples operacions simultàniament sense necessitat de fils addicionals.
-
Single-Threaded
- Node.js és single-threaded, la qual cosa significa que utilitza un únic fil per executar el codi JavaScript. Això simplifica la programació i evita problemes de concurrència, però també significa que cal tenir cura de no bloquejar el fil principal.
-
Callbacks i Promises
- Node.js utilitza callbacks i promises per gestionar operacions asíncrones. Això permet que el codi continuï executant-se mentre s'esperen resultats d'operacions com la lectura de fitxers o les peticions de xarxa.
-
Mòduls
- Node.js té un sistema de mòduls integrat que permet dividir el codi en components reutilitzables. Els mòduls es poden importar i utilitzar fàcilment en altres parts de l'aplicació.
Funcionament de l'Event Loop
L'Event Loop és un concepte fonamental en Node.js. A continuació, es mostra una descripció detallada del seu funcionament:
-
Timers
- Gestiona les funcions
setTimeout()
isetInterval()
.
- Gestiona les funcions
-
I/O Callbacks
- Gestiona les callbacks de les operacions d'I/O (Input/Output) que han completat.
-
Idle, Prepare
- Internament utilitzat per Node.js.
-
Poll
- Recupera nous I/O events; executa callbacks d'I/O (excepte close callbacks, timers i setImmediate()).
-
Check
- Executa callbacks de
setImmediate()
.
- Executa callbacks de
-
Close Callbacks
- Gestiona les callbacks de tancament, com
socket.on('close', ...)
.
- Gestiona les callbacks de tancament, com
Diagrama de l'Event Loop
+-------------------+ | Timers | <-- setTimeout(), setInterval() +-------------------+ | I/O Callbacks | <-- I/O events +-------------------+ | Idle, Prepare | <-- Internal use +-------------------+ | Poll | <-- Retrieve new I/O events +-------------------+ | Check | <-- setImmediate() +-------------------+ | Close Callbacks | <-- socket.on('close', ...) +-------------------+
Exemple Pràctic
A continuació, es mostra un exemple pràctic que il·lustra com funciona l'Event Loop en Node.js:
const fs = require('fs'); console.log('Inici del programa'); setTimeout(() => { console.log('Timeout de 0 ms'); }, 0); fs.readFile('fitxer.txt', 'utf8', (err, data) => { if (err) throw err; console.log('Lectura del fitxer completada'); }); setImmediate(() => { console.log('setImmediate'); }); console.log('Final del programa');
Explicació del Codi
- Inici del programa: Es mostra immediatament.
- Final del programa: Es mostra immediatament després de l'inici.
- Timeout de 0 ms: Es mostra després de la finalització del codi sincrònic.
- Lectura del fitxer completada: Es mostra després que la lectura del fitxer es completi.
- setImmediate: Es mostra després de la finalització del codi sincrònic i abans de les operacions d'I/O.
Exercici Pràctic
Exercici
Escriu un programa en Node.js que faci el següent:
- Llegeixi un fitxer de text.
- Utilitzi
setTimeout
per mostrar un missatge després de 100 ms. - Utilitzi
setImmediate
per mostrar un missatge immediatament després de la finalització del codi sincrònic.
Solució
const fs = require('fs'); console.log('Inici del programa'); setTimeout(() => { console.log('Timeout de 100 ms'); }, 100); fs.readFile('fitxer.txt', 'utf8', (err, data) => { if (err) throw err; console.log('Lectura del fitxer completada'); }); setImmediate(() => { console.log('setImmediate'); }); console.log('Final del programa');
Resum
En aquesta secció, hem explorat l'arquitectura de Node.js, incloent-hi el motor V8, l'Event Loop, el model single-threaded, i l'ús de callbacks i promises. També hem vist com funciona l'Event Loop amb un exemple pràctic i hem proporcionat un exercici per reforçar els conceptes apresos. Amb aquesta base, estàs preparat per aprofundir en els conceptes bàsics de Node.js en el següent mòdul.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu