Federico Lelli / SchoolNode.js & Express
LEZIONE 05 · Moduli e I/O

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 require e module.exports. ESM significa ECMAScript Modules: è il sistema standard JavaScript basato su import ed export.
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.

Torna all’indice ↑

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.