Description
Motivation ("The Why")
There's no doubt that NPM is the butt of a lot of memes relating to how heavy the local node_modules
folder can get. Especially on big projects, and whne working on multiple big projects over time, the duplication of the same packages across different project spaces can cause a significant impact on hard drive space. A tool already exists to address this issues: PNPM. However, PNPM is not a 1-for-1 replacement - there are some quirks with the commands, and while for the most part it works, these nuances can get in the way of efficient package management, including when sharing code among developers (especially in the Open Source community).
A globallink
install strategy should be included to address this and would work similar to how the linked
strategy works now. However, instead of the packages being saved in ./node_modules/.store
, they would be saved in /path/to/npm/global/node_modules/.store
.
This will also cause an update to the clean-install
command where the packages (and exact dependencies) for a project are deleted from the global store and re-installed.
Of course, this install strategy can be overridden by specifying a different type at the command line or local config.
How
Current Behaviour
The hoisting of packages to the root of the node modules folder helps to deduplicate packages across the project. However, this is only localised to the project. As an example, I work on many web apps that all use SvelteKit and I need to download and store the entire SvelteKit package every time for each project (36MB). Add on the extra frameworks that I use, and that number starts to add up pretty quickly to a couple hundred megabytes.
Desired Behaviour
By specifying the install-strategy
as globallink
all the packages would be installed into a global store. npm would resolve the package requirements of an install command, determine that a package exists within the store which meets the version criteria and links to it instead of downloading it again. If no package in the store meets the criteria, one is simply downloaded.
I might be oversimplifying the complexity, but the implementation could be an increase in capability of the linked
install strategy, in that the store that it points to is the global store, rather than the local one.