Announcing Router Specifically
I recently built a webapp from the “ground up” using nothing but Bootstrap. I used a few utilities from previous projects, like perfget, new standards like es6-promises, and a few gists I needed to prove out.
After shipping the demo app, I looked for other examples of routers. Working without a framework means you need your own router but I wasn’t totally happy with my implementation. I took inspiration from routes which returns an object instead of invoking the handler. I feel like that’s a great touch and works with my new, “less opinionated” philosophy.
However, when I looked at the implementation, routes, like many other routers, naively iterates over the universe of
routes to find a match. I decided that my router would use specificity to match routes and store them as
Object keys for faster access. I came up with an algorithm that turns a route like
'a/b/c' into a series
of predictable paths, each gradually less specific, until a match is found or the final route
'*' fails to match.
This means you get a fast match based purely on distance to a viable match with no penalties for late registration
or having thousands of registered routes.
Just like routes, params use the
/:<name> pattern and wildcards use
/*. Internally, I convert those to
* where the underscore is more specific than the wildcard.
That series looks like this:
_represents a param like
Take it for a spin. Feel free to comment here or in the github issues.