A Critical Look at Modern Web Frameworks

In recent years, the landscape of web development has seen a proliferation of frameworks and libraries. However, upon closer examination, many of these tools lack the comprehensive feature set traditionally associated with full-stack web frameworks. The list of candidates which meet my criteria is very short.
Here it is:

.NET

  • ASP.NET (Razor Pages or MVC or Blazor)

Java

  • Spring Boot

  • Quarkus

  • Micronaut

PHP

  • Laravel

  • Symfony

Ruby

  • Ruby on Rails

Elixir

  • Phoenix

Honorable mentions

Python

  • Django

Node JS

  • AdonisJS

I don’t have any experience with Quarkus or Micronaut, but from what I can tell they are fully featured. The same goes for AdonisJS. I personally think NodeJS is a disaster and there’s no good reason to ever touch it, but AdonisJS seems to be a rare exception to the JavaScript ecosystem plague. Python is an even worse language for this task, its slow, maybe the slowest. In energy usage it is beaten out by even Ruby to be the least energy efficient and worst language.

Defining a Full-Stack Web Framework

To establish a baseline for comparison, let's first outline the key features typically provided by comprehensive, full-stack web frameworks:

  • MVC Architecture or other convention

  • ORM (Object-Relational Mapping)

  • Routing

  • Database Migrations

  • Authentication and Authorization

  • RESTful API Support

  • Template Engines

  • Session Management

  • Security Features

  • Caching Mechanisms

  • Environment-based Configuration

  • Command-line Interface

  • Testing Support

  • Asset Pipeline/Management

  • Internationalization (i18n) and Localization (l10n)

  • Database Seeding

  • Logging

  • Middleware Support

  • Form Helpers and Validation

  • Email Sending Capabilities

  • Background Job Processing

  • Dependency Injection

These features represent a common set of functionalities found in established full-stack frameworks.

The Current Landscape

Many popular tools marketed as "frameworks" often provide only a subset of these features. People are calling their http web server a framework now. Projects like Go Gin (and every other Go ‘framework’). This is what is being offered to build your backend on. If you inexplicably want to write your backend with NodeJS as the runtime, Express is a perfect example of how open source projects wither and die. Express 4 has been the release since 2014. Yes, a decade ago. Express 5 has failed to ever be finished. The contributors have jumped ship to Fastify, left, etc. No one is being paid to develop it. And a very significant number of apps are stuck with it.

Implications for Development

The reliance on third-party packages for core functionality has several implications:

  • Integration Complexity: Developers must research, select, and integrate multiple packages to achieve full-stack functionality.

  • Maintenance Overhead: Each additional package introduces potential version conflicts and security vulnerabilities that must be managed.

  • Learning Curve: Team members need to familiarize themselves with multiple libraries and their specific APIs.

  • Consistency: Different packages may have inconsistent coding styles or paradigms, potentially affecting code quality and maintainability.

  • Performance: While not universally true, using multiple packages can sometimes lead to performance overhead compared to more integrated solutions.

IDE Support

Not many real frameworks have IDE support! VS Code is not an IDE! And its bad on the inside (Electron) and outside (bad UI). Case in point:

  1. Vue: Confusing explanation on installing “Volar” (what?), and it broke my editor and now all the html files on my pc have .vue syntax. Thanks a lot Vue.

  2. Svelte: Hardly surprising from them, but their VS Code extension is a mess, partly to do with the AST Svelte has.

No one should be accepting these problems. The bar is set, with Visual Studio, and with JetBrains. But JetBrains is prohibitively expensive, and VS is free.

1st place goes to .NET. Visual Studio is fantastic, and JetBrains Rider is a superb alternative if you’re so inclined. C# itself allows for the best debugging and intelliSense due to static typing, the CLR, Roslyn, and the all-encompassing .NET platform. Visual Studio has a history dating to 1997. Java is lucky that Jetbrains IntelliJ IDEA has a community edition. Almost all of Jetbrain’s other products are paid only. PhpStorm. RubyMine. WebStorm. All paywalled. PyCharm Community is free but Python in my mind doesn’t have a true IDE and never will because its dynamically typed and doesn’t have impressive intelliSense.

NodeJS fails here as expected, TypeScript the 5000 GitHub issues joke lagged out and crashed my Visual Studio on a medium sized project.

Case Study: Next.js

Next.js, a popular React framework, serves as an interesting case study. While it excels in areas like server-side rendering and static site generation, it lacks many features of traditional full-stack frameworks:

  • No built-in ORM or database migration tools

  • Limited authentication and authorization capabilities out-of-the-box

  • Absence of a traditional MVC architecture

  • No integrated email sending functionality

  • Limited built-in support for background job processing Developers using Next.js often need to incorporate additional libraries or services to achieve full-stack functionality.

  • Weak and insufficient solution for caching.

The Trade-offs

The trend towards more modular, less opinionated frameworks offers certain advantages:

  • Flexibility: Developers can choose specific tools that best fit their project requirements.

  • Lightweight Implementations: Projects that don't need full-stack features can avoid unnecessary bloat.

  • Ecosystem Growth: The need for additional packages fosters a rich ecosystem of specialized tools. However, these benefits come at the cost of increased complexity and potential fragmentation within projects.

Conclusion

The current web development landscape is saturated with tools and libraries that often fall short of providing comprehensive, full-stack functionality. While marketed as "frameworks," many popular options offer only a fraction of the features traditionally associated with robust web development platforms.This trend towards modular, less opinionated tools has led to a fragmented ecosystem where developers must piece together multiple packages to achieve full-stack capabilities. The implications are significant:

  1. Increased complexity in project setup and maintenance

  2. Higher learning curves for development teams

  3. Potential inconsistencies in coding styles and paradigms

  4. Possible performance overhead from integrating multiple libraries

Moreover, the lack of proper IDE support for many of these modern tools further complicates the development process, with some popular frameworks offering subpar or convoluted solutions for code editing and debugging.The list of true full-stack frameworks that meet comprehensive criteria is surprisingly short. Established platforms like ASP.NET, Spring Boot, Laravel, and Ruby on Rails continue to offer integrated, feature-rich environments that can significantly streamline development processes.