I've always favored express.js style routes. Simple, pragmatic, flexible, and run in the order in which they are declared. Internally they are just represented as an array of regex's.
For client side routing, I use page (https://www.npmjs.com/package/page), which is a tiny client-side router that supports pushState and has an almost identical API as express.
There are lots of people and frameworks who try to overcomplicate this problem when its really just another pattern of inversion of control.