Zephyrnet Logo

Um guia para iniciantes do npm, o Node Package Manager

Data:

O Node.js torna possível escrever aplicativos em JavaScript no servidor. É construído no Tempo de execução do JavaScript V8 e escrito em C ++ - por isso é rápido. Originalmente, pretendia ser um ambiente de servidor para aplicativos, mas os desenvolvedores começaram a usá-lo para criar ferramentas que os ajudassem na automação de tarefas locais. Desde então, todo um novo ecossistema de ferramentas baseadas em Node (como Grunhido, Gole e webpack) evoluiu para transformar a face do desenvolvimento de front-end.

Para fazer uso dessas ferramentas (ou pacotes) no Node.js, precisamos ser capazes de instalá-los e gerenciá-los de uma forma útil. É aqui que entra o npm, o gerenciador de pacotes do Node. Ele instala os pacotes que você deseja usar e fornece uma interface útil para trabalhar com eles.

Neste guia, veremos os fundamentos do trabalho com o npm. Mostraremos como instalar pacotes no modo local e global, bem como excluir, atualizar e instalar uma determinada versão de um pacote. Também mostraremos como trabalhar com package.json para gerenciar as dependências de um projeto. Se você gosta mais de vídeos, por que não se inscreve no SitePoint Premium e assiste ao nosso screencast grátis: O que é npm e como posso usá-lo?

Mas antes de começarmos a usar o npm, primeiro temos que instalar o Node.js em nosso sistema. Vamos fazer isso agora.

Instalando Node.js

Vá para o Node.js página de download e pegue a versão de que você precisa. Existem instaladores Windows e Mac disponíveis, bem como binários Linux pré-compilados e código-fonte. Para Linux, você também pode instalar o Node por meio do gerenciador de pacotes, conforme descrito aqui.

Para este tutorial, usaremos a v12.15.0. No momento em que escrevo, este é o atual Versão de suporte de longo prazo (LTS) do Node.

Dica: você também pode considerar instalar o Node usando um gerenciador de versão. Isso nega o problema de permissões levantado na próxima seção.

Vamos ver onde o nó foi instalado e verificar a versão:

$ which node
/usr/bin/node
$ node --version
v12.15.0

Para verificar se sua instalação foi bem-sucedida, vamos dar uma chance ao REPL do Node:

$ node
> console.log('Node is running');
Node is running
> .help
.break Sometimes you get stuck, this gets you out
.clear Alias for .break
.editor Enter editor mode
.exit Exit the repl
.help Print this help message
.load Load JS from a file into the REPL session
.save Save all evaluated commands in this REPL session to a file Press ^C to abort current expression, ^D to exit the repl

A instalação do Node.js funcionou, então agora podemos concentrar nossa atenção no npm, que foi incluído na instalação:

$ which npm
/usr/bin/npm
$ npm --version
6.13.7

Atualizando npm

O npm, que originalmente significava Node Package Manager, é um projeto separado do Node.js. Ele tende a ser atualizado com mais frequência. Você pode verificar a versão npm mais recente disponível neste página. Se você perceber que tem uma versão mais antiga, pode atualizar da seguinte maneira.

Para usuários de Linux e Mac, use o seguinte comando:

npm install -g npm@latest

Para usuários do Windows, o processo pode ser um pouco mais complicado. Isso é o que diz no página inicial do projeto:

Muitas melhorias para usuários do Windows foram feitas no npm 3 - você terá uma experiência melhor se executar uma versão recente do npm. Para atualizar, use Ferramenta de atualização da Microsoft, baixe uma nova versão do Nodeou siga as instruções de atualização do Windows no Instalando / atualizando npm postar.

Para a maioria dos usuários, a ferramenta de atualização será a melhor aposta. Para usá-lo, você precisará abrir o PowerShell como administrador e executar o seguinte comando:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force

Isso garantirá que você possa executar scripts em seu sistema. Em seguida, você precisará instalar o npm-windows-upgrade ferramenta. Depois de instalar a ferramenta, você precisa executá-la para que possa atualizar o npm para você. Faça tudo isso no console elevado do PowerShell:

npm install --global --production npm-windows-upgrade
npm-windows-upgrade --npm-version latest

Módulos empacotados de nós

O npm pode instalar pacotes no modo local ou global. No modo local, ele instala o pacote em um node_modules pasta em seu diretório de trabalho pai. Este local pertence ao usuário atual.

