The UJS pattern that Rails has (had? The Rails JS & documentation story is messy) is arguably the best bridge that’s been implemented between client & server.
It can be rigged up with basic data attributes, it is powered by the browser’s native event-handling. That makes it easy to extend/customize, it doesn’t get in your way, and there isn’t a deadly tight coupling between the client & server codebases