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:
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.
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:
Increased complexity in project setup and maintenance
Higher learning curves for development teams
Potential inconsistencies in coding styles and paradigms
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.