I am not a JavaScript developer but was asked to help the JS team just the other week with an npm build issue.  The npm modules built fine on OS X dev boxes, but CI server running Linux was failing because older version of gcc was installed.  While troubleshooting this, I came to learn a bit about node.js and npm ecosystem and I surprised slightly more than I expected.  Apparently, it is considered normal now to have build process download dozens of these npm modules.  Many of them are build time dependencies.  Things that are good old native binaries (e.g. for changing compression levels of graphics files) are downloaded by npm and built from source.  Then when module runs, it tries to execute them by pulling in one of half a dozen possible modules for executing native binaries.  There is no logging.  All code is written in crazy continuation style, because the framework is inherently asynchronous -- nevermind that it only matters in a handful of hot IO cases requiring optimization -- all code is like that, undecipherable.  There is no logging or error handling.  A 3 months old project setup by smart consultants who do this kind of thing 24x7 already has a significant number of deprecated dependencies.