• Stars
    star
    332
  • Rank 126,957 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 10 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

👓 composable trie based router

wayfarer stability

npm version build status test coverage downloads js-standard-style

Composable trie based router. It's faster than traditional, linear, regular expression-matching routers, although insignficantly, and scales with the number of routes.

If you're looking for a client-side router check out sheet-router. If you're looking for a server router check out server-router.

features

  • works with any framework
  • built for speed
  • minimal dependencies
  • extensible

Installation

$ npm install wayfarer

Usage

var wayfarer = require('wayfarer')

var router = wayfarer('/404')

router.on('/', () => console.log('/'))
router.on('/404', () => console.log('404 not found'))
router.on('/:user', (params) => console.log('user is %s', params.user))
router.on('/wildcard/*', (params) => console.log('wildcard path is %s', params.wildcard))

router('tobi')
// => 'user is tobi'

router('/uh/oh')
// => '404 not found'

router('/wildcard/example/path')
// => 'wildcard path is example/path'

Subrouting

Routers can be infinitely nested, allowing routing to be scoped per view. Matched params are passed into subrouters. Nested routes will call their parent's default handler if no path matches.

var r1 = wayfarer()
var r2 = wayfarer()

r2.on('/child', () => console.log('subrouter trix!'))
r1.on('/:parent', r2)

r1('/dada/child')
// => 'subrouter trix!'

Walk

Sometimes it's necessary to walk the trie to apply transformations.

var walk = require('wayfarer/walk')
var wayfarer = require('wayfarer')

var router = wayfarer()
router.on('/multiply', (x, y) => x * y)
router.on('/divide', (x, y) => x / y)

walk(router, (route, cb) => {
  var y = 2
  return function (params, x) {
    return cb(x, y)
  }
})

router('/multiply', 4)
// => 8
router('/divide', 8)
// => 4

API

router = wayfarer(default)

Initialize a router with a default route. Doesn't ignore querystrings and hashes.

router.on(route, cb(params, [arg1, ...]))

Register a new route. The order in which routes are registered does not matter. Routes can register multiple callbacks. The callback can return values when called.

matchedRoute = router.match(route)

Matches a route and returns an object. The returned object contains the properties {cb, params, route}. This method does not invoke the callback of a route. If no route matches, the default route will be returned. If no default route matches, an error will be thrown.

val = router(route, [arg1, ...])

Match a route and execute the corresponding callback. Alias: router.emit(). Returns a values from the matched route (e.g. useful for streams). Any additional values will be passed to the matched route.

Internals

Wayfarer is built on an internal trie structure. If you want to build a router using this trie structure it can be accessed through require('wayfarer/trie'). It exposes the following methods:

  • trie = Trie() - create a new trie
  • node = trie.create(route) - create a node at a path, and return a node
  • node = trie.match(route) - match a route on the the trie and return a node
  • trie.mount(path, trie) - mount a trie onto a node at route

Known issues

multiple nested partials don't match

E.g. /:foo/:bar/:baz won't work. This is due Trie.mount() overriding child partial paths when mounted. I'll get around to fixing this at some point in the future, but if anyone wants to contribute a patch it'd most appreciated.

FAQ

Why did you build this?

Routers like react-router are complicated solutions for a simple problem. In reality all that's needed is a methodless router that can define + match paths and can mount other routers to delegate requests.

Why isn't my route matching?

Wayfarer only compares strings. Before you pass in an url you probably want to strip it of querystrings and hashes using the pathname-match module.

See Also

License

MIT

More Repositories

1

choo

🚂🚋 - sturdy 4kb frontend framework
JavaScript
6,776
star
2

bankai

🚉 - friendly web compiler
JavaScript
1,088
star
3

hyperx

🏷 - tagged template string virtual dom builder
JavaScript
1,010
star
4

nanomorph

🚅 - Hyper fast diffing algorithm for real DOM nodes
JavaScript
726
star
5

nanohtml

🐉 HTML template strings for the Browser with support for Server Side Rendering in Node.
JavaScript
687
star
6

nanographql

Tiny graphQL client library
JavaScript
421
star
7

nanocomponent

🚃 - create performant HTML components
JavaScript
366
star
8

choo-handbook

🚂✋📖 - Learn the choo framework through a set of exercises
HTML
268
star
9

nanobus

🚎 - Tiny message bus
JavaScript
225
star
10

awesome-choo

🌅 Awesome things related with choo framework
197
star
11

create-choo-app

🚞 - create a fresh choo application
JavaScript
181
star
12

nanostate

🚦- Small Finite State Machines
JavaScript
170
star
13

nanorouter

🛤 - Small frontend router
JavaScript
116
star
14

nanocomponent-adapters

🔌 - Convert a nanocomponent to a component for your favourite API or library (web components, (p)react, angular)
JavaScript
96
star
15

choop

🚂⚛️ - choo architecture for preact
JavaScript
93
star
16

on-idle

😴 - Detect when the browser is idle
JavaScript
82
star
17

nanologger

📜 - Cute browser logs
JavaScript
80
star
18

nanoanimation

👨‍🎨 - Safety wrapper around the Web Animation API
JavaScript
72
star
19

nanoraf

🎞 - Only call RAF when needed
JavaScript
71
star
20

choo-devtools

💼 - Expose a choo instance on the window
JavaScript
53
star
21

nanoquery

📇 - Tiny querystring module
JavaScript
49
star
22

nanotask

Microtask queue scheduler for the browser
JavaScript
47
star
23

choo-log

📃 - Development logger for choo
JavaScript
47
star
24

nanoscheduler

Schedule work to be completed when the user agent is idle.
JavaScript
46
star
25

website

🚇 - Hyper Train Transfer Protocol (HTTP)
JavaScript
46
star
26

nanohref

⛓ - Tiny href click handler library
JavaScript
41
star
27

nanotick

process.nextTick() batching utility
JavaScript
37
star
28

choo-store

Lightweight state structure for choo apps.
JavaScript
37
star
29

nanotiming

⏲ - Small timing library
JavaScript
35
star
30

create-choo-electron

:electron: - Create a fresh Choo Electron application
JavaScript
29
star
31

object-change-callsite

Determine the callsite of an object change using Proxies
JavaScript
27
star
32

choo-reload

⛽️ - Livereloading package for choo
JavaScript
27
star
33

on-performance

Listen for performance timeline events
JavaScript
26
star
34

nanobeacon

Small navigator.sendBeacon wrapper
JavaScript
25
star
35

choo-service-worker

👷 - Service worker loader for choo
JavaScript
24
star
36

choo-scaffold

🏗 - Scaffold out files for a Choo project
JavaScript
24
star
37

choo-notification

Web Notification plugin for Choo
JavaScript
22
star
38

nanobounce

Smol debounce package
JavaScript
19
star
39

choo-choo

🎓 learn choo from the command line!
JavaScript
19
star
40

nanomount

Mount a DOM tree on a target node
JavaScript
19
star
41

choo-redirect

🎬 - Redirect a view to another view
JavaScript
19
star
42

persist-storage

🗄 - Enable persistent storage in the browser
JavaScript
19
star
43

nanohistory

Small browser history library
JavaScript
14
star
44

choo-hooks

🎣 - Hook into Choo's events and timings
JavaScript
12
star
45

nanolocation

📍- Small window.location library
JavaScript
10
star
46

discuss

🎭 – Discuss project organization, initiatives, and anything else!
8
star
47

nanocache

Cache Nanocomponents.
JavaScript
7
star
48

bankai-website

JavaScript
6
star
49

choo-umd

🙈 - umd build for choo framework
HTML
3
star