Mon but: créer un package npm ré-utilisable en interne, avec des définitions typescript. Les packages npm sont généralement des modules (qu’on peut require ou import depuis javascript). C’est ce que je veux faire ici et je documente l’état de ma réflexion.

Modules: ESM versus CommonJS

Il y a deux types de modules :

Pour la rétro compatibilité, par défaut, NodeJS considère que les fichiers sont des modules CommonJS.

N’y connaissant rien, j’ai pris le premier site venu qui explique comment publier un module typescript vers npm. Par contre ça publie en CommonJS et moi je voulais du ESM que je trouve plus propre, et qui est l’avenir des modules en javascript (c’est dans le standard !). Pour y parvenir il faut :

  • préciser cela au compilateur typescript
  • annoncer cela à NodeJS

Pour typescript : il va transpiler différemment en fonction des options de compilation, notamment module et target. J’ai positionné les deux à "ES6".

Pour NodeJS, il suffit de le préciser dans package.json : "type": "module", (c’est-à-dire ESM). Il faut aussi que le fichier javascript “appelant” soit un ESM, soit via une déclaration de type, soit via une extension .mjs (voir ECMAScript modules – ESM déjà mentionné plus haut.)

Publier

Un package NPM c’est souvent quelque chose publié sur la NPM registry, mais ça peut être d’autres choses (documentation).

Par exemple on peut simplement faire un dépôt git contenant le package. On peut aussi créer un package sous forme de tarball, par exemple via npm pack.

On peut définir des scripts qui vont être lancés automatiquement quand on “pack” ou “publish”j’imagine que l’option “faire un dépôt git” est donc bof si on veut utiliser ces scripts. en particulier le script prepare est exécuté quand on installe le paquet, notamment à partir d’un dépôt git :

NOTE: If a package being installed through git contains a prepare script, its dependencies and devDependencies will be installed, and the prepare script will be run, before the package is packaged and installed.

Sources