Dependências em uma aplicação JavaScript

Dependências em uma aplicação JavaScript

Neste artigo, falarei um pouco sobre dependências em uma aplicação JavaScript, o que são, como são instaladas e como são gerenciadas pelo npm, que é o gerenciador de pacotes do Node.js.

O que são dependências?

No contexto de desenvolvimento de software, dependência é um componente externo ou módulo que é necessário para que o projeto funcione corretamente. Uma dependência pode ser uma biblioteca, framework, pacote ou qualquer outro recurso que seja utilizado pelo projeto.

As dependências podem ser divididas em duas principais categorias:

  • Dependências de Produção (Production Dependencies): São as dependências necessárias para que o projeto funcione corretamente em um ambiente de produção. Elas são essenciais para a execução do código principal do projeto.
  • Dependências de Desenvolvimento (Development Dependencies): São as dependências utilizadas durante o desenvolvimento do projeto, mas que não são necessárias para a execução do código em produção. Elas incluem ferramentas de teste, linters, bundlers, entre outros.

Essas dependências podem ser instaladas no projeto, através de gerenciadores de pacotes, como npm ou yarn, e são listadas em um arquivo chamado package.json. Além de listar as dependências, o package.json gerencia scripts de automação e outras configurações relacionadas ao projeto.

NPM

O npm é nativo no Node.js e é utilizado para instalar dependências nos projetos através do comando npm install seguido do nome da dependência.

npm install <dependency_name>
# ou
npm i <dependency_name>

Podemos adicionar flags ao comando npm install para aplicar configurações específicas na instalação das dependências.

-P ou --save-prod

Supondo que tenhamos o seguinte package.json:

{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC"
}

Para instalar uma dependência, como dependência de produção, podemos utilizar o comando npm install seguido da flag -P ou --save-prod:

npm install express -P
# ou
npm install express --save-prod

E como resultado teríamos as seguintes alterações:

{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  }
}

Por padrão, ao omitir uma flag ao comando npm install, a flag aplicada é a -P, fazendo com que a dependência seja instalada em dependencies, como dependência de produção.

-D ou --save-dev

Para instalar uma dependência, como dependência de desenvolvimento, usamos a flag -D ou --save-dev.

npm install jest -D
# ou
npm install jest --save-dev

E como resultado teríamos as seguintes alterações:

{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "jest": "^29.7.0"
  }
}

@ e -E

Para instalar uma versão específica de uma dependência, podemos utilizar o @ logo após o nome da dependência, seguido do número da versão que desejamos instalar, e, por fim, a flag -E se desejamos garantir que a dependência permaneça na versão especificada.

npm install express@2.1.0 -E
{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "2.1.0"
  },
  "devDependencies": {
    "jest": "^29.7.0"
  }
}

uninstall ou remove

É possível utilizar o comando: npm uninstall ou npm remove, seguido do nome da dependência, para desinstalar ou remover uma determinada dependência do projeto.

npm uninstall jest
# ou
npm remove jest
{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "2.1.0"
  },
}

ls

Também podemos listar as dependências do projeto utilizando o comando npm ls.

{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "jest": "^29.7.0"
  }
}
npm ls
├── express@4.18.2
└── jest@29.7.0

outdated

E por fim, também é possível verificar quais dependências no projeto estão desatualizadas utilizando o comando npm outdated.

Dado o seguinte package.json:

{
  "name": "project",
  "version": "1.0.0",
  "description": "This is an example",
  "main": "index.js",
  "scripts": {},
  "keywords": [],
  "author": "Lucas Morais",
  "license": "ISC",
  "dependencies": {
    "express": "^1.0.0"
  },
  "devDependencies": {
    "jest": "^25.0.0"
  }
}

Bastaria utilizar o comando:

npm outdated

E teríamos uma lista com as dependências desatualizadas contendo as seguintes informações a respeito das mesmas:

  • Package: nome da dependência.
  • Current: versão atual da dependência no projeto.
  • Wanted: versão máxima para a dependência levando em consideração o Semantic Versioning.
  • Latest: versão mais recente disponível para a dependência.
  • Location: localização da dependência no sistema de arquivos.
  • Depended by: indica os proketos ou módulos que dependem do pacote em questão.
Package  Current  Wanted  Latest  Location              Depended by
express    1.0.7   1.0.7  4.18.2  node_modules/express  project
jest      25.5.4  25.5.4  29.7.0  node_modules/jest     project