Skip to content

[RRFC] Include a globallink install strategy #817

Open
@TheBrenny

Description

@TheBrenny

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions