npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

houter

v1.0.10

Published

houter React component

Readme

houter

Travis npm package Coverage Status LICENSE Storybook

A tiny routing solution inspired by wouter and React Route for React App .

Install

npm install houter

Get started

Check out this demo app below in order to get started:

import { BrowserRouter, Route } from 'houter';

const App = () => (
  <BrowserRouter>
    <Route path="/" render={() => <div>Home</div>} />
    <Route
      path="/users/:name"
      render={({ match }) => <div>{match.params.name}</div>}
    />
    <Route path="/inbox" component={InboxPage} />
  </BrowserRouter>
);

Core API

Houter has two kinds of APIs:low-level React Hook-based API and more traditional component-based API similar to React Route's one.

The list of method available

Component API:

Hooks API

Component API

<BrowserRouter/>

A <Router> that uses the HTML5 history API (pushState, replaceState and the popstate event) to keep your UI in sync with the URL.

import { BrowserRouter } from 'houter';

<BrowserRouter
  basename={optionalString}
  forceRefresh={optionalBool}
  getUserConfirmation={optionalFunc}
  keyLength={optionalNumber}
>
  <App />
</BrowserRouter>;

props:

basename: string

If all the URLs in your app are relative to some other "base" URL, use the basename option. This option transparently adds the given string to the front of all URLs you use.

import { BrowserRouter } from 'houter';

<BrowserRouter basename="/abc" />;

history.listen(location => {
  console.log(location.pathname); // /home
});

history.push('/home'); // URL is now /abc/home

forceRefresh: boolean

If true the router will use full page refreshes on page navigation. You probably only want this in browsers that don’t support the HTML5 history API.

getUserConfirmation:function

A function to use to confirm navigation with the user.

import { BrowserRouter } from 'houter';

<BrowserRouter
  getUserConfirmation={(message, cb) => cb(window.confirm(message))}
/>;

keyLength: number

The length of location.key

More information at createBrowserHistory.

<HashRouter/>

A <Router> that uses the hash portion(window.location.hash) to keep your UI in sync with the URL.

import { HashRouter } from 'houter';

<HashRouter
  basename={optionalString}
  hashType={optionalString}
  getUserConfirmation={optionalFunc}
/>;

basename:string

The base URL for all locations. A properly formatted basename should have a leading slash, but no trailing slash.

hashType:string

By default <HashRouter/> uses a leading slash in hash-based URLs. You can use the hashType option to use a different hash formatting.

<HashRouter
  hashType="slash" // the default
/>;

history.push('/home'); // window.location.hash is #/home

<HashRouter
  hashType="noslash" //Omit the leading slash
/>;

history.push('/home'); // window.location.hash is #home

<HashRouter
  hashType="hashbang" //Google's legacy AJAX URL format
/>;
history.push('/home'); // window.location.hash is #!/home

More infomation at createHashHitory.

<Router/>

The common low-level interface for all router components.The most common use-case for using the low-level <Router> is to synchronize a custom history with a state management lib like Redux or Mobx,or using the history instance outside the React App.

import {creteBrowserHistory,createHashHistory} from 'history'

const hashHistory = createHashHistory();
const browserHistory = createBrowserHistory();
//Using in modern web browsers that support the HTML5 history API.
<Router
  history={browserHistory}
>
  <App/>
</Router>
//Using in legacy web browsers.
<Router
  history={hashHistory}
>
 <App/>
</Router>

More information at history

<Route/>

<Route/> is a component rendered some UI when a location matches it's path.

Route render methods:

Houter provides multipile ways to render something with <Route/>:

import { BrowserRouter } from 'houter';

const App = () => {
  return (
    <BrowserRouter>
      <Route
        path="/"
        exact
        render={({ location, match, history }) => <div>Home</div>}
      />
      <Route path="/foo" component={Foo} />
      <Route
        path="/boo"
        children={({ location, match, history }) => <div>boo</div>}
      />
    </BrowserRouter>
  );
};

Route props:

All three render methods will be passed the same three route props:

Props:

path:string|string[]

Any valid URL path or arrays of paths that path-to-regexp@^3.0.0 understands.

Route always match without a path.

component:ReactComponent

A React component to be rendered when current location matches the route's path.It will be rendered with route props.

render:function

Inline rendering and wrapping without the undesired remounting explained above.

Warining:if you using component and render both in the same <Route/>,the component prop will takes precedence over render.

children:function|ReactElement

<Route/> always rendering the children whether the current location matches route's path or not.

exact:boolean

When true the regexp will match to the end of the string.(default: false)

| path | location.pathname | exact | maches | | ---- | ----------------- | ----- | ------ | | /boo | /boo/foo | true | false | | /boo | /boo/foo | false | true |

