I'm partial to Java for a lot of reasons. That aside I still think my criticisms of JS syntax, NPM, and debugging are valid. Let me explain a bit more though.

The biggest problem with JS syntax is not dynamic typing, it's a startling lack of consistency. For example .ForEach vs "for in" vs "for as" vs manually looping over properties. That's at least 4 loop types made for looping over object lists/properties. Checking for undefined is convoluted, the crockerford privacy pattern is convoluted, Iffy syntax is convoluted, function scoped variables are convoluted, using Arrays.prototype and similar are convoluted because you cant trust built in functions to work properly. Even arrays are convoluted because there's a marked distinction between an array vs "array like" objects and certain things work on one but not the other. And don't get me started with double equals. I could probably go on for maybe 5-10 pages given some time, but I think that's enough of a point.

I have read several JavaScript books cover to cover multiple times , and honestly half the books are "patterns" aka workarounds for things that usually "just work" in other languages. Yeah I understand they're working to fix this stuff but some of the cruft will remain with us for a long time. I haven't used a single other language with as many gotchas as Javascript, not even Perl.

NPM is a mess and we seem to agree on that. I happen to have published packages on both C# and Java, and I'll say that especially for Java, the bar for "acceptable" is much higher. This is kicking a hornets nest but... I think a lot of the reason the quality of NPM packages is so low is because the average JS developer has a lot less experience. Still, some of the problem is the design of NPM itself. They need to ditch their module system for the new standard yesterday and they need to make it less trivial to publish a package. Both C# and Java scan your manifest to make sure you meet some minimum standards, such as a sane namespace.

As for debugging, it might be a lot better now, but Chrome is still seriously underpowered as a debugger compared to a real IDE. It's main purpose is a web browser so this isn't too surprising. Java or C#(my two mainstays) have full debuggers built into the runtime plus tons of extras like profilers and processing/comparing process dumps and memory leak finding systems and all sorts of crap that becomes useful when you've got nasty bugs. JavaScript is still maybe half a decade behind on tooling, debugging, and IDE support.

You're probably right that Node is great for hacking stuff together quicker than Java, but I don't think the language and tools around it are mature enough to support large applications expected to last a decade or more.

To me Node feels like Python but with a much better performing runtime, and IMO should be treated as such. Good for quick stuff and "glue" applications.

My angst with the JS community comes from their collective immaturity(or maybe it's just the hype train, or maybe both). Everything new in JS is the best thing ever and makes front page HN, even if it's existed forever. I remember a post about the Closure compiler in JS making the front page a few months back. The Closure compiler has existed for what... Ten years? Is it really that big a deal that google ran a JS codegen from the native Closure source? The JS community thinks so apparently.

That and the JS community pooping on C#/Java because they have a big runtime when the runtime for JS is also huge. You need an entire web browser just to debug it!

Anyways yeah JS is really approachable because you don't need to install anything to use it and it's being taught everywhere as a first language. But its badly designed and the ecosystem around it is busy but of largely low quality.