Announcing Router Specifically
Introducing accu-router
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
_ or * where the underscore is more specific than the wildcard.
That series looks like this:
a/b/c- ->
a/b/_(_represents a param like/:id) - ->
a/b/* - ->
a/_/_ - ->
a/_/* - ->
a/* - ->
_/_/_ - ->
_/_/* - ->
_/* - ->
*
Take it for a spin. Feel free to comment here or in the github issues.