Oggetti globali e process
Prima di iniziare: le parole della lezione
- Globale e ambito del modulo
- Un globale è disponibile senza importazione. L’ambito del modulo contiene nomi validi solo in quel file: le variabili dichiarate con
constnon diventano automaticamente proprietà globali. - process e variabile d’ambiente
processdescrive il processo Node. Una variabile d’ambiente è un valore di configurazione esterno al codice, letto conprocess.env.- Callback e timer
- Una callback è una funzione passata a un’altra funzione perché la richiami. Un timer pianifica una callback dopo un intervallo minimo, senza garantirne l’istante esatto.
In Node.js trovi globali come console, setTimeout, process e globalThis. Il corso usa anche __dirname, __filename, require e module: sono disponibili nei moduli CommonJS, non allo stesso modo nei moduli ESM.
// index.cjs (CommonJS)
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(process.env.NODE_ENV ?? 'non definito');
setTimeout(() => console.log('Dopo 200 ms'), 200);
// index.mjs (ES modules): alternativa moderna
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const filename = fileURLToPath(import.meta.url);
const directory = dirname(filename);
console.log(directory);
NODE_ENV è una convenzione: non garantisce da sola che il codice sia sicuro o configurato correttamente. Evita di stampare in log l'intero process.env, perché può contenere segreti.
Chi fa cosa, e perché
__dirname indica la cartella del modulo CommonJS che lo contiene; __filename ne indica il percorso completo. process.cwd() indica invece la cartella da cui hai avviato il processo. Se importi un file da una sottocartella, il suo __dirname cambia, ma cwd() resta quello del processo, salvo modifiche esplicite.
require carica un modulo e module ne rappresenta il contesto CommonJS: non sono normali globali universali. globalThis è il nome standard dell’oggetto globale, ma condividere dati tramite globali rende più difficile capire chi li modifica.
Un altro esempio guidato
// configurazione.cjs — node configurazione.cjs
const porta = Number(process.env.PORT ?? 3000);
if (!Number.isInteger(porta) || porta < 1 || porta > 65535) {
console.error('PORT deve essere un intero tra 1 e 65535');
process.exitCode = 1;
} else {
console.log('Porta configurata:', porta);
}
Come leggerlo e risultato atteso. Senza configurazione stampa 3000. I valori di process.env sono normalmente stringhe: Number converte il testo, il controllo scarta valori non validi. exitCode = 1 comunica un esito di errore quando il processo termina.
Prova tu. In PowerShell esegui $env:PORT = "4000" e poi lo script: deve leggere 4000. Con Remove-Item Env:PORT rimuovi la variabile dalla shell corrente.