npm (Node Package Manager) é o gerenciador de pacotes padrão da plataforma Node.js, incluído na instalação do Node.js. O npm gerencia dependências de projetos JavaScript e TypeScript: instala bibliotecas em node_modules, atualiza versões de pacotes, resolve conflitos de versões. O package.json é o arquivo de configuração central com metadados e lista de dependências. O npm Registry é o maior registro de pacotes. Saiba mais em npm Registry.
Pontos-chave
npm foi criado em 2010 por Isaac Schlueter como uma solução para gerenciar dependências do Node.js. Desde 2014, o npm é gerenciado pela npm, Inc., adquirida pela Microsoft/GitHub em 2020. A ferramenta consiste em duas partes: a CLI (linha de comando) para instalar e gerenciar pacotes, e o Registry — o repositório central de todos os módulos publicados em registry.npmjs.org.
O npm Registry é o maior registro de pacotes: mais de 2 milhões de pacotes e mais de 10 bilhões de downloads mensais. Cada pacote tem uma versão SemVer, descrição, dependências, licença e autoria. A publicação do seu próprio pacote é feita via npm publish. O npm suporta pacotes com escopo para organizações (@scope/package), registros privados e auditoria de segurança integrada.
Node.js versão 18+ inclui npm 9+ com desempenho melhorado, workspaces para monorepositórios e um mecanismo de dependências pares reformulado. O ecossistema npm abrange JavaScript do lado do servidor, frontend (React, Vue, Angular), desenvolvimento móvel (React Native), ferramentas de compilação (Webpack, Vite) e utilitários CLI. O npm é o canal principal de distribuição de bibliotecas JavaScript.
npm install — o comando principal que lê o package.json e o package-lock.json para instalar todas as dependências em node_modules. Na primeira execução, o npm calcula o grafo de dependências, resolve conflitos de versões e gera o package-lock.json. O comando npm install <package> instala um pacote específico; a flag --save-dev o adiciona a devDependencies, --global instala globalmente.
npx — um executor de pacotes incluído no npm desde a versão 5.2. O npx permite executar utilitários CLI sem instalação global: npx react-native init ou npx create-react-app my-app. O npx baixa o pacote para um cache temporário, executa e limpa após a conclusão. O npx também é útil para executar versões específicas de ferramentas.
npm audit escaneia a árvore de dependências em busca de vulnerabilidades conhecidas da base de dados do npm. O comando gera um relatório com níveis de gravidade (critical, high, moderate) e recomenda npm audit fix para atualizar automaticamente pacotes vulneráveis. npm cache armazena pacotes baixados localmente. npm cache clean --force limpa o cache quando há problemas de instalação. npm outdated mostra pacotes desatualizados.
# Comandos básicos do npm
$ npm install
$ npm install react-native-webview --save
$ npm install typescript --save-dev
# Execução sem instalação global
$ npx react-native init MyApp
# Auditoria de segurança
$ npm audit --fix
package.json é um arquivo JSON na raiz do projeto que descreve seus metadados, dependências e configuração. Campos obrigatórios: name (nome único do pacote) e version (versão SemVer, por exemplo 1.0.0). O arquivo é criado com npm init -y para inicialização rápida ou manualmente.
Semantic Versioning (SemVer) é um padrão de versionamento no formato MAJOR.MINOR.PATCH. A versão principal muda com alterações incompatíveis de API, a menor ao adicionar funcionalidade (compatível com versões anteriores) e o patch ao corrigir bugs. O símbolo ^ antes da versão permite atualizações menores e de patch, enquanto ~ permite apenas atualizações de patch.
{
"name": "my-app",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"react": "^18.3.0",
"react-native": "^0.76.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"@types/react": "^18.3.0"
}
}
| Campo | Propósito | Valor de exemplo |
|---|---|---|
| scripts | Comandos de execução para npm run | "start": "node index.js" |
| dependencies | Dependências de produção da aplicação | "react": "^18.3.0" |
| devDependencies | Ferramentas de desenvolvimento e teste | "jest": "^29.7.0" |
| peerDependencies | Dependências anfitriãs para bibliotecas | "react": ">=17.0.0" |
| engines | Requisitos de versão do Node.js | {"node": ">=18.0.0"} |
Projetos React Native usam ativamente o npm para gerenciamento de dependências. O conjunto padrão inclui react, react-native, bibliotecas de navegação (React Navigation), de requisições HTTP (axios), de gerenciamento de estado (Redux, Zustand) e componentes de UI. O npm permite instalar milhares de pacotes compatíveis do registro.
npx pod-install — um comando obrigatório após instalar módulos nativos no React Native para iOS. O npm gera automaticamente um Podfile.lock com base no package-lock.json. Em projetos Expo, usa-se expo install em vez de npm install, pois ele seleciona versões compatíveis com a versão atual do Expo SDK.
Conflitos de versões são um problema comum no React Native: react-native-reanimated, react-native-gesture-handler e react-native-safe-area-context exigem versões alinhadas. A solução é atualizar todos os pacotes para as versões compatíveis mais recentes ou usar --legacy-peer-deps. O package-lock.json é fundamental para módulos nativos compilados via CocoaPods e Gradle.
npm é o gerenciador de pacotes padrão incluído com o Node.js. As principais alternativas: yarn (criado pelo Facebook em 2016) e pnpm (rápido, com links físicos). Desde o npm 5, a diferença em velocidade e funcionalidade entre npm e yarn é mínima. O npm 7+ adicionou workspaces, tornando-o competitivo para monorepositórios.
| Característica | npm | yarn | pnpm |
|---|---|---|---|
| Ano de criação | 2010 | 2016 | 2017 |
| Arquivo de bloqueio | package-lock.json | yarn.lock | pnpm-lock.yaml |
| Instalação | Sequencial (npm 5+) | Paralela | Paralela |
| Espaço em disco | Padrão | Padrão | Mínimo (links) |
| Workspaces | Sim (npm 7+) | Sim | Sim |
| Plug'n'Play | Não | Sim | Não |
De acordo com o State of JS 2025: 62% dos desenvolvedores usam npm, 35% usam yarn (principalmente projetos antigos e entusiastas do PnP) e 3% usam pnpm. Para projetos React Native, ambas as ferramentas são igualmente viáveis, mas o npm é mais comum em projetos com Expo SDK 50+ e novas inicializações React Native.
yarn mantém sua vantagem em monorepositórios extremamente grandes (100+ pacotes) graças à sua implementação mais madura de workspaces e Plug'n'Play. O pnpm vence na economia de espaço em disco através de links físicos para um armazenamento global. A escolha do gerenciador depende das preferências da equipe e da infraestrutura.
Perguntas frequentes
npm install atualiza o package-lock.json e pode instalar novas versões menores dentro do intervalo semântico. npm ci (Clean Install) remove node_modules e instala pacotes estritamente a partir do package-lock.json sem atualizá-lo. O npm ci é mais rápido, usado em CI/CD e garante um ambiente idêntico em todas as máquinas. Se o package-lock.json estiver ausente, o npm ci gera um erro.
Desde o npm 7, conflitos de dependências pares causam erros de compilação. Soluções: atualizar todos os pacotes para versões compatíveis via npm update, usar a flag --legacy-peer-deps para o modo npm 6, ou adicionar uma seção overrides no package.json para forçar a versão de um pacote específico. A melhor opção é atualizar as dependências para versões compatíveis.
npm audit escaneia a árvore de dependências em busca de vulnerabilidades conhecidas do banco de dados npm Security Advisory. O comando gera um relatório com nível de gravidade (critical, high, moderate, low) e recomenda npm audit fix para atualizar automaticamente pacotes vulneráveis para versões seguras. Executar o npm audit regularmente é uma prática básica de segurança em projetos JavaScript.
npm workspaces permite gerenciar vários pacotes em um único repositório. Adicione o campo "workspaces": ["packages/*"] ao package.json raiz. Benefícios: instalação única de todas as dependências em um node_modules compartilhado, links simbólicos automáticos entre pacotes locais, execução de scripts para todos os pacotes a partir da raiz e eliminação da duplicação de versões.
package-lock.json bloqueia as versões exatas de todas as dependências e seus pacotes transitivos. Sem ele, diferentes desenvolvedores e servidores CI podem obter versões diferentes de bibliotecas dentro do intervalo semântico, levando a erros de «funciona na minha máquina». Confirmar o arquivo de bloqueio garante compilações reproduzíveis e comportamento idêntico em todos os ambientes.
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