Se você não estiver usando um gerenciador de versão (o que você provavelmente deveria ser), os pacotes globais são instalados em {prefix}/lib/node_modules/, que é propriedade da raiz (onde {prefix} é geralmente /usr/ or /usr/local) Isso significa que você teria que usar sudo para instalar pacotes globalmente, o que pode causar erros de permissão ao resolver dependências de terceiros, além de ser uma preocupação de segurança.

Vamos mudar isso!

Empresa de entrega de encomendasÉ hora de gerenciar esses pacotes

Mudando a localização de pacotes globais

Vamos ver qual resultado npm config nos dá:

$ npm config list
; cli configs
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.13.7 node/v12.15.0 linux x64" ; node bin location = /usr/bin/nodejs
; cwd = /home/sitepoint
; HOME = /home/sitepoint
; "npm config ls -l" to show all defaults.

Isso nos dá informações sobre nossa instalação. Por enquanto, é importante obter a localização global atual:

$ npm config get prefix
/usr

Este é o prefixo que queremos alterar para instalar pacotes globais em nosso diretório pessoal. Para fazer isso, crie um novo diretório em sua pasta de início:

$ cd ~ && mkdir .node_modules_global
$ npm config set prefix=$HOME/.node_modules_global

Com essa simples mudança de configuração, alteramos o local em que os pacotes globais do Node são instalados. Isso também cria um .npmrc arquivo em nosso diretório inicial:

$ npm config get prefix
/home/sitepoint/.node_modules_global
$ cat .npmrc
prefix=/home/sitepoint/.node_modules_global

Ainda temos o npm instalado em um local de propriedade do root. Mas, como mudamos a localização de nosso pacote global, podemos tirar proveito disso. Precisamos instalar o npm novamente, mas desta vez no novo local de propriedade do usuário. Isso também instalará a versão mais recente do npm:

npm install npm@latest -g

Finalmente, precisamos adicionar .node_modules_global/bin a nossa $PATH variável de ambiente, para que possamos executar pacotes globais a partir da linha de comando. Faça isso anexando a seguinte linha ao seu .profile, .bash_profileor .bashrc e reiniciando seu terminal:

export PATH="$HOME/.node_modules_global/bin:$PATH"

Agora nosso .node_modules_global/bin será encontrado primeiro e a versão correta do npm será usada:

$ which npm
/home/sitepoint/.node_modules_global/bin/npm
$ npm --version
6.13.7

Dica: você pode evitar tudo isso se usar um gerenciador de versão do Node. Confira este tutorial para descobrir como: Instalando várias versões de Node.js usando nvm.

Instalando Pacotes no Modo Global

No momento, temos apenas um pacote instalado globalmente - o próprio pacote npm. Então, vamos mudar isso e instalar UglifyJS (uma ferramenta de minificação de JavaScript). Nós usamos o --global sinalizador, mas isso pode ser abreviado para -g:

$ npm install uglify-js --global
/home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs
+ uglify-js@3.7.7
added 3 packages from 38 contributors in 0.259s

Como você pode ver na saída, pacotes adicionais são instalados. Estas são as dependências do UglifyJS.

Listagem de pacotes globais

Podemos listar os pacotes globais que instalamos com o npm list comando:

$ npm list --global
home/sitepoint/.node_modules_global/lib
├─┬ npm@6.9.0
│ ├── abbrev@1.1.1
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
│ ├── aproba@2.0.0
│ ├── archy@1.0.0
....................
└─┬ uglify-js@3.5.3 ├── commander@2.19.0 └── source-map@0.6.1

A saída, no entanto, é bastante detalhada. Podemos mudar isso com o --depth=0 opção:

$ npm list -g --depth=0
/home/sitepoint/.node_modules_global/lib
├── npm@6.13.7
└── uglify-js@3.7.7

Isso é melhor; agora vemos apenas os pacotes que instalamos junto com seus números de versão.

Todos os pacotes instalados globalmente ficarão disponíveis na linha de comando. Por exemplo, aqui está como você usaria o pacote Uglify para minimizar example.js para dentro example.min.js:

$ uglifyjs example.js -o example.min.js

Instalando Pacotes no Modo Local

Quando você instala pacotes localmente, normalmente o faz usando um package.json Arquivo. Vamos em frente e criar um:

$ mkdir project && cd project $ npm init
package name: (project)
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)

Press Devolução para aceitar os padrões e, em seguida, pressione-o novamente para confirmar suas escolhas. Isso criará um package.json arquivo na raiz do projeto:

{ "name": "project", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC"
}

Dica: se você deseja uma maneira mais rápida de gerar um package.json uso de arquivo npm init --y.

