«React refers to a UMD global» : comment TypeScript perd la tête

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : quand le compilateur dit « non »

\n

Vous ouvrez votre éditeur préféré, écrivez quelques lignes de code en TypeScript, lancez la compilation — et soudain, vous voyez ceci : 'React' refers to a UMD global, but the current file is a module. Si vous avez déjà rencontré cette erreur, vous savez à quel point elle peut être déconcertante. Tout semble correct : l'import est là, React est installé, mais le compilateur refuse obstinément de comprendre ce que vous voulez.

\n\n

Cette erreur n'est pas un simple bug aléatoire. Elle révèle les mécanismes profonds du fonctionnement de TypeScript, des systèmes de compilation et des formats modulaires. Dans cet article, nous ne nous contenterons pas de montrer comment la corriger. Nous allons regarder « sous le capot » et comprendre pourquoi l'erreur React refers to a UMD global se produit, comment TypeScript distingue UMD et ESM, et comment configurer correctement votre projet pour l'oublier à jamais.

\n\n

Cet article s'adresse aux développeurs qui connaissent déjà React et TypeScript, mais qui souhaitent comprendre les rouages internes. Prêts ? C'est parti !

\n\n

Qu'est-ce que UMD et pourquoi TypeScript le connaît-il ?

\n\n

Avant d'analyser l'erreur, rappelons ce que sont les formats modulaires en JavaScript. Lorsque vous écrivez import React from 'react', TypeScript doit comprendre d'où vient ce code et comment l'utiliser. Il existe plusieurs standards :

\n\n
    \n
  • ESM (ECMAScript Modules) — le standard moderne utilisant import/export.
  • \n
  • CommonJS — le format Node.js avec require/module.exports.
  • \n
  • UMD (Universal Module Definition) — un hybride qui fonctionne à la fois dans le navigateur (via des variables globales) et dans Node.js (via des modules).
  • \n
\n\n

React est distribué dans plusieurs formats, dont UMD. Lorsque vous installez React via npm, vous obtenez une version ESM (par exemple, index.js avec export default). Mais les anciennes versions ou certaines compilations peuvent utiliser UMD, où React est disponible en tant que variable globale window.React.

\n\n

TypeScript analyse les fichiers de déclaration de types (.d.ts). Pour React, il s'agit du paquet @types/react. À l'intérieur, il y a une déclaration qui indique : « React est disponible en tant que UMD global ». Lorsque TypeScript voit que votre fichier est marqué comme un module (par exemple, contient import ou export), il commence à s'embrouiller : « Vous importez React, mais la déclaration dit que c'est un global. Et le fichier est un module. Comment faire ? »

\n\n

Pourquoi l'erreur se produit-elle : « React refers to a UMD global, but the current file is a module » ?

\n\n

L'erreur apparaît lorsque TypeScript ne peut pas déterminer de manière univoque comment traiter l'import de React. Voici un scénario typique :

\n\n
// App.tsx\nimport React from 'react';\nimport { useState } from 'react';\n\nconst App: React.FC = () => {\n    const [count, setCount] = useState(0);\n    return <div>{count}</div>;\n};\n\nexport default App;\n
\n\n

Vous lancez la compilation, et TypeScript génère l'erreur : 'React' refers to a UMD global, but the current file is a module. Consider adding an import instead.

\n\n

Pourquoi ? Parce que dans @types/react, il y a cette déclaration (simplifiée) :

\n\n
// dans le fichier index.d.ts de @types/react\nexport = React;\nexport as namespace React;\n\ndeclare namespace React {\n    // ...types\n}\n
\n\n

La ligne clé est export as namespace React. Elle indique à TypeScript : « Ce module est également disponible en tant que variable globale React (UMD) ». Lorsque votre fichier est un module (contient export), TypeScript peut ne pas comprendre si vous voulez utiliser le React global ou celui importé. Résultat : un conflit.

\n\n

Comment corriger : trois méthodes éprouvées

\n\n

Méthode 1 : Import explicite (la plus courante)

\n\n

La méthode la plus simple consiste à s'assurer que vous importez explicitement React, même si

Blogs

Book Recommendations