Skip to content

Dependencies are external packages of code your project uses to function.

In the Node.js ecosystem, developers use package.json at the root of the project to declare a list of direct dependencies in the dependencies (e.g., "express": "^4.18.0"). Each of those most likely have transitive dependencies (i.e., express pulls in body-parser, accepts, cookie respectively.). This list of packages, and their dependencies are what constitutes a dependency tree for a project.

Direct vs. transitive

TypeWhat it isExample
DirectListed in your package.jsonexpress@^4.18.0
TransitiveA dependency of one of your dependenciesbody-parser (express needs it)

For example, after running vlt install express typescript, this is what your filesystem might look like:

  • package.json list express@^4.18.0 directly
  • Directorynode_modules
    • Directoryexpress direct dependency (you installed it)
      • index.js
      • Directorynode_modules
        • body-parser transitive (express needs it)
        • accepts transitive
        • cookie transitive
    • typescript direct dependency (dev)

Dependency types

Packages in package.json can be declared under several categories:

Field in package.jsonPurpose
dependenciesProduction dependencies needed at runtime
devDependenciesDevelopment-only tools (testing, building)
peerDependenciesExpected host dependency (e.g., a component library that is built off react)
optionalDependenciesNon-failing — install skipped if resolution fails

Familiar with CSS selectors? Then you’ll like DSS.

The vlt CLI provides handy colon-prefixed commands to query and filter by dependency types pseudo-state selectors like :prod, :dev, :peer, and :optional.