Os campos são bastante autoexplicativos, com exceção de main e scripts. O main campo é o ponto de entrada principal para seu programa, e o scripts campo permite especificar comandos de script que são executados em vários momentos no ciclo de vida de seu pacote. Podemos deixar como estão por enquanto, mas se você quiser saber mais, consulte o documentação do package.json em npm e este artigo sobre usando npm como uma ferramenta de construção.

Agora vamos tentar instalar Sublinhado:

$ npm install underscore
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN project@1.0.0 No repository field. + underscore@1.9.2
added 1 package from 1 contributor and audited 1 package in 0.412s
found 0 vulnerabilities

Observe que um arquivo de bloqueio é criado. Voltaremos a isso mais tarde.

Agora, se dermos uma olhada em package.json, veremos que um dependencies campo foi adicionado:

{ ... "dependencies": { "underscore": "^1.9.2" }
}

Gerenciando dependências com package.json

Como você pode ver, o Underscore v1.9.2 foi instalado em nosso projeto. O acento circunflexo (^) na frente do número da versão indica que, durante a instalação, o npm puxará a versão mais alta do pacote que pode encontrar onde apenas a versão principal deve corresponder (a menos que um package-lock.json arquivo está presente). Em nosso caso, seria qualquer coisa abaixo da v2.0.0. Este método de dependências de controle de versão (major.minor.patch) é conhecido como versão semântica. Você pode ler mais sobre isso aqui: Controle de versão semântica: por que você deve usá-lo.

Observe também que o sublinhado foi salvo como uma propriedade do dependencies campo. Isso se tornou o padrão na versão mais recente do npm e é usado para pacotes (como o Underscore) necessários para a execução do aplicativo. Também seria possível salvar um pacote como um devDependency especificando um --save-dev bandeira. devDependencies são pacotes usados ​​para fins de desenvolvimento - por exemplo, para executar testes ou transpilar código.

Dica: você também pode adicionar private: true para package.json para evitar a publicação acidental de repositórios privados, bem como suprimir quaisquer avisos gerados durante a execução npm install.

De longe, o maior motivo para usar package.json especificar as dependências de um projeto é portabilidade. Por exemplo, quando você clona o código de outra pessoa, tudo o que você precisa fazer é executar npm i na raiz do projeto e o npm resolverá e buscará todos os pacotes necessários para você executar o aplicativo. Veremos isso com mais detalhes posteriormente.

Antes de terminar esta seção, vamos verificar rapidamente se o Underscore está funcionando. Crie um arquivo chamado test.js na raiz do projeto e adicione o seguinte:

const _ = require("underscore");
console.log(_.range(5));

Execute o arquivo usando node test.js e você deve ver [0, 1, 2, 3, 4] saída para a tela.

Desinstalando Pacotes Locais

O npm é um gerenciador de pacotes, portanto, deve ser capaz de remover um pacote. Vamos supor que o pacote Underscore atual está nos causando problemas de compatibilidade. Podemos remover o pacote e instalar uma versão mais antiga, assim:

$ npm uninstall underscore
removed 1 package in 0.386s $ npm list
project@1.0.0 /home/sitepoint/project
└── (empty)

Instalando uma versão específica de um pacote

Agora podemos instalar o pacote Underscore na versão que quisermos. Fazemos isso usando o sinal @ para acrescentar um número de versão:

$ npm install underscore@1.9.1
+ underscore@1.9.1
added 1 package in 1.574s $ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.9.1

Atualizando um Pacote

Vamos verificar se há uma atualização para o pacote Underscore:

$ npm outdated
Package Current Wanted Latest Location
underscore 1.9.1 1.9.2 1.9.2 project

A Atual coluna mostra-nos a versão que está instalada localmente. o ÚLTIMAS coluna nos diz a versão mais recente do pacote. E a Desejado coluna nos diz a versão mais recente do pacote que podemos atualizar sem quebrar nosso código existente.

Lembre-se do package-lock.json arquivo anterior? Introduzido no npm v5, o objetivo deste arquivo é garantir que as dependências permaneçam exatamente o mesmo em todas as máquinas em que o projeto está instalado. Ele é gerado automaticamente para qualquer operação onde o npm modifica o node_modules pasta ou o package.json arquivo.

Você pode ir em frente e tentar fazer isso se quiser. Exclua o node_modules pasta e, em seguida, execute novamente npm i (esta é a abreviação de npm install) O npm irá reinstalar o Underscore v1.9.1, embora acabamos de ver que a v1.9.2 está disponível. Isso ocorre porque especificamos a versão 1.9.1 no package-lock.json arquivo:

{ "name": "project", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" } }
}

