--- title: NPM localeTitle: NPM --- ## NPM O Node.js possibilita gravar aplicativos em JavaScript no servidor. Ele é baseado no tempo de execução do V8 JavaScript e escrito em C ++ - então é rápido. Originalmente, era destinado a ser um ambiente de servidor para aplicativos, mas os desenvolvedores começaram a usá-lo para criar módulos para ajudá-los na automação de tarefas locais. Desde então, todo um novo ecossistema de ferramentas baseadas em Node evoluiu para transformar a face do desenvolvimento de front-end. Para usar esses módulos (ou pacotes) no Node.js, precisamos instalá-los e gerenciá-los de maneira útil. É aí que entra o npm, o gerenciador de pacotes do Node. Ele instala os pacotes que você quer usar e fornece uma interface útil para trabalhar com eles. ## Instalando o NPM Para instalar o `npm` , temos que baixar os binários do Nodejs no seu ambiente local. Os binários do Node.js incluem a versão mais recente do npm. Para verificar se: ```shell npm -v 5.6.0 ``` Node Package Manager (NPM) fornece duas funcionalidades principais - * Repositórios on-line para pacotes / módulos node.js que podem ser pesquisados ​​no `npmjs.com` . * Utilitário de linha de comando para instalar pacotes Node.js, fazer gerenciamento de versão e gerenciamento de dependência de pacotes Node.js. ## Instalando módulos usando o NPM `npm` pode instalar pacotes no modo local ou global. Por padrão, o NPM instala qualquer dependência no modo local. No modo local, ele instala o pacote em uma pasta node\_modules no diretório de trabalho pai. Este local é de propriedade do usuário atual. Pacotes globais são instalados em {prefixo} `/lib/node_modules/` que é de propriedade de root, onde {prefixo} é usualmente `/usr/ or /usr/local` . Isso significa que você teria que usar o sudo para instalar pacotes globalmente, o que poderia causar erros de permissão ao resolver dependências de terceiros, além de ser uma preocupação de segurança. ### Instalando Pacotes no Modo Global Quaisquer pacotes instalados globalmente ficarão disponíveis na linha de comando. Usamos o sinalizador --global ou -g para instalar pacotes globalmente. ```shell $ npm install uglify-js --global ``` Podemos listar os pacotes globais que instalamos com o comando npm list. ```shell $ npm list --global /usr/local/lib ├─┬ npm@5.6.0 │ ├── abbrev@1.1.0 │ ├── ansi-regex@2.1.1 │ ├── ansicolors@0.3.2 │ ├── ansistyles@0.1.3 .................... └─┬ uglify-js@3.0.15 ├─┬ commander@2.9.0 │ └── graceful-readlink@1.0.1 └── source-map@0.5.6 ``` A saída, no entanto, é bastante detalhada. Podemos mudar isso com a opção --depth = 0. ```js $ npm list -g --depth=0 /usr/local/lib ├── npm@5.6.0 └── uglify-js@3.0.15 ``` ### Instalando Pacotes no Modo Local Quando você instala pacotes localmente, normalmente faz isso usando um arquivo package.json. ```shell npm install --save express ``` Agora você pode usar este módulo no seu arquivo js como segue ```js const express = require('express'); ``` Os módulos locais são divididos em dois tipos de dependências: `devDepenednecies` e `dependencies` . A diferença entre esses dois é que devDependencies são módulos que são requeridos apenas durante o desenvolvimento, enquanto dependências são módulos que também são requeridos no tempo de execução. Para salvar uma dependência como devDependency na instalação, precisamos fazer um `npm install --save-dev` , em vez de apenas um `npm install --save` . Um bom atalho para instalar um devDependency que eu gosto de usar é o `npm i -D` . A abreviação de salvar uma dependência regular é `-S` vez de `-D` . ### Instalando uma versão específica de um pacote Para fazer isso, mencionamos a versão do pacote que queremos instalar. ```shell $ npm install underscore@1.8.2 -S ``` Para remover uma dependência global, use o sinalizador `-g` . ### Desinstalando Pacotes Locais O npm é um gerenciador de pacotes, portanto deve ser capaz de remover um pacote. Nós podemos remover o pacote: ```shell $ npm uninstall underscore -S ``` Para atualizar uma dependência global, use o sinalizador `-g` . ### Atualizando um pacote Para atualizar um pacote, você pode fazer: ``` $ npm update underscore -S ``` Para verificar se há uma atualização disponível para qualquer pacote associado ao nosso projeto: ```shell $ npm outdated Package Current Wanted Latest Location underscore 1.8.2 1.8.3 1.8.3 project ``` A coluna Atual nos mostra a versão instalada localmente. A última coluna nos informa a última versão do pacote. E a coluna Wanted nos diz a versão mais recente do pacote para o qual podemos fazer upgrade sem quebrar nosso código existente. ## Gerenciando Dependências com o package.json Se não estiver usando um sinalizador específico e instalar um módulo como o `npm install express` instalará o módulo na pasta `node_modules` localmente, mas o `package.json` que mantém registros de todas as dependências que estamos usando em um projeto não será atualizado com nossa adição. Assim, o pacote será específico do desenvolvimento, não será instalado no ambiente runtimme. Certifique-se de usar sempre um sinalizador adequado e manter atualizado o arquivo `package.json` . Quando você instala pacotes localmente, você precisa de um arquivo package.json. Para gerar um, você pode fazer isso usando o comando `npm init` . Ele vai aparecer com algumas perguntas que, ao pressionar Enter, você pode manter os valores padrão. ```shell $ 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) ``` Pense em `package.json` como o guardião de todas as dependências ou manifestação de um projeto Node.js. Se você quiser uma maneira mais rápida de gerar um arquivo package.json, use `npm init --y` . Lista de Atributos Comuns em um arquivo `package.json` : * nome - nome do pacote * versão - versão semântica do pacote * descrição - descrição do pacote * homepage - homepage do pacote * autor - autor do pacote * colaboradores - nome dos contribuintes para o pacote * dependências - lista de dependências. O NPM instala automaticamente todas as dependências mencionadas aqui na pasta node\_module do pacote. * devDependencies - lista de todas as dependências específicas de desenvolvimento * repositório - tipo de repositório e URL do pacote * ponto de entrada principal do pacote * palavras-chave - palavras-chave * licença - uma licença para o seu pacote, para que as pessoas saibam como podem usá-lo e quaisquer restrições que você esteja colocando nele. * scripts - A propriedade "scripts" é um dicionário que contém comandos de script que são executados em vários momentos no ciclo de vida do seu pacote. * config - objeto que pode ser usado para definir parâmetros de configuração usados ​​em scripts de pacotes que persistem em atualizações. Um exemplo: ```json { "name": "express", "description": "Fast, unopinionated, minimalist web framework", "version": "4.11.2", "author": { "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" }, "contributors": [{ "name": "Aaron Heckmann", "email": "aaron.heckmann+github@gmail.com" }, ], "license": "MIT", "repository": { "type": "git", "url": "https://github.com/strongloop/express" }, "homepage": "https://expressjs.com/", "keywords": [ "express", "framework", "sinatra", "web", "rest", "restful", "router", "app", "api" ], "dependencies": { "serve-static": "~1.8.1", }, "devDependencies": { "jade": "~1.9.1", }, "engines": { "node": ">= 0.10.0" }, "files": [ "LICENSE", "History.md", "Readme.md", "index.js", "lib/" ], "scripts": { "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/", "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" }, } ``` ## scripts do npm `npm` scripts `npm` são usados ​​para automatizar tarefas repetitivas. Por exemplo, construindo seu projeto, minimizando arquivos CSS (Cascading Style Sheets) e JavaScript (JS). Scripts também são usados ​​na exclusão de arquivos e pastas temporários, etc. Eles podem ser personalizados e acessados ​​via `scripts` em `package.json` . ```json { "name": "super-cool-package", "version": "1.0.0", "scripts": {} } ``` Um exemplo do script NPM mais popular: ```json "scripts": { "start": "node index.js", ... } ``` ## npm Cache Quando o npm instala um pacote, ele mantém uma cópia, então, da próxima vez que você quiser instalar esse pacote, ele não precisará acessar a rede. As cópias são armazenadas em cache no diretório .npm em seu caminho inicial. ```shell $ ls ~/.npm lodash.zipobject log-driver log-symbols logalot logfmt loglevel long-timeout longest longest-strea ``` Este diretório ficará cheio de pacotes antigos ao longo do tempo, por isso é útil limpá-lo ocasionalmente. ```shell $ npm cache clean ``` ## Fio - uma alternativa ao npm Yarn também é um gerenciador de pacotes JavaScript desenvolvido e mantido pelo Facebook. Ambos compartilham semelhanças de alto nível quando se trata de usá-los. É supostamente mais rápido instalar dependências do que npm. Para instalá-lo: ```shell npm install -g yarn ``` O fio não pretende substituir o npm, mais como melhorar o mesmo. Ele usa o mesmo arquivo package.json e salva as dependências na pasta `node_modules/` . Para inicializar um projcet, você usará: ```shell yarn init ``` ### Adicionando, Atualizando e Removendo Dependências Adicionar uma nova dependência é fácil e semelhante ao npm: ```shell yarn add [package-name] ``` Se você quer uma versão ou tag específica do pacote, você pode fazer isso. ```shell yarn add express@4.14.1 ``` Para dependências dev, dependências ponto a ponto e dependências opcionais, você passa o --dev --peer --optional respectivamente. ```shell yarn add gulp --dev ``` Vai economizar gole sob devDependencies. Para atualizar ou remover um pacote, basta substituir o comando add por upgrade ou remove, seguido pelo nome do pacote. ```shell # upgrade a gulp from 3.9.1 to version 4 yarn upgrade gulp@4.0 # remove a gulp yarn remove gulp ``` Após cada instalação, atualização ou remoção, o fio atualiza um arquivo yarn.lock que acompanha a versão exata do pacote instalada no diretório node\_modules. Recurso semelhante foi atualizado em npm. Agora há um `package-lock.json` que se comporta exatamente da mesma maneira que o `yarn.lock` em versões mais novas do npm. ### Números de versão do pacote e o que significam Uma primeira versão de um pacote npm é sempre 1.0.0 Correções de bugs, ou pequenas alterações incrementam o terceiro dígito, o hens 1.0.0 se tornaria 1.0.1 Novos recursos que não quebram versões anteriores de um pacote incrementam o segundo dígito, o hens 1.0.0 se tornaria 1.1.0 Todas as alterações que quebram as versões anteriores de um pacote incrementam o primeiro dígito, o hens 1.0.0 se tornaria 2.0.0 É importante lembrar disso ao atualizar os pacotes para manter seu projeto estável!