In the last 10 years, the web has grown quickly from a document-only platform to full-scale applications. A good chunk of the applications which are now being developed are no longer native, and are instead relying on the web.
The tooling is complex
Keeping up with all these different technologies comes at a cost. Browsers are slower to update than the language and as a consequence, lots of tools have emerged to circumvent this problem.
A modern tooling can include ES6 and JSX transpilers, boilerplates, linters, minifiyers, Bower and NPM package managers. In order to generate and run all of this reliably, some scripting must be used, Grunt or gulp are currently the most popular ones.
All of these tools are very complex to setup together so some project generators like Yeoman have appeared.
React Starter Kit — isomorphic web app boilerplate (Node.js, Express, GraphQL, React.js, Babel 6, PostCSS, Webpack, Browsersync)
Event debugging has also not improved very well in the past few years so understanding what triggered an action is now even more complex.
Sourcemaps might not work very well
While all major browser now support sourcemaps, not every browser supports them to the same degree and, depending on the browser, the resulting stacktrace can sometimes be largely unhelpful.
The sourcemaps also need to be applied in the right order during all the tooling transformations, otherwise the resulting sourcemap might be incomplete or invalid.
The environment is changing too quickly
Client-side frameworks are constantly changing
Client side frameworks are appearing and disapearing very quickly. As an example, on the front-end side, we have:
- Batman – Now deprecated
- Angular – Angular 2 has now very different semantics than the original Angular
- React – The current trendy framework, made by Facebook.
All of them were popular at some point and then decreased in popularity, the current framework du jour is at the moment React.js, but for how long ?
The tooling is constantly changing
The tooling itself has also changed a lot in the past few years, here is a small list of technologies which have been experiencing changes:
- Require.js / Webpack: Tools to bring the power of package managers to the browser, even if both are still popular, the new trend is now to use Browserify.
- Grunt: An equivalent of make for Node.js, the new tool du jour is now Gulp.js and a lot of repositories are converting their codebase to the latter.
- Babel, Traceur, Esnext …: The war for ES6 transpilers is still on and no clear winner can currently be observed.
The language itself is constantly changing
ES6, the current addition to the language is not itself adopted, but talks are already focusing on ES7 and ES8.
The ES6 compability table is now very large. This table is just the additions to the language itself, not considering the new Web APIs appearing almost every other week.
The UNIX philosophy seems a practice from a distant past. Every new API is now added to an ever-ending global window Object along with prefixes and checking API support is quite complex.
What counts on the browsers is now the speed of delivery, stability is only considered secondly. IndexDB barely works reliably between different browser implementations (PouchDb as an example is using a lot of workarounds to make it work) and the HTML5 Offline Cache offers so little control that it's barely used in production despite having a lot of potential.