Antes do surgimento do package-lock.json arquivo, versões de pacote inconsistentes provaram ser uma grande dor de cabeça para os desenvolvedores. Isso normalmente era resolvido usando um npm-shrinkwrap.json arquivo, que teve que ser criado manualmente.

Agora, vamos supor que a versão mais recente do Underscore corrigiu o bug que tínhamos anteriormente e queremos atualizar nosso pacote para essa versão:

$ npm update underscore
+ underscore@1.9.2
updated 1 package in 0.236s $ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.9.2

Dica: para que isso funcione, o sublinhado deve ser listado como uma dependência em package.json. Nós também podemos executar npm update se temos muitos módulos desatualizados que queremos atualizar.

Procurando por Pacotes

Nós usamos o mkdir comando algumas vezes neste tutorial. Existe um pacote Node que tem essa funcionalidade? Vamos usar npm search:

$ npm search mkdir
NAME | DESCRIPTION | AUTHOR | DATE
mkdir | Directory creation… | =joehewitt | 2012-04-17
fs-extra | fs-extra contains… | =jprichardson… | 2019-06-28
mkdirp | Recursively mkdir,… | =isaacs… | 2020-01-24
make-dir | Make a directory… | =sindresorhus | 2019-04-01
...

Há (mkdirp) Vamos instalar:

$ npm install mkdirp
+ mkdirp@1.0.3
added 1 package and audited 2 packages in 0.384s

Agora crie um mkdir.js Clique e copie e cole este código:

const mkdirp = require('mkdirp'); const made = mkdirp.sync('/tmp/foo/bar/baz');
console.log(`made directories, starting with ${made}`);

Em seguida, execute-o no terminal:

$ node mkdir.js
made directories, starting with /tmp/foo

Reinstalando dependências do projeto

Vamos primeiro instalar mais um pacote:

$ npm install request
+ request@2.88.0
added 48 packages from 59 contributors and audited 65 packages in 2.73s
found 0 vulnerabilities

Verifique o package.json:

"dependencies": { "mkdirp": "^1.0.3", "request": "^2.88.0", "underscore": "^1.9.2"
},

Observe que a lista de dependências foi atualizada automaticamente. Se você quiser instalar um pacote sem salvá-lo em package.json, apenas use o --no-save argumento.

Vamos supor que você clonou o código-fonte do seu projeto em outra máquina e queremos instalar as dependências. Vamos deletar o node_modules pasta primeiro, depois execute npm install:

$ rm -R node_modules
$ npm list --depth=0
project@1.0.0 /home/sitepoint/project
├── UNMET DEPENDENCY mkdirp@1.0.3
├─┬ UNMET DEPENDENCY request@2.88.0 ...
└── UNMET DEPENDENCY underscore@1.9.2 npm ERR! missing: mkdirp@1.0.3, required by project@1.0.0
npm ERR! missing: request@2.88.0, required by project@1.0.0
npm ERR! missing: underscore@1.9.2, required by project@1.0.0
... $ npm install
added 50 packages from 60 contributors and audited 65 packages in 1.051s
found 0 vulnerabilities

Se você olhar para o seu node_modules pasta, você verá que ela será recriada novamente. Dessa forma, você pode compartilhar facilmente seu código com outras pessoas sem sobrecarregar seu projeto e repositórios de origem com dependências.

Gerenciando o Cache

Quando o npm instala um pacote, ele mantém uma cópia, portanto, da próxima vez que você quiser instalar esse pacote, ele não precisará entrar na rede. As cópias são armazenadas em cache no .npm diretório em seu caminho inicial:

$ ls ~/.npm
anonymous-cli-metrics.json _cacache index-v5 _locks _logs node-sass

Este diretório ficará cheio de pacotes antigos com o tempo, por isso é útil limpá-lo ocasionalmente:

$ npm cache clean --force

Você também pode limpar todos node_module pastas de seu espaço de trabalho se você tiver vários projetos de nó em seu sistema que deseja limpar:

find . -name "node_modules" -type d -exec rm -rf '{}' +

Auditoria

Você notou tudo isso found 0 vulnerabilities espalhados por toda a saída CLI? A razão para isso é que um novo recurso foi introduzido no npm que permite aos desenvolvedores verificar as dependências em busca de vulnerabilidades de segurança conhecidas.

Vamos experimentar este recurso instalando uma versão antiga do express:

$ npm install express@4.8.0 express@4.8.0
added 36 packages from 24 contributors and audited 123 packages in 2.224s
found 21 vulnerabilities (8 low, 9 moderate, 4 high) run `npm audit fix` to fix them, or `npm audit` for details

