Il existe de nombreuses façons de créer un dossier node_modules. Votre objectif doit être de créer le plus strict, mais si ce n'est pas possible, il y a aussi des options pour faire un node_modules en vrac.
Configuration par défaut
Par défaut, pnpm v5 créera un node_modules semi-strict. Semi-strict signifie que votre application ne pourra require que des packages ajoutés en tant que dépendances au package.json
(à quelques exceptions près). Cependant, vos dépendances pourront accéder à tous les packages.
La configuration par défaut ressemble à ceci:
; Tous les packages sont hissés vers node_modules/.pnpm/node_modules
hoist-pattern[]=*
; Tous les types sont hissés à la racine afin de rendre TypeScript heureux
public-hoist-pattern[]=*types*
; Tous les packages liés à ESLint sont également hissés à la racine
public-hoist-pattern[]=*eslint*
Plug'n'Play. La configuration la plus stricte
pnpm prend en charge Yarn's Plug'n'Play depuis la version 5.9. Avec PnP, votre application et les dépendances de votre application n'auront accès qu'à leurs dépendances déclarées. C'est encore plus strict que de définir hoist=false
car à l'intérieur d'un monorepo, votre application ne pourra même pas accéder aux dépendances du projet racine.
Pour utiliser Plug'n'Play, définissez ces paramètres:
node-linker=pnp
symlink=false
Un répertoire de node_modules strict et traditionnel
Si vous n'êtes pas encore prêt à utiliser PnP, vous pouvez toujours être strict et autoriser uniquement les packages à accéder à leurs propres dépendances en définissant la configuration de hoist sur false:
hoist=false
Cependant, si certaines de vos dépendances tentent d'accéder à des packages qui ne figurent pas dans leurs dépendances, vous avez deux options:
Créez un
pnpmfile.js
et utilisez un crochet pour ajouter la dépendance manquante au manifeste du package.Ajoutez un pattern au paramètre
hoist-pattern
. Par exemple, si le module non trouvé estbabel-core
, ajoutez le paramètre suivant à.npmrc
:hoist-pattern[]=babel-core
Le pire des cas - hisser à la racine
Certains outils peuvent ne pas fonctionner même avec la configuration par défaut de pnpm, qui héberge tout à la racine du magasin virtuel et quelques packages à la racine. Dans ce cas, vous pouvez hisser tout ou un sous-ensemble de dépendances à la racine du répertoire des modules.
Tout hisser à la racine de node_modules :
shamefully-hoist=true
Ne hisser que les packages qui correspondent à un modèle:
public-hoist-pattern[]=babel-*