Français

Explorez les différences entre CommonJS et ES Modules, les deux systèmes de modules dominants en JavaScript, avec des exemples pratiques et des aperçus pour le développement web moderne.

Systèmes de modules : CommonJS vs. ES Modules - Un guide complet

Dans le monde en constante évolution du développement JavaScript, la modularité est la pierre angulaire de la construction d'applications évolutives et maintenables. Deux systèmes de modules ont historiquement dominé le paysage : CommonJS et ES Modules (ESM). Comprendre leurs différences, leurs avantages et leurs inconvénients est crucial pour tout développeur JavaScript, qu'il travaille sur le front-end avec des frameworks comme React, Vue ou Angular, ou sur le back-end avec Node.js.

Que sont les systèmes de modules ?

Un système de modules fournit un moyen d'organiser le code en unités réutilisables appelées modules. Chaque module encapsule une partie spécifique de la fonctionnalité et n'expose que les parties dont les autres modules ont besoin. Cette approche favorise la réutilisabilité du code, réduit la complexité et améliore la maintenabilité. Considérez les modules comme des blocs de construction ; chaque bloc a un objectif spécifique, et vous pouvez les combiner pour créer des structures plus grandes et plus complexes.

Avantages de l'utilisation de systèmes de modules :

CommonJS : La norme Node.js

CommonJS est apparu comme le système de modules standard pour Node.js, l'environnement d'exécution JavaScript populaire pour le développement côté serveur. Il a été conçu pour pallier l'absence d'un système de modules intégré en JavaScript lors de la première création de Node.js. Node.js a adopté CommonJS comme moyen d'organiser le code. Ce choix a eu un impact profond sur la façon dont les applications JavaScript ont été construites côté serveur.

Principales caractéristiques de CommonJS :

Syntaxe CommonJS :

Voici un exemple d'utilisation de CommonJS :

Module (math.js) :

// math.js
function add(a, b) {
 return a + b;
}

function subtract(a, b) {
 return a - b;
}

module.exports = {
 add: add,
 subtract: subtract
};

Utilisation (app.js) :

// app.js
const math = require('./math');

console.log(math.add(5, 3)); // Output: 8
console.log(math.subtract(10, 4)); // Output: 6

Avantages de CommonJS :

Inconvénients de CommonJS :

ES Modules (ESM) : Le système de modules JavaScript standardisé

ES Modules (ESM) est le système de modules standardisé officiel pour JavaScript, introduit avec ECMAScript 2015 (ES6). Ils visent à fournir un moyen cohérent et efficace d'organiser le code à la fois dans Node.js et dans le navigateur. ESM apporte un support natif des modules au langage JavaScript lui-même, éliminant ainsi le besoin de bibliothèques externes ou d'outils de construction pour gérer la modularité.

Principales caractéristiques des modules ES :

Syntaxe des modules ES :

Voici un exemple d'utilisation des modules ES :

Module (math.js) :

// math.js
export function add(a, b) {
 return a + b;
}

export function subtract(a, b) {
 return a - b;
}

// Or, alternatively:
// function add(a, b) {
//  return a + b;
// }
// function subtract(a, b) {
//  return a - b;
// }
// export { add, subtract };

Utilisation (app.js) :

// app.js
import { add, subtract } from './math.js';

console.log(add(5, 3)); // Output: 8
console.log(subtract(10, 4)); // Output: 6

Exports nommés vs. Exports par défaut :

Les modules ES prennent en charge à la fois les exports nommés et les exports par défaut. Les exports nommés vous permettent d'exporter plusieurs valeurs d'un module avec des noms spécifiques. Les exports par défaut vous permettent d'exporter une seule valeur comme export par défaut d'un module.

Exemple d'export nommé (utils.js) :

// utils.js
export function formatCurrency(amount, currencyCode) {
 // Format the amount according to the currency code
 // Example: formatCurrency(1234.56, 'USD') might return '$1,234.56'
 // Implementation depends on desired formatting and available libraries
 return new Intl.NumberFormat('en-US', { style: 'currency', currency: currencyCode }).format(amount);
}

export function formatDate(date, locale) {
 // Format the date according to the locale
 // Example: formatDate(new Date(), 'fr-CA') might return '2024-01-01'
 return new Intl.DateTimeFormat(locale).format(date);
}
// app.js
import { formatCurrency, formatDate } from './utils.js';

const price = formatCurrency(19.99, 'EUR'); // Europe
const today = formatDate(new Date(), 'ja-JP'); // Japan