Assim que terminarmos a instalação, obteremos um relatório rápido de que várias vulnerabilidades foram encontradas. Você pode executar o comando npm audit para ver mais detalhes:

$ npm audit === npm audit security report === # Run npm install express@4.17.1 to resolve 21 vulnerabilities
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High │ Regular Expression Denial of Service │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ negotiator │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ express > accepts > negotiator │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/106 │
└───────────────┴──────────────────────────────────────────────────────────────┘ ┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate │ Timing Attack │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ cookie-signature │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ express > cookie-signature │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/134 │
└───────────────┴──────────────────────────────────────────────────────────────┘

Você obterá uma lista detalhada de pacotes que possuem vulnerabilidades. Se você olhar para o Path campo, ele mostra o caminho da dependência. Por exemplo, o caminho express > accepts > negotiator significa que o Express depende do Accepts pacote. o Accepts pacote depende do negotiator pacote, que contém a vulnerabilidade.

Existem duas maneiras de resolver todos esses problemas. Podemos executar o comando npm install express@4.17.1 como sugerido, ou execute npm audit fix. Vamos fazer o último:

$ npm audit fix + express@4.17.1
added 20 packages from 14 contributors, removed 7 packages and updated 29 packages in 1.382s
fixed 21 of 21 vulnerabilities in 122 scanned packages

O comando npm audit fix instala automaticamente todas as atualizações compatíveis para dependências vulneráveis. Embora possa parecer mágica, observe que as vulnerabilidades nem sempre podem ser corrigidas automaticamente. Isso pode acontecer se você estiver usando um pacote que passou por uma grande mudança que pode interromper seu projeto atual se atualizado. Para situações como essa, você terá que revisar seu código e aplicar a correção manualmente.

Você também pode correr npm audit fix --force se você não se importa em atualizar pacotes com mudanças importantes. Depois de executar o comando, execute npm audit para garantir que todas as vulnerabilidades foram resolvidas.

Alias

Como você deve ter notado, existem várias maneiras de executar comandos npm. Aqui está uma breve lista de alguns dos aliases de npm comumente usados:

  • npm i <package>: instalar o pacote local
  • npm i -g <package>: instalar pacote global
  • npm un <package>: desinstalar o pacote local
  • npm up: pacotes de atualização npm
  • npm t: executar testes
  • npm ls: lista os módulos instalados
  • npm ll or npm la: imprime informações adicionais do pacote enquanto lista os módulos

Você também pode instalar vários pacotes de uma vez como este:

$ npm i express momemt lodash mongoose body-parser webpack

Se você quiser ver todos os comandos npm comuns, basta executar npm help para a lista completa. Você também pode aprender mais em nosso artigo 10 dicas e truques que farão de você um npm Ninja.

npx

Você também pode ouvir falar de npx em suas viagens. Não confunda isso com npm. Como aprendemos, o npm é uma ferramenta para gestão seus pacotes, enquanto npx é uma ferramenta para executando pacotes. Ele vem com o npm versão 5.2+.

Um uso típico de npx é para executar comandos únicos. Por exemplo, imagine que você deseja ativar um servidor HTTP simples. Vocês poderia instalar o pacote do servidor http globalmente em seu sistema, o que é ótimo se você usar http-server em uma base regular. Mas se você deseja apenas testar o pacote ou deseja manter os módulos instalados globalmente ao mínimo, pode mudar para o diretório onde deseja executá-lo e, em seguida, executar o seguinte comando:

npx http-server

E isso irá girar o servidor sem instalar nada globalmente.

Você pode leia mais sobre npx aqui.

Conclusão

Neste tutorial, cobrimos o básico para trabalhar com o npm. Demonstramos como instalar o Node.js a partir da página de download do projeto, como alterar a localização de pacotes globais (para que possamos evitar o uso sudo) e como instalar pacotes no modo local e global. Também cobrimos a exclusão, atualização e instalação de uma determinada versão de um pacote, bem como o gerenciamento das dependências de um projeto.

Com cada novo lançamento, o npm está fazendo grandes avanços no mundo do desenvolvimento de front-end. De acordo com seu cofundador, sua base de usuários está mudando e a maioria dos que o usam não o está usando para escrever o Node. Em vez disso, está se tornando uma ferramenta que as pessoas usam para colocar JavaScript no front end (sério, você pode usá-la para instalar praticamente qualquer coisa) e que está se tornando parte integrante da escrita de JavaScript moderno.

Você está usando o npm em seus projetos? Se não, agora pode ser um bom momento para começar.

Fonte: https://www.sitepoint.com/beginners-guide-node-package-manager/?utm_source=rss

local_img

Inteligência mais recente

local_img