Quando usar o Yarn em vez do NPM? Quais são as diferenças?

99

Quais são as diferenças entre Yarn e NPM? No momento em que escrevo esta pergunta, só consigo encontrar alguns artigos na Internet mostrando qual é o equivalente Yarn de um comando NPM como este .

Eles têm as mesmas funcionalidades (eu sei que o Yarn faz cache local e parece que você só precisa baixar um pacote uma vez), mas, além disso, há algum benefício em mudar de NPM para Yarn?

Asha
fonte
11
Esta não é uma pergunta ruim e não merece um voto negativo. Dito isso, ele precisa ser um pouco mais elaborado para ser uma pergunta realmente boa.
jedd.ahyoung
Um rápido Google mostra isso . Eu acredito que isso é provavelmente muito amplo / não construtivo para StackOverflow e poderia ser feito com um pouco mais de pesquisa mostrada de qualquer maneira.
Aurora0001
1
@ Aurora0001 quando fiz uma busca, vi o cheatsheet, mas essa não é a resposta à minha pergunta! Eu quero saber as diferenças entre os dois e não as diferenças entre os comandos. Leia minha pergunta primeiro
Asha
4
@Asha Você deve editar sua pergunta para ter mais detalhes e mostrar o que você já pesquisou. Que tipo de diferenças você está procurando? Você está tentando descobrir como as bibliotecas são implementadas? Você está tentando descobrir como eles diferem na abordagem do problema? Se você tornar sua pergunta mais precisa, pode ser bom, dependendo do que você está perguntando. (Dependendo do que você está perguntando, as informações podem já estar disponíveis no Google.)
jedd.ahyoung
3
pessoas engraçadas dizem para você procurar no Google; Achei sua pergunta indo para o google ... pessoas em stackoverflow gostam de excluir coisas demais, como se isso as tornasse mais importantes, eu acho.
jairhumberto de

Respostas:

67

ATUALIZAÇÃO: março de 2018 (um pouco tarde ...)

Desde a versão 5, npm

  • gera um 'arquivo de bloqueio' chamado package-lock.jsonque corrige toda a sua árvore de dependências da mesma forma que o mecanismo de bloqueio yarn (ou qualquer outro) faz,
  • Uma ferramenta foi feita
  • --save agora está implícito para npm i
  • Melhor uso de rede e cache

O npm 5.7.0 introduziu ainda o npm cicomando para instalar dependências mais rapidamente em um ambiente de integração contínua, instalando apenas os pacotes encontrados no package-lock.json(relatando um erro se o package-lock.jsone package.jsonnão estiverem sincronizados).

Pessoalmente , ainda uso npm.


Original

Estou detestam para citar directamente a partir de docs, mas eles fazem um grande trabalho de explicar por que, de forma concisa o suficiente para que eu não vejo como resumir ainda mais as idéias.

Largamente:

  1. Você sempre sabe que está obtendo a mesma coisa em todas as máquinas de desenvolvimento

  2. Ele paraleliza operações que npmnão, e

  3. Isso torna o uso da rede mais eficiente.

  4. Ele também pode fazer um uso mais eficiente de outros recursos do sistema (como RAM) .

Quais são as experiências de produção das pessoas com ele? Quem sabe, é uma criança para o público em geral.

TL; DR de Yehuda Katz :

Desde o início, o arquivo de bloqueio do Yarn garante que executar repetidamente o yarn no mesmo repositório resulta nos mesmos pacotes.

Em segundo lugar, o Yarn tenta ter um bom desempenho, com um cache frio, mas especialmente com um cache quente.

Por fim, o Yarn torna a segurança um valor fundamental.

Boa postagem no blog

NPM vs Yarn Cheat Sheet ” por Gant Laborde

Versão um pouco mais longa do projeto :

