I know this is an older thread now, but I feel its important to mention a few things for newcomers.
First, there seems to be a general consensus that using a framework is how you scale, or keep your code clean, maintainable, etc… This is a fallacy. YOU are responsible for keeping your code clean. Only YOU can prevent dirty/unmaintainable code!
Regardless of project size (referring to scope), a framework is neither good nor bad, it is scaffolding that surrounds an idea, or a design pattern. It can become bad if your project outgrows the capabilities of the framework, or is hindered by it in some way. How easily can you decouple your code from the framework? This is a real issue that comes up in years long projects that chose a framework (with good intentions) to get the project started, and now the framework is getting in the way more than helping. Read → AngularJS. Many projects are still stuck using this old(er) framework because its very deeply integrated into the entire project, it is the foundation of the project. Good luck moving to React or <insert-new-framework-here> without completely starting fresh. I can think of several projects that started completely fresh, only this time, choosing to go with Web Components, or a well documented (w/tests) roll-your-own solution.
Second, its ridiculous to say that if you don’t use a framework, future developers will suffer because there will only be a couple people that truly understand the code. This isn’t for lack of a framework, this is because properly tested and clean code wasn’t the foundation of the project. Tests self-document the code for you! Future developers only need to look at the tests to understand how the code works.
How does this class work? How do I use it?
Oh, the test does it like this. Yup, that worked!
Frameworks deceive us to thinking that you don’t need to test your code. So we skip that part until the end… which means never, because projects never seem to end. Except when they do, and at that point things seem to be working, so why do we need tests?!
Third, Question the de facto standard. Just because everyone uses Express when they need a NodeJS web server doesn’t mean its the right solution. How many lines of code does it take to write a basic web server in JS? If you use the HTTP standard lib, 30-50 lines max? Do you really need Express? Maybe, but don’t default to it. (And yes, I know Express offers a lot more than just a web server, but that’s my point, unless you truly need it, don’t default to it)
Conclusion: Frameworks have their place, BUT don’t pick one until you TRULY need it, and even then, work around that problem, until eventually you have no choice but to return to that original need. Is it something you can solve with vanilla <insert-lang-here>? You may discover that the framework you might have chosen, isn’t the one you’d choose now. Or, better yet, you may discover a framework isn’t really needed at all.