bonjour, explique moi le import dynamique dans jav...
Créé le : 5 mai 2025
Créé le : 5 mai 2025
bonjour, explique moi le import dynamique dans javascript
En JavaScript, l’instruction import « statique » (import X from "module";) est évaluée au chargement du fichier : tous les modules doivent être connus à la compilation/bundling.
Depuis ECMAScript 2020, on dispose aussi de la fonction asynchrone import() qui permet de charger un module à l’exécution, exactement quand on en a besoin.
js// Exemple simple : button.addEventListener("click", async () => { const { default: showModal } = await import("./ui/modal.js"); showModal(); });
import() renvoie une Promise résolue avec le module (sous forme d’objet ESM).await (dans une fonction async) ou via .then().| Besoin | Comment le dynamique aide |
|---|---|
| Réduire le bundle initial | Le code partagé uniquement quand il est vraiment requis (code‑splitting) |
| Feature detection | Importer un polyfill ou une lib seulement si l’environnement en a besoin |
| Chargement conditionnel | Choisir un module en fonction d’un paramètre, d’un A/B test, de la langue, etc. |
| Lazy loading en React/Vue | Combiné à React.lazy/Suspense ou au router (Vue, Svelte, etc.) |
js// 1. Importer tout le module const module = await import("./math.js"); // 2. Déstructurer immédiatement const { add, multiply } = await import("./math.js"); // 3. Importer dynamiquement un chemin construit à partir d’une variable const locale = navigator.language.startsWith("fr") ? "fr" : "en"; const messages = await import(`./i18n/${locale}.js`);
⚠️ Le chemin doit pouvoir être résolu au build si vous utilisez un bundler. Webpack/Rollup créent automatiquement des « chunks » nommés.
Dans un module ECMAScript (.mjs ou type="module"), on peut depuis 2022 faire :
js// chargez avant tout le reste du fichier const config = await import(`./env/${process.env.MODE}.js`);
Le module est alors lui‑même traité comme asynchrone : les modules qui l’importent attendront sa résolution.
jsimport("./lib/legacy.js") .then(({ legacyInit }) => legacyInit()) .catch(err => { console.error("Impossible de charger le module :", err); });
Ou en async/await :
jstry { const { legacyInit } = await import("./lib/legacy.js"); legacyInit(); } catch (err) { // Fallback }
import() nativement.<link rel="prefetch">) pour charger en tâche de fond.import() = chargement asynchrone + code‑splitting + flexibility → meilleures performances et UX.
Utilisez‑le quand le module :
Besoin d’un exemple plus concret (React, Vue, Node…)? Dis‑le moi !