Corrigindo erro “ReferenceError: primordials is not defined”

Fala pessoal, tudo bem?

Passando aqui para deixar uma dica que quase acabou com meu dia. Estava com meu node na versão 8.0.6 (eu sei, era antigo), mas para meu contexto de trabalho atual estava atendendo perfeitamente :).

Usava o node v8 com Gulp 3 para automatizar as tarefas como: minificação de CSS, JS, HTML e outras coisas.

Fui estudar algumas coisas mais avançar e tive que atualizar o node para versão 12 e para minha surpresa todas as minhas automações feitas no Gulp 3 passaram a ter problemas.

O erro que estava recebendo no terminal era ReferenceError: primordials is not defined.

Se você também recebeu essa mensagem ao executar o Gulp. Certamente, você está no gulp v3node v12.

O problema é que o gulp v3 não funciona mais no node v12, porque tem dependência do graceful-fs@^3.0.0 que remenda o módulo fs, esse remendo funcionava muito bem antes da versão node v12.

Esse é um problema conhecido pela comunidade e cheguei a conclusão que pode ser resolvido de duas formas, vamos ver quais são elas :).

  1. Reescrever toda a automação feita no Gulp 3 usando o novo padrão do Gulp 4.
    Gulp 4 é totalmente compatível com as novas versões do node e pode resolver o problema, parece uma solução bem simples porém dependendo do contexto pode ser totalmente inviável.
  2. Que basicamente é fixar o graceful-fs a versão 4.2.2, para que funciona normalmente sem reescrever a aplicação.

 

Vamos resolver, é bem simples:

Precisamos criar um arquivo npm-shrinkwrap, caso não saiba esse arquivo permite bloquear as versões dos pacotes instalados e seus pacotes descendentes.

Tudo que for colocando neste arquivo não será substituído pelas dependências do Qualquer coisa especificado neste arquivo não pode ser substituído pelas dependências informadas no tradicional arquivo package.json, as demais dependências que você possui no package.json pode manter normalmente.

Criando o arquivo:

1. No mesmo diretório onde temos o arquivopackage.jsoné preciso criar o arquivo npm-shrinkwrap.json com o seguinte conteúdo:

{
  "dependencies": {
    "graceful-fs": {
        "version": "4.2.2"
     }
  }
}


2.  Basta rodar o comando npm install ao fazer isso o arquivo npm-shrinkwrap.json será atualizado com outras dependências, mas é normal.

3. Por fim, basta executar o seu gulp, se tudo sair como esperado você deve conseguir voltar a usar novamente o Gulp v3 em versões menores de 12.

Extra - Parece uma boa prática:

Pesquisando mais sobre melhoras as versões do node, eu encontrei o NPX. Basicamente o NPX é um gerenciador de versões e permite você usar dependências em versões diferentes de cada projeto, pode usar até o node numa versão diferente.

Eu particularmente ainda não testei, mas gostei muito da ideia.
Espero que consiga resolver seu problema e qualquer coisa deixa um comentário.

Até mais, bons projetos e estudos!