For SPAs I still use Backbone.js... Yes, I know, 2014 called and it wants its framework back. But... I like it. It's lightweight and doesn't impose any particular style or philosophy. It's well suited to small projects.
On the back end, for small projects, using a full-fledged framework is usually overkill. Writing a simple API that reads and write normalized data is quite trivial, and when one is writing everything it's easier to understand what's going on.
By this I mean that some behaviors come from the framework and can sometimes surprise you. For example, in Backbone, change events on the model are triggered not when an instance is updated, but only if the new version is different from the old. This makes sense, but the problem is that the comparison is only done on a shallow level. When updating deep properties, no change event is triggered. This took me some time to figure out.
Light frameworks have fewer unexpected behaviors, by virtue of being small.