LinuxCommandLibrary

npm-dedupe

Reduce duplication of packages in node_modules

TLDR

Deduplicate packages in node_modules

$ npm [[ddp|dedupe]]
copy

Follow package-lock.json or npm-shrinkwrap.json during deduplication
$ npm [[ddp|dedupe]] --lock
copy

Run deduplication in strict mode
$ npm [[ddp|dedupe]] --strict
copy

Skip optional/peer dependencies during deduplication
$ npm [[ddp|dedupe]] --omit [optional|peer]
copy

Enable detailed logging for troubleshooting
$ npm [[ddp|dedupe]] --loglevel verbose
copy

Limit deduplication to a specific package
$ npm [[ddp|dedupe]] [package_name]
copy

SYNOPSIS

npm dedupe [--prefix <path>] [--dry-run] [--force] [...additional npm options]

PARAMETERS

--dry-run
    Simulate the command's execution without making any changes to the filesystem. It shows what would happen.

--force
    Force the deduplication process, potentially overwriting existing files or symlinks. Use this option with caution.

--prefix <path>
    Run the command in the directory specified by <path> instead of the current working directory, affecting that project's node_modules.

--json
    Output the result as a JSON object to standard output, suitable for programmatic parsing.

DESCRIPTION

npm dedupe (short for "deduplicate") is an npm command designed to optimize the node_modules directory within a Node.js project. Its primary function is to simplify the local package tree by identifying and reducing redundant installations of the same package. When multiple packages depend on the same version of another package, npm dedupe attempts to hoist that shared dependency to a higher, common ancestor in the node_modules hierarchy.

This process reduces the overall size of the node_modules directory, can potentially speed up installations, and helps avoid potential issues with conflicting package versions or module resolution. While npm install often performs a form of deduplication automatically, npm dedupe can be explicitly run to re-optimize the tree, especially after manual modifications or if the dependency tree has become suboptimal. It ensures that only one copy of a package exists at a given level of the tree, creating symlinks to shared copies where possible.

CAVEATS


  • Automatic Deduplication: Since npm v7, npm install inherently performs a significant amount of deduplication automatically. Running npm dedupe explicitly might not always result in further significant changes unless the dependency tree has become particularly complex or has been manually altered.

  • Re-introduction: The npm dedupe command was deprecated in npm v7, with its functionality merged into npm install. However, due to user demand and specific use cases, it was re-introduced as a standalone command in later versions (e.g., npm 8.x onwards), allowing for explicit deduplication.

  • Symlinks: Deduplication heavily relies on creating symlinks to shared package instances. On some operating systems or specific setups (e.g., networked file systems), symlink creation or resolution might behave differently, potentially impacting the effectiveness or stability of the deduplicated structure.

PURPOSE AND BENEFITS

The primary benefit of running npm dedupe is to reduce the overall size of the node_modules directory by minimizing redundant package installations. This can lead to faster installation times, reduced disk space usage, and a cleaner dependency tree, which can be particularly advantageous in CI/CD environments or when dealing with large projects with many nested dependencies.

WHEN TO USE

While npm install handles most deduplication automatically, npm dedupe can be useful in specific situations:

1. After manual dependency changes: If you've manually edited package.json or tampered with node_modules.
2. To resolve complex dependency issues: Sometimes, a specific dependency graph might not be optimally deduplicated by default.
3. To ensure consistency: Before committing node_modules (though generally discouraged) or deploying, to guarantee a consistent, optimized state.

HISTORY

The npm dedupe command has been a part of npm for a long time, serving as a vital tool for optimizing the node_modules structure. Its evolution saw a notable change with the release of npm v7, where the core deduplication logic was integrated directly into the npm install command, leading to the standalone dedupe command being deprecated. This change aimed to simplify the workflow, making dependency optimization a default behavior during installation.

However, the explicit control offered by a dedicated dedupe command proved valuable for specific scenarios, such as after manual dependency adjustments or when troubleshooting complex dependency trees. Consequently, the npm dedupe command was re-introduced in subsequent npm versions (e.g., npm 8.x), providing users with the option to explicitly trigger the deduplication process independent of an install operation, reflecting the community's need for finer-grained control over package management.

SEE ALSO

npm install(1), npm prune(1), npm ls(1)

Copied to clipboard