Rápido: o Yarn armazena em cache cada pacote que baixa para que nunca precise fazer isso novamente. Ele também paraleliza as operações para maximizar a utilização de recursos, de forma que os tempos de instalação sejam mais rápidos do que nunca.

Confiável: usando um formato de arquivo de bloqueio detalhado, mas conciso, e um algoritmo determinístico para instalações, o Yarn é capaz de garantir que uma instalação que funcionou em um sistema funcionará exatamente da mesma maneira em qualquer outro sistema.

Seguro: o Yarn usa somas de verificação para verificar a integridade de cada pacote instalado antes que seu código seja executado.

E do README.md :

  • Modo offline: se você já instalou um pacote antes, pode instalá-lo novamente sem nenhuma conexão com a Internet.
  • Determinística: as mesmas dependências serão instaladas da mesma maneira em todas as máquinas, independentemente da ordem de instalação.
  • Desempenho da rede: o Yarn enfileira com eficiência as solicitações e evita cascatas de solicitações para maximizar a utilização da rede.
  • Registros múltiplos: instale qualquer pacote do npm ou do Bower e mantenha o fluxo de trabalho do pacote.
  • Resiliência da rede: uma única falha de solicitação não causará falha na instalação. As solicitações são repetidas em caso de falha.
  • Modo simples: resolva versões incompatíveis de dependências para uma única versão para evitar a criação de duplicatas.
  • Mais emojis. 🐈
Msanford
fonte
Você pode me dizer se o yarn tem resolução de dependências como o npm v3 ? Eu entendo que existe uma --flatopção que força uma estrutura plana real onde apenas uma versão de cada dependência pode ser instalada, mas qual é o comportamento padrão nisso? Obrigado.
Dimitris Karagiannis
2
Mais emoji: gato:
Huei Tan
7
Excelente resposta. Eu me pergunto se eles tentaram contribuir com o npm antes de bifurcar, renomear e alterar a sintaxe do install -g.
Gardner Bickford
muito bom post scotch.io/tutorials/…
Akshay Vijay Jain
2

npm :

  1. O gerenciador de pacotes para JavaScript. npm é a interface de linha de comando para o ecossistema npm. Ele é testado em batalha, surpreendentemente flexível e usado por centenas de milhares de desenvolvedores de JavaScript todos os dias.
  2. O NPM gera um arquivo de bloqueio correto, enquanto um arquivo de bloqueio do Yarn pode estar corrompido em alguns casos e deve ser consertado com ferramentas do yarn

Fios :

  1. Um novo gerenciador de pacotes para JavaScript. O Yarn armazena em cache cada pacote que baixa para que nunca precise fazer isso novamente. Ele também paraleliza as operações para maximizar a utilização de recursos, de forma que os tempos de instalação sejam mais rápidos do que nunca.
  2. Yarn não oferece suporte para login com senha (enquanto NPM faz)
Yogesh Waghmare
fonte
1
que tipo de logins?
Rich Stone
2

O que é PNPM?

pnpmusa links físicos e links simbólicos para salvar uma versão de um módulo apenas uma vez no disco. Ao usar npm ou Yarn, por exemplo, se você tiver 100 projetos usando a mesma versão do lodash, terá 100 cópias do lodash no disco. Com o pnpm, o lodash será salvo em um único lugar no disco e um link físico o colocará nos node_modules onde deve ser instalado.

Como resultado, você economiza gigabytes de espaço em seu disco e tem instalações muito mais rápidas! Se você quiser mais detalhes sobre a estrutura exclusiva de node_modules que o pnpm cria e por que funciona bem com o ecossistema Node.js, leia este pequeno artigo: Por que devemos usar o pnpm?

Como instalar o PNPM?

npm install -g pnpm

Como instalar o pacote npm usando PNPM?

pnpm install -g typescript // or your desired package

Benefícios de PNPMmais YarneNPM

Aqui está a barra de progresso mostrando o tempo de instalação gasto por NPM, YARNe PNPM(uma barra mais curta é melhor) insira a descrição da imagem aqui

