Imports et exports : le code en morceaux
Export nommé/default, résolution relative, évaluation unique.
Objectifs
À la fin de cette leçon, vous saurez :
- découper un script en fichiers avec export/import ;
- distinguer export nommé et export par défaut ;
- comprendre comment un chemin local est résolu.
Le problème du fichier unique
Votre serveur fait tout : routes, validation, base, réponses. À mesure que ça grandit, le fichier devient illisible. Les modules permettent de découper : chaque fichier expose ce qu'il veut, importe ce dont il a besoin.
fonction → fichier → module → plusieurs modules → package
Exporter
// math.js
export function addition(a, b) {
return a + b;
}
export function soustraction(a, b) {
return a - b;
}
export const VERSION = "1.0"; // une valeur aussi peut s'exporter
Chaque nom exporté est accessible individuellement : c'est l'export nommé (plusieurs par fichier).
Importer
// app.js
import { addition, VERSION } from "./math.js";
console.log(addition(2, 3), VERSION);
Le ./ signifie « fichier voisin » : la résolution est relative au fichier courant. Sans extension ambiguïté possible, soyez explicite (./math.js).
L'export par défaut
Un fichier peut désigner UNE valeur principale :
// db.js
export default class BaseDeDonnees { ... }
import Base from "./db.js"; // n'importe quel nom local
import { creerTache } from "./db.js"; // ...et ses exports nommés en plus
Convention du cours : export par défaut pour « l'unique sujet » d'un fichier (une classe, un composant) ; exports nommés pour les utilitaires multiples. Dans les doutes, préférez les nommés : les autocomplétions et refactorings y sont plus fiables.
Ce qui se passe à l'exécution
node app.js
↓ lit app.js
trouve import "./math.js"
↓ charge et évalue math.js (une seule fois !)
exécute app.js avec les liaisons résolues
Détail important : un module n'est évalué qu'une fois par processus ; ses exports sont partagés entre tous les importeurs — c'est ainsi qu'un module de configuration devient naturellement un singleton :
// config.js — évalué UNE fois, partagé partout
export const configuration = { port: 3000, environnement: "dev" };
Deux erreurs classiques à connaître d'avance :
SyntaxError: Cannot use import statement outside a module
→ votre package.json n'a pas "type": "module" : Node traite vos fichiers comme CommonJS. Une ligne à ajouter.
Error [ERR_MODULE_NOT_FOUND]: Cannot find module './maths.js'
→ faute de frappe ou extension manquante. En ESM Node, l'extension est OBLIGATOIRE : ./math, sans .js, échoue — contrairement au navigateur avec bundler.
Exercice
- Extrayez
repondreJSONetlireCorpsde votre serveur danshttp-utilitaires.js. - Extrayez tout le SQL dans
db.js(si ce n'est déjà fait) et importez-le. - Ajoutez
constantes.jsavec PORT et LIMITES ; utilisez-les partout. - Que se passe-t-il si deux fichiers importent le même module ?
Résumé
- export/import = découpage propre ;
./= relatif au fichier. - Nommé pour plusieurs utilitaires, défaut pour l'unique sujet.
- Un module s'évalue une fois : ses exports sont partagés.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 4. Il n'est chargé qu'une seule fois : les deux importeurs reçoivent les mêmes valeurs. Testez avec un module qui logge son chargement : un seul log quel que soit le nombre d'importeurs.