Browser Support Hell Matrix
NodeJS, the missing piece
With this, came the nightmare of managing the code. Just like other languages, NodeJS has its own package manager (npm). npm is to node what pip is to Python or rubygem is to Ruby. To be able to manage per project dependencies, NodeJS also has nvm to manage versions, like virtualenv for Python or rvm for Ruby.
Grunt/Gulp to the rescue
Because life (or projects) is a repetition of tasks, Grunt and Gulp are tools that use plugins to enable the developers to do common tasks like linting, minifying, uglifying code, or run tests. This allows repeatable tasks to offer a greater assurance of quality before committing code to the version controlling repository.
Webpack to the rescue
Many developers who focus on the front-end are now using tools like Webpack to do most of the tasks that were done with Grunt/Gulp plugins. One thing I would comment on this tool is that webpack is focused for the web, and it doesn't really make sense to use it for server-side code. Webpack can be used with Grunt/Gulp to transpile/uglify/minify/bundle the web portion of the code, instead of replacing Grunt/Gulp, but it is not as useful for the server-side code.
Working as a team, or as many teams on a single code base, will prove difficult to make sure everything works as it should. Even with as many precautions as possible, it's always possible that we are testing on uncommitted code, on the wrong branch, with manually added, outdated code, or modified config files that are on our local development system. Continuous integration is a practice where committed code is regularly checked to allow early error detection. We can use automation tools like Jenkins to help.
Ideally, a continuous integration environment should replicate the production environment as close as possible. Developers are on equipment with a variety of operating systems, versions of those operating system, and even versions of tools. This situation will potentially introduce issues like files not accessible in production because the developer was using a case-aware system, instead of a case-sensitive one.
Even after all this setup, one thing many developers forget is that even if NodeJS is supposed to be able to run on many operating systems, NodeJS also uses other libraries, and those could be required to be compiled. It is important to use the continuous integration system to create the artifacts that will be used in production.
As much as developers want to use the latest and greatest tools, the most important part is to keep everything maintainable and clear for anyone, including yourself, when you need to fix a bug many months from the time you wrote that code.
It is also hard to find the complete toolset that was available for what we used a few months back, and equivalent tools for the new and shiny toys. This does not only apply to new tools, but also to new version of a given tool.