Clique para verificar o benchmark completo

para obter mais detalhes, visite https://www.npmjs.com/package/pnpm

WasiF
fonte
1

Quando você instala um pacote usando Yarn (usando yarn add packagename), ele coloca o pacote em seu disco . Durante a próxima instalação, este pacote será usado em vez de enviar uma solicitação HTTP para obter o tarball do registro.

O Yarn vem com um verificador de licença útil , que pode se tornar muito poderoso caso você precise verificar as licenças de todos os módulos dos quais depende.

Se você estiver trabalhando com software proprietário, realmente não importa qual você usar. Com npm, você pode usar npm-shrinkwrap.js, enquanto você pode usar yarn.lock com Yarn.

Para obter mais informações, leia o seguinte blog

https://blog.risingstack.com/yarn-vs-npm-node-js-package-managers/

Ganesh Kalje
fonte
1

Tentando dar uma visão geral melhor para iniciantes.

O npm tem sido historicamente (2010) o gerenciador de pacotes mais popular para JavaScript. Se você quiser usá-lo para gerenciar as dependências do seu projeto, pode digitar o seguinte comando:

npm init

Isso irá gerar um package.jsonarquivo. Ele contém todas as dependências do projeto.

Então

npm install

criaria um diretório node_modulese baixaria as dependências (que você adicionou ao package.jsonarquivo) dentro dele.

Ele também criará um package-lock.jsonarquivo. Este arquivo é usado para descrever a árvore de dependências que foi gerada. Ele permite que os desenvolvedores instalem exatamente as mesmas dependências. Por exemplo, você pode imaginar um desenvolvedor atualizando uma dependência para v2 e v3, enquanto outro atualiza diretamente para v3.

O npm instala dependências de uma forma não determinística, o que significa que os dois desenvolvedores podem ter um node_modulesdiretório diferente , resultando em comportamentos diferentes . ** O npm sofreu má reputação como, por exemplo, em fevereiro de 2018: um problema foi descoberto na versão 5.7.0 em que a execução de sudo npm em sistemas Linux alteraria a propriedade dos arquivos do sistema, interrompendo permanentemente o sistema operacional.

Para resolver esses problemas e outros, Facebook introduziu um novo gerenciador de pacotes (2016): Fios de uma mais rápida, mais segura e mais confiável Package Manager para JavaScript.

Você pode adicionar Yarn a um projeto digitando:

yarn init

Isso criará um package.jsonarquivo. Em seguida, instale as dependências com:

yarn install

Uma pasta node_modulesserá gerada. O Yarn também irá gerar um arquivo chamado yarn.lock. Este arquivo tem a mesma finalidade que o, package-lock.jsonmas é construído usando um algoritmo determinístico e confiável, levando a compilações consistentes.

Se você iniciou um projeto com o npm , pode realmente migrar para o Yarn facilmente. o fio vai consumir o mesmo package.json. Consulte Migrando do npm para obter mais detalhes.

No entanto, o npm foi aprimorado a cada novo lançamento e alguns projetos ainda usam o npm ao invés do yarn .

Mathieu Gemard
fonte
1

A resposta de @msanford cobre quase tudo, no entanto, estou perdendo a parte de segurança (Vulnerabilidades conhecidas do OWASP).

Fio

Você pode verificá-los usando yarn audit, no entanto, não pode corrigi-los. Este ainda é um problema aberto em um GitHub ( https://github.com/yarnpkg/yarn/issues/7075 ).

npm

Você pode usar npm audit fix, então alguns deles você mesmo pode consertar.

Ambos, ou seja, npm audit& yarn audittêm suas próprias ferramentas de integração contínua. Eles são respectivamente https://github.com/IBM/audit-ci (usado, funciona muito bem!) E https://yarnpkg.com/package/audit-ci (não usado).

Daniel Danielecki
fonte