strict:boolean

When true the regexp allows an optional trailing delimiter to match. (default: false)

| path | location.pathname | strict | maches | | ----- | ----------------- | ------ | ------ | | /boo/ | /boo | true | false | | /boo/ | /boo | false | true |

sensitive:boolean

When true the regexp will be case sensitive. (default: false)

| path | location.pathname | sensitive | maches | | ----- | ----------------- | --------- | ------ | | /BOO/ | /boo | true | false | | /boo/ | /boo | true | true | | /Boo/ | /boo | false | true |

location:object

<Switch/>

<Switch/> always render the first matched <Route/> component.

See the differences between these two demo below:

import { Switch, Route } from 'houter';

const App = () => {
  return (
    <Switch>
      <Route path="/" component={Home} />
      <Route path="/foo" component={Foo} />
      <Route path="/boo" component={Boo} />
    </Switch>
  );
};

location.pathname = '/';
//Render <Home/>
location.pathname = '/foo';
//Render <Home/>
location.pathname = '/boo';
//Render <Home/>
import { Switch, Route } from 'houter';

const App = () => {
  return (
    <Switch>
      <Route path="/foo" component={Foo} />
      <Route path="/boo" component={Boo} />
      <Route path="/" component={Home} />
    </Switch>
  );
};

location.pathname = '/';
//Render <Home/>
location.pathname = '/foo';
//Render <Foo/>
location.pathname = '/boo';
//Render <Boo/>

<Link/>

<Link/> component renders an <a /> element that, when clicked, performs a navigation. You can customize the link appearance by providing your own component or link element as children:

import { Link } from "houter";
// It will produce the ReactElement like
//`<a href="/" onClick={()=>history.push('/)}>Hello!</a>`
<Link to="/">
  <a>Hello!</a>
</Link>

// It will produce the ReactElement like
//`<a href="/" onClick={()=>history.push('/)}></a>`
<Link to="/">
</Link>

// It will produce the ReactElement like
//<a href="/" onClick={()=>history.push('/)}>
//  <div>Hello!</div>
//  <span>Welcome!</span>
//</a>`
<Link to="/">
  <div>Hello!</div>
  <span>Welcome!</span>
</Link>

// It will produce the ReactElement like
//<App href="/" onClick={()=>history.push('/)}>Hello!</div>
<Link to="/">
  <App>Hello!</App>
</Link>

<Redirect/>

<Redirect/> will performing a redirect to a path provided when mounted. Witout a provided path, <Redirect/> will doing nothing when mounted.

import { Redirect } from 'houter';
//It will redirect to '/foo'  when mounted.
<Redirect path="/foo" />;

location

A Location represents where the app now,where the app want to go,or where the app it was.

It looks like this:

{
  key:"ac3df4",
  pathname:'/',
  search:'?a=b&c=d',
  hash:"#",
  state:{
    [key]:value
  }
}

The route will provide location object in a few places:

match

A Match object represents how a <Route/> matched the current URL.

It contains these properties below:

type match = {
  isExact: boolean;
  params: {
    [key]: value;
  };
  path: string;
  url: string;
};

The list of ways obtaining match object:

history

A History object offers a set of methods to perform navigation,it refers to the history package.

See more infomations at history.

Hooks API

React's new "Hooks" APIs give function components the ability to use local component state, execute side effects, and more.

useRouter:

The useRouter hooks let you have access to the lastest history object and the closest <Route/>'s match object.

const { location, match, history } = useRouter();

useRoute:

The useRoute hook make accessing router directly easier . You can check if particular route matches th current location by using an useRoute hook .

useRoute(
  options:string|string[]|{
    path?:string|string[],
    exact?:boolean,
    sensitive?:boolean,
    strict?:boolean
  }={}, location?:object);
import { useRoute, BrowserRouter } from 'houter';

const CustomizeRoute = () => {
  //You can pass any valid URL path or array of paths.
  const { match, location, history } = useRoute('/foo/:boo');
  const { match, location, history } = useRoute(['/foo/:boo']);
  // or passing an object with specific config.
  const { match, location, history } = useRoute({
    path: '/foo/:boo', // or ["/foo/:boo",'/',...And any valid URL path you want to be matched]
    strict: false,
    sensitive: false,
    exact: false
  });

  return (
    <div onClick={() => history.push('/')}>
      Location:{location.pathname}
      params:{match.params.boo}
    </div>
  );
};

useLocation

You can get access to the location object’s properties and performing a navigation via the useLocation hook.

const App = () => {
  const [location, push, replace] = useLocation();
  return <div onClick={() => push('/')}>go to Home</div>;
};

License

houter is MIT licensed