| > Different projects can use different versions since the modules are installed locally (inside the `node_modules` directory) I'm speaking about within the same project. It's not hard to have problems over time when node upgrades (for example[0]) or to get a different version than expected. Any project that's lived long enough runs into some sort of version mis-match where the solution is `rm -rf node_modules`. Deleting and reinstalling the package folder as a regular fix is symptomatic of a deeper package issue. Deno solves parts of this by giving module versions their own explicit folder. I'm concerned if it still stores the package locally that you can still run into a deno version mismatch. .rbenv + Bundler's folder structure has been `.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mime-types-3.3` The version of ruby and the version of the gem are explicit allowing separation. Again, far from perfect, but this keeps out so many problems. > Since we're on the topic of Ruby and JS, Ruby's module system is probably one of the worst I've ever seen and JS one of the best. This thread is about package management. While fair criticism, it's too sideways. [0] https://stackoverflow.com/questions/46384591/node-was-compil... |
> you could not have different versions sitting side-by-side.
bundler can't do that either. You can't depend on both rails 5 and rails 6 in a single package. Most languages can't do that.
> Any project that's lived long enough runs into some sort of version mis-match where the solution is `rm -rf node_modules`.
I agree, but that's not the only solution, as I've said you could write something similar to require "bundler/setup" in JS that does version checking.
> The version of ruby and the version of the gem are explicit allowing separation.
You can specify the node version in your package.json.
EDIT: on the version checking point, I agree that this is a deficiency of npm. It probably should ship something similar to bundler/setup by default and encourage users to do
in their top level code.I was just pointing out that this is not a fundamental limitation of npm, and it should be fairly easy to implement in user-level code