console.log(price); // Output: €19.99
console.log(today); // Output: (varies based on date)

Exemple d'export par défaut (api.js) :

// api.js
const api = {
 fetchData: async (url) => {
 const response = await fetch(url);
 return response.json();
 }
};

export default api;
// app.js
import api from './api.js';

api.fetchData('https://example.com/data')
 .then(data => console.log(data));

Avantages des modules ES :

Inconvénients des modules ES :

CommonJS vs. ES Modules : Une comparaison détaillée

Voici un tableau résumant les principales différences entre CommonJS et ES Modules :

Fonctionnalité CommonJS ES Modules
Syntaxe d'importation require() import
Syntaxe d'exportation module.exports export
Chargement Synchrone Asynchrone (dans les navigateurs), Synchrone/Asynchrone dans Node.js
Analyse statique Non Oui
Prise en charge native du navigateur Non Oui
Cas d'utilisation principal Node.js (historiquement) Navigateurs et Node.js (moderne)

Exemples pratiques et cas d'utilisation

Exemple 1 : Création d'un module d'utilitaires réutilisable (Internationalisation)

Supposons que vous construisiez une application web qui doit prendre en charge plusieurs langues. Vous pouvez créer un module d'utilitaires réutilisable pour gérer l'internationalisation (i18n).

ES Modules (i18n.js) :

// i18n.js
const translations = {
 'en': {
 'greeting': 'Hello, world!'
 },
 'fr': {
 'greeting': 'Bonjour, le monde !'
 },
 'es': {
 'greeting': '¡Hola, mundo!'
 }
};

export function getTranslation(key, language) {
 return translations[language][key] || key;
}
// app.js
import { getTranslation } from './i18n.js';

const language = 'fr'; // Example: User selected French
const greeting = getTranslation('greeting', language);
console.log(greeting); // Output: Bonjour, le monde !

Exemple 2 : Construction d'un client API modulaire (API REST)

Lorsque vous interagissez avec une API REST, vous pouvez créer un client API modulaire pour encapsuler la logique de l'API.

ES Modules (apiClient.js) :

// apiClient.js
const API_BASE_URL = 'https://api.example.com';

async function get(endpoint) {
 const response = await fetch(`${API_BASE_URL}${endpoint}`);
 if (!response.ok) {
 throw new Error(`HTTP error! status: ${response.status}`);
 }
 return response.json();
}

async function post(endpoint, data) {
 const response = await fetch(`${API_BASE_URL}${endpoint}`, {
 method: 'POST',
 headers: {
 'Content-Type': 'application/json'
 },
 body: JSON.stringify(data)
 });
 if (!response.ok) {
 throw new Error(`HTTP error! status: ${response.status}`);
 }
 return response.json();
}

export { get, post };
// app.js
import { get, post } from './apiClient.js';

get('/users')
 .then(users => console.log(users))
 .catch(error => console.error('Error fetching users:', error));

post('/users', { name: 'John Doe', email: 'john.doe@example.com' })
 .then(newUser => console.log('New user created:', newUser))
 .catch(error => console.error('Error creating user:', error));

Migration de CommonJS vers ES Modules

La migration de CommonJS vers ES Modules peut être un processus complexe, en particulier dans les grandes bases de code. Voici quelques stratégies à considérer :

Node.js et ES Modules :

Node.js a évolué pour prendre entièrement en charge les modules ES. Vous pouvez utiliser les modules ES dans Node.js en :

Choisir le bon système de modules

Le choix entre CommonJS et ES Modules dépend de vos besoins spécifiques et de l'environnement dans lequel vous développez :

Conclusion

Comprendre les différences entre CommonJS et ES Modules est essentiel pour tout développeur JavaScript. Bien que CommonJS ait historiquement été la norme pour Node.js, les modules ES deviennent rapidement le choix préféré pour les navigateurs et Node.js en raison de leur nature standardisée, de leurs avantages en termes de performances et de leur prise en charge de l'analyse statique. En tenant compte des besoins de votre projet et de l'environnement dans lequel vous développez, vous pouvez choisir le système de modules qui répond le mieux à vos besoins et créer des applications JavaScript évolutives, maintenables et efficaces.

Alors que l'écosystème JavaScript continue d'évoluer, rester informé des dernières tendances et des meilleures pratiques en matière de systèmes de modules est crucial pour le succès. Continuez à expérimenter avec CommonJS et ES Modules, et explorez les différents outils et techniques disponibles pour vous aider à créer un code JavaScript modulaire et maintenable.