bonjour, explique moi le import dynamique dans jav...

Créé le : 5 mai 2025

Répondu en utilisant O3 par Chat01

Question

bonjour, explique moi le import dynamique dans javascript

Réflexion

Thought for a few seconds

Réponse

Qu’est‑ce qu’un import dynamique ?

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 asynchroneimport() 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).
  • On peut l’utiliser n’importe où (dans une fonction, un if, un handler…).
  • Comme toute Promise, on la consomme avec await (dans une fonction async) ou via .then().

Pourquoi c’est utile ?

BesoinComment le dynamique aide
Réduire le bundle initialLe code partagé uniquement quand il est vraiment requis (code‑splitting)
Feature detectionImporter un polyfill ou une lib seulement si l’environnement en a besoin
Chargement conditionnelChoisir un module en fonction d’un paramètre, d’un A/B test, de la langue, etc.
Lazy loading en React/VueCombiné à React.lazy/Suspense ou au router (Vue, Svelte, etc.)

Syntaxe détaillée

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.


Top‑level await (TLA)

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.


Gestion des erreurs

js
import("./lib/legacy.js") .then(({ legacyInit }) => legacyInit()) .catch(err => { console.error("Impossible de charger le module :", err); });

Ou en async/await :

js
try { const { legacyInit } = await import("./lib/legacy.js"); legacyInit(); } catch (err) { // Fallback }

Compatibilité navigateurs

  • Chrome 63+, Firefox 67+, Safari 11.1+, Edge 17+ supportent import() nativement.
  • Pour les environnements plus anciens (ex. IE 11), il faut passer par un bundler qui génère des chunks + un loader de Promise.

Bonnes pratiques

  1. Regroupez vos imports dynamiques par logique fonctionnelle : ex. un chunk « settings » plutôt que trois petits fichiers.
  2. Préférez des chemins statiques (ou des segments limités) pour que le bundler puisse pré‑analyser.
  3. Sur le web, affichez un indicateur de chargement si le module est volumineux.
  4. Combinez‑le avec prélude réseau (<link rel="prefetch">) pour charger en tâche de fond.
  5. Testez ! Des chunks trop nombreux peuvent annuler les gains (overhead réseau).

TL;DR

import() = chargement asynchrone + code‑splitting + flexibility → meilleures performances et UX.
Utilisez‑le quand le module :

  • n’est pas nécessaire au démarrage,
  • dépend d’une condition,
  • ou est très volumineux.

Besoin d’un exemple plus concret (React, Vue, Node…)? Dis‑le moi !

Partager cette Q&R