Existem diversas maneiras de criar um diretório node_modules. Seu objetivo deve ser criar o mais estrito, mas caso não seja possível, há opções para criar um node_modules solto também.
A configuração padrão
Por padrão, o pnpm v5 criará um node_modules semi-estrito. Semi-estrito significa que sua aplicação só poderá requisitar pacotes inclusos como dependência ao package.json
(com algumas exceções). No entanto, suas dependências poderão acessar qualquer pacote.
A configuração padrão fica assim:
; Todos os pacotes são hoisted(elevados) ao node_modules/.pnpm/node_modules
hoist-pattern[]=*
; Todos os tipos são hoisted(elevados) à raiz para satisfazer o TypeScript
public-hoist-pattern[]=*types*
; Todos os pacotes relacionados ao ESLint são hoisted(elevados) à raiz também
public-hoist-pattern[]=*eslint*
Plug'n'Play. A configuração mais rígida
O pnpm suporta Plug'n'Play do Yarn desde a versão v5.9. Com o PnP, tanto sua aplicação quanto as dependências terão acesso apenas às dependências declaradas. Isso é ainda mais restrito do que setar hoist=false
porque, dentro de um monorepo, a sua aplicação não ter acesso até para as dependencias do projeto raiz.
Para usar o Plug'n'Play, defina estas configurações:
node-linker=pnp
symlink=false
Um diretório de módulos estrito e tradicional
Caso não esteja pronto para usar o PnP, ainda é possível ser estrito e permitir que pacotes acessem apenas suas próprias dependências definindo a configuração do hoist como falsa:
hoist=false
No entando, se algumas de suas dependências estão tentando acessar pacotes que não possuem nas depedências, há duas opções:
Crie um
pnpmfile.js
e use um hook para adicionar a dependência que falta ao manifesto do pacote.Adicione um padrão à configuração do
hoist-pattern
. Por exemplo, se o módulo não encontrado foibabel-core
, adicione a seguinte configuração ao.npmrc
:hoist-pattern[]=babel-core
O pior caso — hoisting(elevação) à raiz
Algumas ferramentas podem não funcionar, mesmo com a configuração padrão do pnpm, que move tudo para a raiz da loja virtual e alguns pacotes para a raiz. Nesse caso, é possível fazer um hoist(elevar) tudo ou apenas uma parte das dependências à raiz do diretório de módulos.
Mover tudo para a raiz:
shamefully-hoist=true
Fazer hoisting(elevar) apenas os pacotes que correspondem a um padrão:
public-hoist-pattern[]=babel-*