Creare moduli
Prima di iniziare: le parole della lezione
- Modulo, importazione ed esportazione
- Un modulo è un’unità di codice con un proprio ambito. Esportare significa rendere un valore utilizzabile da altri file; importare significa ottenere quel valore.
- CommonJS ed ESM
- CommonJS usa
requireemodule.exports. ESM significa ECMAScript Modules: è il sistema standard JavaScript basato suimportedexport. - Destructuring e cache
- Il destructuring estrae proprietà da un oggetto. Una cache conserva un risultato per riutilizzarlo: i moduli caricati vengono normalmente riutilizzati nelle importazioni successive dello stesso processo.
Dividere un programma in moduli rende il codice più leggibile, testabile e riutilizzabile. Nel corso si usa soprattutto CommonJS (require, module.exports).
Esempio CommonJS:
// saluti.cjs
function saluta(nome) { return `Ciao, ${nome}!`; }
module.exports = { saluta };
// main.cjs
const { saluta } = require('./saluti.cjs');
console.log(saluta('Anna'));
Alternativa ES Modules:
// saluti.mjs
export const saluta = nome => `Ciao, ${nome}!`;
// main.mjs
import { saluta } from './saluti.mjs';
console.log(saluta('Marco'));
Nota: l'importazione può eseguire il codice al livello superiore del modulo; evita effetti collaterali inattesi all'import.
Chi fa cosa, e perché
Nel testo, separare nomi e funzioni dal file principale serve a dare a ogni file una responsabilità. Il modulo dei nomi contiene i dati; il modulo delle utilità contiene funzioni; il file principale li collega. Una variabile rimane privata finché non viene esportata.
In CommonJS module.exports = saluta esporta direttamente la funzione; module.exports = { saluta } esporta un oggetto che la contiene. Nel secondo caso const { saluta } = require(...) estrae quella proprietà. Scrivere solo exports = qualcosa non sostituisce module.exports. Inoltre importare un array non ne crea automaticamente una copia: lo stesso oggetto esportato può essere condiviso fra moduli.
Un altro esempio guidato
// prezzi.mjs
export function conIva(prezzo, aliquota = 0.22) {
return prezzo * (1 + aliquota);
}
// main.mjs — salva questa parte in un secondo file
import { conIva } from './prezzi.mjs';
console.log(conIva(100).toFixed(2));
// Avvio: node main.mjs
Come leggerlo e risultato atteso. prezzi.mjs definisce il calcolo, main.mjs lo usa e stampa 122.00. ./ significa “rispetto al file che importa”; ../ sale alla cartella superiore. toFixed(2) produce una stringa con due decimali.
Prova tu. Esporta anche senzaIva, importala nel file principale e verifica che da 122 torni circa a 100. I numeri decimali JavaScript possono avere approssimazioni.