
Rant: En 2020 les import/export ESM sont toujours cassés dans le monde de node
Ce post est un petit rant sur les imports es6 et la galère à les utiliser.
Tout le monde le sait aujourd’hui, ES6 a introduit une nouvelle syntaxe pour les imports et exports: les esm
pour ecmascript modules. Quelques années plus tard nodejs les a intégré, d’abord en expérimental via l’argument --experimental-modules
, puis via les fichiers d’extension mjs
ou le "type": "module"
dans le package.json. Si vous ne connaissez pas les imports esm dans nodejs rendez-vous ici => https://nodejs.org/api/esm.html
<Rant>
En 2020 c'est toujours une galère d'intégrer et d'utiliser les modules `esm`.
</Rant>
Si vous lancer un nouveau projet nodejs et que vous vous posez la question, d’utiliser la syntaxe esm, mon conseil est le suivant : Ne faites surtout pas ça !
Je précise : ne faites surtout pas ça si vous n’utilisez pas Babel pour transpiler votre code.
Si vous utilisez Babel, vos imports vont être transpilés en require
, donc l’utilité de la syntaxe es6 sera principalement de la lisibilité.
Pourquoi les imports esm c’est dangereux
- Les imports
esm
dynamiques sont asynchrones : il faudra re-écrire votre code, si vous chargez des fichier dynamiquement (des locales json par exemple) - Il n’est pas possible de mélanger
import
etrequire
- Utiliser pose beaucoup de problèmes si votre code va interagir avec d’autres outils :
eslint
,mocha
,jest
posent quelques soucis si vos fichiers sont enmjs
et encore plus si vous avez utilisé letype: "module"
dans votre package.json
Pourquoi le type : module
c’est le mal
En plus de tous les points ci-dessus,
- Faire un
require
dans un projet de type module ne fonctionne pas et pose des problèmes énormes - Les librairies externes ne fonctionneront pas si elles ne prennent pas soin de vérifier le type de projet dans votre
package.json
- Si votre code va servir de librairie à une autre projet, cela va poser des soucis.
jest
etsequelize-cli
ne savent pas fonctionner avec letype: "modules"
Voila vous êtes prévenus.
Posted by: Marie