There was no need to build a package management system since CPAN, and yet npm is the best.
Every time a new programming language or framework is released, people seem to decide that:
It needs its own package manager.
Simple algorithms need to be rewritten from scratch in “pure” $language/framework and distributed as packages in this package manager.
This is not actually true. Many programming languages – particularly many of the trendy ones – have a way to call C functions, and a way to expose their own routines as C functions. Even C++ has this feature. This means that you don’t need any new packaging system, if you can deploy packages that expose C functions (whatever the implementation language) then you can use existing code, and you don’t need to rewrite everything.
So there hasn’t been a need for a packaging system since at least CPAN, maybe earlier.
On the other hand, npm is the best packaging system ever because people actually consume existing code with it. It’s huge, there are tons of libraries, and so people actually think about whether this thing they’re doing needs new code or the adoption of existing code. It’s the realisation of the OO dream, in which folks like Brad Cox said we’d have data sheets of available components and we’d pull the components we need and bind them together in our applications.
Developers who use npm are just gluing components together into applications, and that’s great for software.