yarn — um gerenciador de pacotes alternativo para Node.js, criado pelo Facebook em conjunto com Exponent, Google e Tilde em 2016. O yarn resolveu os problemas de velocidade e segurança do npm 2-4: instalação paralela, arquivo de bloqueio rigoroso e cache offline. Hoje o yarn continua popular no React Native, Expo e monorepos. Saiba mais em yarn Documentation.
Principais pontos
yarn (Yet Another Resource Negotiator) foi lançado em outubro de 2016 como resposta do Facebook aos problemas do npm 2-4: instalação lenta, falta de arquivo de bloqueio e pacotes inseguros. O yarn introduziu downloads paralelos de pacotes, yarn.lock determinístico e verificação de integridade através de checksums. Em 2020, o yarn fez a transição para a versão 2 (Berry) com Plug'n'Play e abordagem TypeScript-first.
A arquitetura do yarn difere do npm: o yarn baixa pacotes em paralelo (npm antes da versão 5 — sequencialmente), armazena em cache cada pacote em ~/.cache/yarn sem duplicação entre projetos e verifica a integridade via checksums. O yarn sempre gera yarn.lock a cada instalação, enquanto o package-lock.json no npm só apareceu na versão 5.
A partir do yarn 2 (Berry, 2020), o yarn foi completamente reescrito em TypeScript e suporta Plug'n'Play, workspaces, constraints para monorepos e protocolos de instalação de diferentes fontes (npm, git, tarball). O yarn 3+ (2022) adicionou Zero-Installs — armazenar o cache no repositório para instalação instantânea sem acesso à rede.
yarn install — o comando principal que lê package.json e yarn.lock e instala as dependências. O yarn baixa pacotes em paralelo, o que acelera a instalação em 2-3 vezes comparado ao npm 4 e versões anteriores. O yarn usa cache offline: se um pacote já foi baixado em outro projeto, ele é copiado do cache em vez de ser baixado novamente.
# Comandos básicos do yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Atualização interativa
$ yarn upgrade-interactive
# Remover pacotes duplicados
$ yarn dedupe
yarn add — o comando para instalar um novo pacote. yarn add <package> adiciona a dependencies, yarn add --dev — a devDependencies. O yarn atualiza automaticamente o yarn.lock. yarn upgrade atualiza pacotes para as versões mais recentes dentro do intervalo semântico. yarn upgrade-interactive — um modo interativo para selecionar pacotes específicos para atualizar.
yarn cache — um cache global em ~/.cache/yarn/v6. Cada pacote é armazenado uma vez em um arquivo ZIP com checksum. O cache do yarn é limpo automaticamente, mas você pode executar yarn cache clean manualmente. yarn cache dir mostra o caminho do cache. yarn cache list — lista pacotes em cache.
yarn.lock — um arquivo de bloqueio que registra as versões exatas de todas as dependências e seus pacotes transitivos. Ao contrário do package-lock.json (JSON), o yarn.lock usa formato YAML com estrutura plana. O yarn.lock é sempre gerado automaticamente durante yarn install ou yarn add — isso garante que todos os desenvolvedores e servidores CI obtenham um conjunto idêntico de pacotes.
# Estrutura de exemplo do yarn.lock
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
Campos do yarn.lock: version — versão exata do pacote, resolution — fonte e versão, dependencies — suas dependências, checksum — checksum para verificação. O yarn.lock é commitado no repositório e é a única fonte de verdade para dependências. Se yarn.lock e package.json divergirem, o yarn emite um aviso.
Yarn constraints — um sistema de regras para monorepos que verifica e impõe versões de dependências no yarn.lock. As constraints são descritas no arquivo yarn.constraints.js usando Yarn Constraint Language. As constraints permitem garantir que todos os pacotes em um monorepo usem a mesma versão de React ou TypeScript.
React Native tradicionalmente tem sido intimamente ligado ao yarn. Expo CLI, React Native CLI e Create React Native App usavam yarn inicialmente. Em projetos React Native, o yarn.lock fixa as versões dos módulos nativos, o que é criticamente importante para compilação estável via CocoaPods (iOS) e Gradle (Android). yarn workspaces são populares em monorepos React Native com código compartilhado.
yarn workspaces em monorepos React Native: o package.json raiz contém "workspaces": ["packages/*", "mobile"]. yarn install cria uma única pasta node_modules no nível raiz. Os pacotes referenciam uns aos outros através de symlinks. npx pod-install é executado após alterar dependências nativas para atualizar CocoaPods.
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+ recomenda oficialmente yarn para novos projetos criados via npx create-expo-app. O yarn garante compatibilidade com módulos Expo e gera automaticamente o yarn.lock correto. Zero-Installs no yarn 3+ permite comitar o cache no repositório — os desenvolvedores obtêm um ambiente pronto para uso sem instalar dependências após git clone.
npm e yarn resolvem o mesmo problema — gerenciar pacotes Node.js. Com o lançamento do npm 5-7, a lacuna funcional praticamente desapareceu. O npm 7+ inclui workspaces, npm ci (equivalente a yarn install --frozen-lockfile) e instalação paralela. No entanto, o yarn mantém vantagens em cenários específicos: Plug'n'Play, Zero-Installs e um sistema maduro de constraints.
| Característica | npm | yarn |
|---|---|---|
| Ano de criação | 2010 | 2016 |
| Arquivo de bloqueio | package-lock.json (JSON) | yarn.lock (YAML) |
| Instalação | Sequencial (npm 5+) | Paralela |
| Plug'n'Play | Não | Sim (yarn 2+) |
| Workspaces | Sim (npm 7+) | Sim |
| Zero-Installs | Não | Sim (yarn 3+) |
| Cache | node_modules com flattening | Global ~/.cache/yarn |
| Linguagem de implementação | JavaScript | TypeScript (yarn 2+) |
Quando escolher yarn: projetos no Expo SDK 50+, grandes monorepos (100+ pacotes), equipes que valorizam Zero-Installs para configuração rápida de ambiente e projetos legados que já usam yarn. Quando escolher npm: projetos padrão create-react-app, Next.js, Vite, equipes sem requisitos específicos de gerenciador de pacotes.
yarn 4 (2024) introduziu desempenho melhorado, suporte nativo a ESM e otimização para grandes monorepos. O npm 10+ continua evoluindo com foco em segurança e compatibilidade. A escolha entre npm e yarn hoje é uma questão de preferências da equipe e requisitos específicos do projeto, não superioridade técnica de uma ferramenta sobre outra.
Perguntas frequentes
yarn inicialmente superou o npm em velocidade graças à instalação paralela de pacotes e cache agressivo. O yarn.lock é gerado automaticamente a cada instalação, enquanto o package-lock.json apareceu no npm 5. O yarn oferece Plug'n'Play — uma alternativa ao node_modules com tempo de instalação zero. Com npm 7+, a diferença em velocidade e funcionalidade para cenários básicos é mínima.
yarn workspaces — um mecanismo para gerenciar múltiplos pacotes em um único repositório. O package.json raiz contém o campo "workspaces": ["packages/*"]. O yarn install instala dependências compartilhadas no nível superior em um único node_modules, cria symlinks entre pacotes locais e evita duplicação. Comandos são executados para todos os workspaces via yarn workspaces run <script>.
Plug'n'Play (PnP) — uma alternativa à pasta node_modules tradicional, introduzida no yarn 2. Em vez de copiar arquivos, o yarn cria um mapa de dependências em .pnp.cjs e armazena pacotes em arquivos ZIP em cache global. Vantagens do PnP: instalação em segundos, tempo de inicialização do Node.js reduzido em 30-50%, sem node_modules e problemas de caminho associados.
Instale o yarn globalmente: npm install -g yarn. Na raiz do projeto, execute yarn import — o yarn lê package-lock.json e cria um yarn.lock equivalente. Exclua node_modules e package-lock.json, execute yarn install para verificar. Atualize a configuração CI/CD substituindo npm por yarn. O yarn é totalmente compatível com package.json.
O erro "Integrity check failed" ocorre quando yarn.lock e node_modules estão dessincronizados. Solução: exclua node_modules, yarn.lock e limpe o cache (yarn cache clean), depois execute yarn install novamente. Para conflitos de versão, use yarn upgrade-interactive para selecionar atualizações específicas. yarn dedupe removerá pacotes duplicados.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também