Totally get your frustration :)
Addy Osmani

Your sentiments are admirable, but never have I worked in an ecosystem where the knowledge attained while becoming a master of the craft goes out of date so rapidly, or where solutions are quite so brittle.

The JS world’s obsession with small tools mean that they combine in endless permutations, causing endless issues to debug.

For example, you decide you want to add code coverage, but that breaks your source maps. You fix that, and break your CSS source maps for LESS. You Google for solutions to that and discover that the WebPack loader you’re using has a bug that means you can’t have your cake and eat it. You swap over to using SCSS because it looks easier than patching the source mapping in WebPack and fixing it all. You then discover some library you’re pulling in is using SCSS on a different version and WebPack gets all confused.

While fixing that, some unknown module update means you pull in a new module which blows the 260 char MAX_PATH limit on Windows, because NPM nests its node_modules folders very very deeply, and your build stops working. You install flatten-packages to work around this and then run into bug#69 in the Visual Studio 2015 nodejstools plug-in.

Once you’ve sorted that out, you discover that the NPM dudes, in their infinite wisdom, have allowed people to publish packages with case sensitive names that allow clashes, and that your project wants both the base64 and the Base64 libraries, which flatten-packages merrily clobbers when it tries to put them both in the root node_modules folder. OMG KILL ME NOW.

You can spend *weeks* on this stuff over the course of a moderate-sized project, none of which is real work.

Maybe you’re lucky and manage to find some reasonably good, up-to-date project scaffolding that has the combination of things you want actually working together (regardless of what you say, WebPack + Babel + Karma + Istanbul + Jasmine/Mocha/whatever is actually about the bare minimum for an app with tests+code coverage that doesn’t do 100 round-trips to load it, plus Angular/React(+Redux?) or whatever, obviously).

When the tower of abstractions falls down in a steaming pile and you need to figure out what’s gone wrong and fix it, you then end up sinking hours and hours into it (all the more because you don’t really understand what’s going on, because you didn’t set it up from scratch).

Or you waste a month figuring out how to plug all the tools together. If I have a complex project I know full well I’m going to want code coverage, a proper module system, minification, etc. etc. The initial time investment to investigate the options here and get it all working is faintly ridiculous compared to ecosystems like Java or .NET (or even C++, for that matter).

I’m not even going to talk about the cavalier attitude various popular parts of the ecosystem (e.g. react-router) have towards API stability.

It’s deeply irksome, at best.